原型Html转Vue(详细步骤)
前言:ui原型交互后切图给开发程序员,开发程序员嵌入改造
本文是html页面转vue页面
html的页面构成
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>某某大屏页面</title>
<!--公共的css样式的文件-->
<link rel="stylesheet" href="css/public.css" />
<!--特别的css样式的文件-->
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="bs_wrapper idx_wrapper" id="app">
<div class="bs_header">
<div class="h_time">12:22:05 2024-04-19 星期五</div>
</div>
</div>
<!--jq版本包-->
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<!--对DOM(文档对象模型)元素进行jq操作:里面都是一些操作节点的一系列方法-->
<script type="text/javascript" src="js/index.js"></script>
<script>
<!--dom-->
$(".tab_tit .item ").click(function() {
$(this).addClass("active").siblings().removeClass("active")
})
</script>
</body>
</html>
HTML页面的加载顺序是一个复杂但有序的过程。
以下是HTML页面加载的一般顺序和相关元素的角色:
元素 | 说明 |
---|---|
DOCTYPE声明 | 首先,浏览器会读取DOCTYPE声明,这告诉浏览器文档使用哪种HTML版本 |
HTML | (1)然后,浏览器从<html> 标签开始解析HTML文档(2) html 元素是文档的根元素,包含整个页面的内容。 |
Head | 接着,浏览器会解析<head> 标签内的内容 (1)文档的元数据,如 <title> 、<meta> 标签等。(2)样式表链接( <link rel="stylesheet" ...> ),浏览器会下载并解析这些CSS文件。(3)脚本链接( <script src="..."> ),浏览器会尝试下载并解析这些外部JavaScript文件。但是,如果脚本在<head> 中并且没有设置async 或defer 属性,那么浏览器会等待脚本下载并执行完成后再继续解析HTML。(4)还有其他可能的内容,如 <style> 标签内的CSS样式。 |
Body | 当<head> 解析完成后,浏览器会开始解析<body> 标签内的内容。 (1)浏览器会按照HTML文档中的顺序加载和渲染DOM(文档对象模型)元素。 (2)如果在 <body> 中遇到<script> 标签并且没有设置async 或defer 属性,浏览器会暂停HTML解析,下载并执行JavaScript代码,然后再继续解析HTML。 (3)同时,浏览器会开始加载图片、音频、视频等外部资源。 |
说到DOM(文档对象模型) 就不得不讲一下DOM和CSS/JavaScript的关系的关系
- 浏览器对HTML文档的解析结果为DOM
- CSS用于描述DOM元素的样式和布局
- JavaScript可以修改DOM结构、样式和行为。它最好在DOM加载完成后执行,
了确保 JavaScript 行为能够正确地与 DOM 交互并提供良好的用户体验和性能,通常建议在 DOM 加载完成后执行这些行为。
说到JavaScript 就不得不讲一下jQuery的加载
- jQuery是一个流行的JavaScript库,它简化了JavaScript编程的复杂性。
- 如果在HTML文档中使用jQuery,通常需要将jQuery库文件(如
jquery.min.js
)通过<script>
标签引入。 - jQuery的加载和执行顺序取决于
<script>
标签在HTML文档中的位置和属性设置。 - 如果将jQuery库文件放在
<head>
中,并且没有设置async
或defer
属性,那么浏览器会等待jQuery库文件下载并执行完成后再继续解析HTML。 - 如果将jQuery库文件放在
<body>
的底部,或者设置了async
或defer
属性,那么浏览器可以在下载和执行jQuery库文件的同时继续解析和渲染HTML。 - jQuery的
$(document).ready()
函数用于在DOM加载完成后执行JavaScript代码。
这意味着即使jQuery库文件在<head>
中加载,使用$(document).ready()
包裹的代码也会在DOM加载完成后才执行。
总结:HTML页面的加载顺序是从上到下,
先解析<head>
再解析<body>
。
DOM是浏览器对HTML文档的解析结果,CSS用于描述DOM元素的样式和布局,
JavaScript(包括jQuery)可以修改DOM结构、样式和行为。
jQuery的加载和执行顺序取决于<script>
标签在HTML文档中的位置和属性设置。
vue的页面构成
<template>
<div class="main">
<h1>{{ message }}</h1>
<button @click="increment">Increment</button>
</div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如工具js:
//import "../../../util/newdp/js/jquery-3.3.1.js";
//import "../../../util/newdp/js/index2.js";
//例如导组件:
//import 《组件名称》 from '《组件路径》';
export default {
//import引入的组件需要注入到对象中才能使用
components: {
//如果有导入组件的话,需要在这里进行注入
},
data() {
//这里存放数据
return {
//这个没问题吧,很容易想到
message: 'Hello Vue!',
counter: 0
};
},
//监听属性 类似于data概念
computed: {},
//监控data中的数据变化
watch: {},
//方法集合
methods: {
increment() {
this.counter++;
}
},
//生命周期 - 创建完成(可以访问当前this实例)
created() {},
//生命周期 - 挂载完成(可以访问DOM元素)
mounted() {
},
//生命周期 - 创建之前
beforeCreate() {},
//生命周期 - 挂载之前
beforeMount() {},
//生命周期 - 更新之前
beforeUpdate() {},
//生命周期 - 更新之后
updated() {},
//生命周期 - 销毁之前
beforeDestroy() {},
//生命周期 - 销毁完成
destroyed() {},
//如果页面有keep-alive缓存功能,这个函数会触发
activated() {},
};
</script>
<style lang="scss" scoped>
/*@import url(); 引入公共css类*/
.main {
height: 100vh;
}
</style>
Vue.js 是一个构建用户界面的渐进式框架。在 Vue 中,一个页面(或称为组件)的组成结构通常可以分为以下几个部分:
-
模板 (Template)
- 模板定义了组件的 HTML 结构。
- 在这里,你可以使用 Vue 的模板语法来绑定数据、监听事件、渲染列表等。
- 模板通常写在
.vue
文件的<template>
标签内。
-
脚本 (Script)
- 脚本部分包含了组件的逻辑,如数据、方法、计算属性、生命周期钩子等。
- 使用 ES6 语法(或 TypeScript)编写。
- 通常写在
.vue
文件的<script>
标签内。
-
样式 (Style)
- 样式定义了组件的外观和布局。
- 可以使用普通的 CSS、预处理器(如 Sass、Less、Stylus)或 CSS-in-JS 库(如 styled-components)。
- 样式通常写在
.vue
文件的<style>
标签内,可以使用scoped
或module
属性来确保样式只作用于当前组件。
结构名称 | 说明 |
---|---|
模板 (Template) | 模板定义了组件的 HTML 结构。 (1)在这里,你可以使用 Vue 的模板语法来绑定数据、监听事件、渲染列表等。 (2)模板通常写在 .vue 文件的 <template> 标签内。 |
脚本 (Script) | 脚本部分包含了组件的逻辑,如数据、方法、计算属性、生命周期钩子等。 (1)使用 ES6 语法(或 TypeScript)编写。 (2)通常写在 .vue 文件的 <script> 标签内。 |
样式 (Style) | 样式定义了组件的外观和布局。 (1)可以使用普通的 CSS、预处理器(如 Sass、Less、Stylus)或 CSS-in-JS 库(如 styled-components)。 (2)样式通常写在 .vue 文件的 <style> 标签内,可以使用 scoped 或 module 属性来确保样式只作用于当前组件。 |
顺便说一下vue生命周期
的顺序步骤 (从先到后)
结构名称 | 说明 |
---|---|
beforeCreate | (1)在实例初始化之后,数据观测 (data observer) 和事件/侦听器 (event/watcher) 设置之前被调用。 (2) 此时 data 、computed 、methods 和 watch 还未被初始化,无法访问它们。 |
created | (1)在实例创建完成后被立即调用。在这一步,实例已完成以下的配置: 数据观测 (data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始, $el 属性目前不可见。(2)此时可以访问 data 、computed 中的属性和 methods 中的方法,但无法访问 DOM。 |
beforeMount | (1)在挂载开始之前被调用:相关的 render 函数首次被调用(2)此时 el 和 $el 都尚未被创建,但你可以修改 data 中的数据,这些修改在 mounted 时会触发视图更新。 |
mounted | (1)el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个 in-document 元素,当 mounted 被调用时 vm.$el 也在文档内。(2)此时可以访问 DOM,并进行相关的 DOM 操作。 |
beforeUpdate | (1)数据更新时调用,发生在虚拟 DOM 打补丁之前。可以在这个钩子中访问现有的 DOM,比如手动移除已添加的事件监听器。 (2)这个阶段不适合进行 DOM 操作,因为此时的 DOM 还未更新到最新状态。 |
updated | (1)由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。 (2)当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。 |
beforeDestroy | (1)实例销毁之前调用。在这一步,实例仍然完全可用。 (2) 在这个阶段, this 仍然完全可用,你可以清理定时器、移除事件监听器、解绑全局事件、销毁插件对象等操作。 |
destroyed | (1) Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑,所有的事件监听器会被移除,所有的子实例也都会被销毁。 (2)此时组件实例上的所有东西都已经解绑了,它们将不会再触发任何 Vue 的响应式系统。 |
activated | (1)被 keep-alive 缓存的组件激活时调用。(2)该钩子在服务器端渲染期间不被调用。 |
deactivated | (1) 被 keep-alive 缓存的组件停用时调用。(2) 该钩子在服务器端渲染期间不被调用。 |
注意,当组件被 <keep-alive>
包裹时,activated
和 deactivated
这两个生命周期钩子会被触发,
而不是 mounted
和 destroyed
。
这是因为 <keep-alive>
会缓存组件实例,而不是销毁并重新创建它们。
开始转(可直接看这个)
步骤如下
(1)html的<body>转为vue里面的 <template>
(2)html的 js文件 的引入方式
(3)html的 css文件的引入方式
举例
html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>某某大屏页面</title>
<!--公共的css样式的文件-->
<link rel="stylesheet" href="css/public.css" />
<!--特别的css样式的文件-->
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="bs_wrapper idx_wrapper" id="app">
<div class="bs_header">
<div class="h_time">12:22:05 2024-04-19 星期五</div>
</div>
</div>
<!--jq版本包-->
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<!--对DOM(文档对象模型)元素进行jq操作:里面都是一些操作节点的一系列方法-->
<script type="text/javascript" src="js/index.js"></script>
<script>
<!--dom-->
$(".tab_tit .item ").click(function() {
$(this).addClass("active").siblings().removeClass("active")
})
</script>
</body>
</html>
vue页面 (最终版)
里面涉及的引入路径一定要 './'或者 '../' 开头的,不然会找不到,切记
<template>
<div style="overflow: scroll;height: 100vh;">
<div class="bs_wrapper idx_wrapper" id="app">
<div class="bs_header">
<div class="h_time">12:22:05 2024-04-19 星期五</div>
</div>
</div>
</div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
import "../../../util/newdp/js/jquery-3.3.1.js"
import {
operation1,
operation2,
operation3,
operation4,
operation5,
operation6,
operation7} from "../../../util/newdp/js/index.js"
export default {
//import引入的组件需要注入到对象中才能使用
components: {},
data() {
//这里存放数据
return {};
},
//监听属性 类似于data概念
computed: {},
//监控data中的数据变化
watch: {},
//方法集合
methods: {
jumpUrlDP(type) {
this.$router.push(type);
}
},
//生命周期 - 创建完成(可以访问当前this实例)
created() {
},
//生命周期 - 挂载完成(可以访问DOM元素)
mounted() {
// 在组件的DOM元素挂载到页面之后执行这些操作
console.log("政策概况--mounted()");
operation1();
operation2();
operation3();
operation4();
operation5();
operation6();
operation7();
},
//生命周期 - 创建之前
beforeCreate() {},
//生命周期 - 挂载之前
beforeMount() {},
//生命周期 - 更新之前
beforeUpdate() {},
//生命周期 - 更新之后
updated() {},
//生命周期 - 销毁之前
beforeDestroy() {},
//生命周期 - 销毁完成
destroyed() {},
//如果页面有keep-alive缓存功能,这个函数会触发
activated() {},
};
</script>
<style lang="scss" scoped>
/*@import url(); 引入公共css类*/
@import "../../../util/newdp/css/public.css";
@import "../../../util/newdp/css/style.css";
</style>
扩展css细节点
(1)scoped 表示只有当前页面受到影响
(2)实现穿透作用域操作的符号(/deep/ 和::v-deep 和>>>)
在项目中为了避免页面间样式污染常用scoped组件私有化,
如果要改变element-ui的样式时需要用样式穿透才可复写样式。
场景 | 语法(穿透符号) | 说明 |
---|---|---|
使用的是css 原生样式 | >>> | 只作用于css,对于less和scss不起作用,如果是less和scss的话需要用到/deep/或::v-deep |
vue1、vue2 (使用了lang=“scss” 或者 lang=“less”) | /deep/ | |
vue3.0之后 (使用了lang=“scss” 或者 lang=“less”) | ::v-deep |
遇到的问题
为什么我这边的index.js
没有使用(import “…/…/…/util/newdp/js/index.js”)直接引入原因如下
(1) ui原型的JQ操作的js文件(也就是index.js
)里面的写法一般为直接dom操作,如下示例
//地图浮框效果
$("#mapSvg>g>g,#mapWrap .point_wrap_box .point_wrap").mouseover(function(ev) {
var ev = ev || event;
$("#mapPop").show();
$("#mapPop").css({
left: ev.clientX + 20,
top: ev.clientY
});
});
// 读取区块名字
$("#mapSvg>g>g").mouseover(function(ev) {
var citytext = $(this).find("text").data("name")
$(".map_pop_tit").text(citytext)
});
初步的引入方式如下:
<script>
import "../../../util/newdp/js/index.js", // 引入文件
export default {
name: 'MyComponent',
// ... 其他选项
}
</script>
结果 dom 操作无效
该方式会面临在vue里面全部失效的情况(原因:DOM 未加载完成,无法使用相关的DOM操作)
最开始我从网上看到可以使用 $(document).ready()
去实现(让dom先加载完全,在执行相关dom操作)
index.js
修改如下
将其jQuery操作 变成方法 且 使用
$(document).ready()
// jq-operations.js
function operation1() {
// jQuery操作1
$("#mapSvg>g>g,#mapWrap .point_wrap_box .point_wrap").mouseover(function(ev) {
var ev = ev || event;
$("#mapPop").show();
$("#mapPop").css({
left: ev.clientX + 20,
top: ev.clientY
});
});
}
function operation2() {
// jQuery操作2
// 读取区块名字
$("#mapSvg>g>g").mouseover(function(ev) {
var citytext = $(this).find("text").data("name")
$(".map_pop_tit").text(citytext)
});
}
// ... 其他操作函数
// 在文件末尾调用这些函数
$(document).ready(function() {
operation1();
operation2();
// ... 调用其他操作函数
});
修改的引入方式如下
<script>
import "../../../util/newdp/js/index.js", // 引入文件
export default {
name: 'MyComponent',
// ... 其他选项
}
</script>
结果没什么用!!!(可能这一块的操作还是属于html那边的,我们要的是vue)
后续改成
index.js
修改如下
将其jQuery操作 变成方法 且 export 导出
export function operation1() {
// jQuery操作1
$("#mapSvg>g>g,#mapWrap .point_wrap_box .point_wrap").mouseover(function(ev) {
var ev = ev || event;
$("#mapPop").show();
$("#mapPop").css({
left: ev.clientX + 20,
top: ev.clientY
});
});
}
export function operation2() {
// jQuery操作2
// 读取区块名字
$("#mapSvg>g>g").mouseover(function(ev) {
var citytext = $(this).find("text").data("name")
$(".map_pop_tit").text(citytext)
});
}
// ... 其他操作函数
修改引入方式如下,同时需要交给vue页面的生命周期 mounted() 去触发 那些 dom操作
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
import "../../../util/newdp/js/jquery-3.3.1.js"
import {
operation1,
operation2
} from "../../../util/newdp/js/index.js"
export default {
//import引入的组件需要注入到对象中才能使用
components: {},
data() {
//这里存放数据
return {};
},
//监听属性 类似于data概念
computed: {},
//监控data中的数据变化
watch: {},
//方法集合
methods: {
jumpUrlDP(type) {
this.$router.push(type);
}
},
//生命周期 - 创建完成(可以访问当前this实例)
created() {
},
//生命周期 - 挂载完成(可以访问DOM元素)
mounted() {
// 在组件的DOM元素挂载到页面之后执行这些操作
console.log("政策概况--mounted()");
operation1();
operation2();
},
//生命周期 - 创建之前
beforeCreate() {},
//生命周期 - 挂载之前
beforeMount() {},
//生命周期 - 更新之前
beforeUpdate() {},
//生命周期 - 更新之后
updated() {},
//生命周期 - 销毁之前
beforeDestroy() {},
//生命周期 - 销毁完成
destroyed() {},
//如果页面有keep-alive缓存功能,这个函数会触发
activated() {},
};
</script>
最终 那些dom操作 成功的生效了!!!