目录
1.什么是Vue
2.vue的设计思想MVVM
2.1快速入门抓包处理
2.2注意事项及其说明
3.数据单/双向渲染技术
3.1数据单向渲染
3.2数据双向渲染
3.2.1数据双向渲染练习题
4.事件绑定机制
4.1演示案例
4.2抓包处理
4.3注意事项
4.4事件绑定机制的练习题
5.修饰符
6.条件渲染(v-if/v-else-if/v-else/v-show)
6,1 用例题帮大家理解
6.2 v-if 和v-else的区别
6.3 相关案例练习(有兴趣可以试试看)
7.列表渲染 (v-for)
7,1 列表渲染相关方法
7.2列表渲染应用实例
8.组件化编程
8.1 全局组件
编辑
8.2局部组件
8.3注意事项
9.生命周期和钩子函数
对重要阶段的钩子函数进行案例分析
10.vue Cli脚手架模块化开发
10.1用webpack来创建vue Cli脚手架项目
编辑10.2 Vue Cli中项目结构的分析 (如图所示)
!!!10.3Vue请求页面的执行流程
11. vue-ElementUI
11.1安装Element-ui的指令
10.2初步使用Element-UI应用实例
希望小伙伴多多关注!
本文章-由韩顺平教育视频学习所得。供大家一起学习进步 !
1.什么是Vue
就是渐进式的JavaScript!
1. Vue(读音/vju:/,类似于 view)是一个前端框架,易于构建用户界面。
2.Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或项目整合。
3.支持和其它类库结合使用。
4.开发复杂的单页应用非常方便。
5.Vue是Vue.js的简称。
官网文档:https://cn.vuejs.org/v2/guide/index.html
Git下载 : https://cn.vuejs.org/v2/guide/installation.html2.vue的设计思想MVVM
-M∶即Model,模型,包括数据和一些基本操作
-V:即View,视图,页面渲染结果
·VM∶即View-Model,模型与视图间的双向操作(无需开发人员干涉)
在MVVM之前,开发人员从后端获取需要的数据模型,然后要通过DOM操作 Model 渲染到View中。而后当用户操作视图,我们还需要通过DOM获取View中的数据, 然后同步到Model中。
-而MVM中的VM要做的事情就是把DOM操作完封装起来,开发人员不用再关心 Model和View之间是如何互相影响的
-只要我们Model发生了改变,View上自然就会表现出来
-用户修改了View,Model中的数据也会跟着改变。。
·结果:把开发人员从繁琐的DOM操作中解放出来,把关注点放在如何操作Model上,大大提高开发效率
实现的数据和显示分离的技术,比JQuery更加的简洁!
2.1快速入门抓包处理
代码演示:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue快速入门</title> </head> <body> <!-- 1. div元素不是必须的,也可以是其它元素,比如span,但是约定都是将vue实例挂载到div 2. 因为div更加适合做布局 3. id 不是必须为app , 是程序员指定,一般我们就使用app --> <div id="app"> <!-- 1. {{message}} : 插值表达式 2. message 就是从model的data数据池来设置 3. 当我们的代码执行时,会到data{} 数据池中去匹配数据, 如果匹配上, 就进行替换 , 如果没有匹配上, 就是输出空 --> <h1>欢迎你{{message}}-{{name}}</h1> </div> <!--引入vue.js--> <script src="vue.js"></script> <script> //创建Vue对象 /** * 1. 创建Vue对象实例 * 2. 我们在控制台输出vm对象,看看该对象的结构!(data/listeners) * */ let vm = new Vue({ el: "#app", //创建的vue实例挂载到 id=app的div data: { //data{} 表示数据池(model的有了数据), 有很多数据 ,以k-v形式设置(根据业务需要来设置) message: "Hello-Vue!", name: "小明" } }) console.log("vm=>", vm); console.log(vm._data.message); console.log(vm._data.name); console.log(vm.name); console.log(vm.message); </script> </body> </html>
复制
结果展示:
抓包分析:
改变Model的数据改变可直接修改前端
2.2注意事项及其说明
1. div元素不是必须的,也可以是其它元素,比如span,但是约定都是将vue实例挂载到div。
2. 因为div更加适合做布局容器。
3. id 不是必须为app , 是程序员指定,一般我们就使用app
4.注意代码的顺序,我们要求div在前,script在后,否则无法进行一个绑定。
5.Vue.js采用简洁的模板语法来声明式地将数据渲染进 DOM的系统,做到数据和显示分离
6. Vue没有繁琐的 DOM操作,如果使用jQuery,我们需要先找到 div节点,获取到 DOM 对象,然后进行节点操作,显然Vue更加简洁
3.数据单/双向渲染技术
1. v-bind是数据单向渲染: data数据池绑定的数据变化,会影响view
2. v-model指令 是数据的双向渲染,
(1)data数据池绑定的数据变化,会影响view 【底层的机制是 Data Bindings】
(2)view 关联的的元素值变化, 会影响到data数据池的数据【底层机制是Dom Listeners】
3.1数据单向渲染
1.v-bind指令可以用来绑定元素的属性
2.v-bind指令可以完成基本的数据渲染和绑定
3.v-bind指令的简写形式就是一个冒号(:)
举例:
<!DOCTYPE html> <head xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <meta charset="UTF-8"> <title>单向数据渲染</title> </head> <body> <div id="app"> <h1>{{message}}</h1> <!-- 1. 使用插值表达式引用 data数据池数据是在标签体内 2. 如果是在标签/元素 的属性上去引用data数据池数据时,不能使用插值表达式 3. 需要使用v-bind, 因为v-bind是vue来解析, 默认报红,但是不影响解析 4. 如果不希望看到报红, 直接 alt+enter 引入 xmlns:v-bind --> <!--<img src="{{img_src}}">--> <img v-bind:src="img_src" v-bind:width="img_width"> <img :src="img_src" :width="img_width"> </div> <script src="vue.js"></script> <script> let vm = new Vue({ el: "#app", //创建的vue实例挂载到 id=app的div data: { //data{} 表示数据池(model的有了数据), 有很多数据 ,以k-v形式设置(根据业务需要来设置) message: "hello, 你好呀", img_src: "1.jpg", img_width: "200px" } }) console.log("vm=>", vm); </script> </body> </html>
复制
前端结果展示:
3.2数据双向渲染
代码展示:
<!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>双向数据渲染</title> </head> <body> <div id="app"> <h1>{{message}}</h1> <!-- 1. v-bind是数据单向渲染: data数据池绑定的数据变化,会影响view 2. v-model="hobby.val" 是数据的双向渲染, (1)data数据池绑定的数据变化,会影响view 【底层的机制是 Data Bindings】 (2)view 关联的的元素值变化, 会影响到data数据池的数据【底层机制是Dom Listeners】 --> <input type="text" v-model="hobby.val"><br/><br/> <input type="text" :value="hobby.val"><br/><br/> <p>你输入的爱好是: {{hobby.val}}</p> </div> <script src="vue.js"></script> <script> let vm = new Vue({ el: "#app", //创建的vue实例挂载到 id=app的div data: { //data{} 表示数据池(model的有了数据), 有很多数据 ,以k-v形式设置(根据业务需要来设置) message: "hi, 输入你的爱好", hobby: { val: "吃饭" } } }) console.log("vm=>", vm); </script> </body> </html>
复制
3.2.1数据双向渲染练习题
要求:当在输入框中输入1.jpg/2.jpg/3.jpg的时候会显示不同的图片,用到数据绑定机制来实现
代码展示
<!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>数据双向绑定机制练习题</title> <script src="vue.js"></script> </head> <body> <div id="app"> 请输入图片编号:<input type="text" v-model="id"><br> <img v-bind:src="id"> </div> <script> let vm = new Vue({ el:"#app", data:{ id:"1.jpg" } }) </script> </body> </html>
复制
4.事件绑定机制
使用v-on进行事件处理,比:v-on:click表示处理鼠标点击事件。
事件调用的方法定义在vue对象声明的 methods节点中。
v-on:事件名可以绑定指定事件。
4.1演示案例
要求点击不同按钮,在控制台输出不同的信息 ,如下图
代码展示:
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>事件处理</title> </head> <body> <!--视图--> <div id="app"> <h1>{{message}}</h1> <!-- 1. v-on:click 表示我们要给button元素绑定一个click的事件 2. sayHi() 表示绑定的方法, 在方法池 methods{} 定义的 3. 底层仍然是dom处理 4. 如果方法不需要传递参数,可以省略() 5. v-on:click可以简写@, 但是需要浏览器支持 --> <button v-on:click="sayHi()">点击输出</button> <button v-on:click="sayOk()">点击输出</button> <button v-on:click="sayHi">点击输出</button> <button @click="sayOk">点击输出</button> </div> <!--引入我们的vue.js--> <script src="vue.js"></script> <!--创建一个vue实例,并挂载到id=app的div--> <script> //这里创建的Vue实例, 你可以不去接收, 也可以接收 //方便我们调试信息 let vm = new Vue({ el: "#app", //创建的vue实例挂载到 id=app的div, el 就是element的简写 data: { //data{} 表示数据池(model中的数据), 有很多数据 ,以k-v形式设置(根据业务需要来设置) message: "Vue事件处理的案例", name: "小名" }, // // 1. 是一个methods属性, 对应的值是对象{} // 2. 在{} 中, 可以写很多的方法, 你可以这里理解是一个方法池 // 3. 这里需要小伙伴有js的基础=>java web第4章 methods: { sayHi() { console.log("hi, 111"); }, sayOk() { console.log("ok, 222"); } } }) </script> </body> </html>
复制
4.2抓包处理
我们上述案例中通过按钮,可以在控制台输出不同的内容,那么他和我们的传统js编程有什么区别呢?其实不然,他的核心底层依然是用传统的JavaScript实现的,不过不需要我们程序员去操作。下面我带大家去分析抓包处理一下。
控制台输入vm对象,可以看到vm对象的所有内容
4.3注意事项
如果方法没有参数,可以省略()[需要浏览器支持]
v-on指令的写形式@[需要览器支持]
去相应挂载的vue实例下,查看可以绑定的事件
4.4事件绑定机制的练习题
代码展示
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="app"> <button v-on:click="add1()">增加1</button> <button v-on:click="add2()">增加2</button> <h2>你的按钮被点击了{{count}}次了</h2> </div> <script> let vm = new Vue({ el:"#app", data:{ count:0 }, methods:{ add1:function (){ this.count+=1 }, add2(){ this.count+=2 } } }) </script> </body> </html>
复制
题目2:当点击按钮过后,会弹窗出对应的书名:运用到双向绑定。
代码如下:
<!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Vue时间处理2</title> <script src="vue.js"></script> </head> <body> <div id="app"> <h1>{{message}}</h1> <input placeholder="请输入书名" v-model="bookName"> <button v-on:click="show()">显示{{bookName}}</button> </div> <script> let vm = new Vue({ el:"#app", data:{ bookName:"开心超人", message:"Vue的事件绑定" }, methods:{ show(){ alert("显示书名:"+this.bookName); } } }) </script> </body> </html>
复制
5.修饰符
对于事件修饰符的详细信息请按官网查看
1.修饰符(Modifiers)是以(.)指明的后缀,指出某个指令以特殊方式绑定。
2.例如, .prevent修饰符告诉 v-on指令对于触发的事件调用 event.preventDefault()即阻 止事件原本的默认行为
例如:
.stop 组织事件继续传播
.prevent 阻止标签默认行为
.capture 使用事件获模式,即元素自身触发的事件先在此处处理,然后才交由内部元素进 行处理
.self 当在 event.target当前元素自身时触处理函数
.once 事件将会触一次
.passive 告诉浏览器你不想阻止事件的默认行为
案例:
演示 v-on:submit.prevent 的使用, 如果没有输入名字,控制台输出 "请输入名
字",否则输出 "提交表单"
代码展示:
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Vue修饰符使用</title> </head> <body> <div id="app"> <!-- 1. 修饰符用于指出一个指令应该以特殊方式绑定。 2. v-on:submit.prevent的.prevent 修饰符表示阻止表单提交的默认行为 3. 执行 程序员指定的方法 --> <form action="http://www.baidu.com" v-on:submit.prevent="onMySubmit"> 妖怪名: <input type="text" v-model="monster.name"><br/><br/> <button type="submit">注册</button> </form> <p>服务返回的数据是{{count}}</p> <h1>修饰符扩展案例</h1> <button v-on:click.once="onMySubmit">点击一次</button><br/> <input type="text" v-on:keyup.enter="onMySubmit"> <input type="text" v-on:keyup.down="onMySubmit"> <input type="text" v-model.trim="count">//将前后默认的空格拿掉,比较实用 </div> <script src="vue.js"></script> <script> let vm = new Vue({ el: '#app', data: {//数据池 monster: {//monster数据(对象)的属性, 可以动态生成 }, count: 0 }, methods: {//方法池 onMySubmit() { //console.log("我们自己的表单提交处理..."); //"", null, undefined都是false if(this.monster.name) { console.log("提交表单 name=", this.monster.name); //这里,程序员就可以根据自己的业务发出ajax请求到后端 //得到数据后,在进行数据更新 this.count = 666; } else { console.log("请输入名字.."); } } } }) </script> </body> </html>
复制
6.条件渲染(v-if/v-else-if/v-else/v-show)
6,1 用例题帮大家理解
解释一下条件渲染: v-if="awesome" 的时候,会去挂载到这个容器的vue的实例,去对应的数据池里面寻找awesome是否为真,如果为真就会显示h1标签相应的内容。就是我们编程中的if-else语句。
注意!在js中,false的情况有:0 undifine null “” 这些都是为false的情况。
写一个案例:
当点击或不点击复选框的时候,会显示出不同的内容。
代码展示如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>v-if</title> <script src="vue.js"></script> </head> <body> <div id="app"> <input type="checkbox" v-model="sel">是否同意该条款<br> <h1 v-if="sel">同意该条款</h1> <h1 v-else>不同意该条款</h1> </div> <script> let vm = new Vue({ el:"#app", data:{ sel:"fasle" } }) </script> </body> </html>
复制
如果将v-if 用v-show去实现,如下代码所示:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>v-show</title> <script src="vue.js"></script> </head> <body> <div id="app"> <input type="checkbox" v-model="sel">是否同意该条款<br> <h1 v-show="sel">同意该条款</h1> <h1 v-show="!sel">不同意该条款</h1> </div> <script> let vm = new Vue({ el:"#app", data:{ sel:"fasle" } }) </script> </body> </html>
复制
6.2 v-if 和v-else的区别
1、v-if 会确保在切换过程中,条件块内的事件监听器和子组件销毁和重建
2、v-if 会确保在切换过程中,条件块内的事件监听器和子组件销毁和重建
3、使用建议:如果要频繁地切换,建议使用 v-show ;如果运行时条件很少改变,使用 v-if 较好
下面对我们的区别进行抓包的详细解释:
对于v-if是真正的实现组件的销毁和重建,所消耗的性能比较大【只有一个h1标签】
对于v-show 仅仅就是css样式的改变(也可以调用相应的vue实例去看底层的属性,加强理解)
【这里有两个h1标签】
6.3 相关案例练习(有兴趣可以试试看)
输入不同的成绩显示不同的优秀程度,并且当超出输入值的范围,进行文本框中的值进行修改
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>练习题</title> <script src="vue.js"></script> </head> <body> <div id="app"> <h1>{{message}}</h1> 请输入1-100的成绩:<input v-on:blur="s" type="text" v-model="score"><br> <p>您输入的成绩是{{score}}</p> <span v-if="score>=90">优秀</span> <span v-else-if="score>=80">良好</span> <span v-else-if="score>=70">中</span> <span v-else-if="score>=60">及格</span> <span v-else-if="score<60">不及格</span> </div> <script> let vm = new Vue({ el:"#app", data:{ message:"条件渲染案例", score:0 }, methods:{ s(){ if(this.score > 100) { this.score = 100; } if(this.score < 0) { this.score = 0; } } } }) </script> </body> </html>
复制
7.列表渲染 (v-for)
这里我们会去官网上查看
列表渲染官方文档
7,1 列表渲染相关方法
7.2列表渲染应用实例
1.输出列表相应的值,包括索引
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>列表渲染</title> <script src="vue.js"></script> </head> <body> <div id="app"> <ul> <li v-for="(item,index) in array"> {{item.message}}--{{index}} </li> </ul> </div> <script> let vm = new Vue({ el:"#app", data:{ mes:"列表渲染技术", array:[ {message:1}, {message:2}, {message:3} ] } }) </script> </body> </html>
复制
2.遍历输出数组中各个对象的属性值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>列表渲染</title> <script src="vue.js"></script> </head> <body> <div id="app"> <table width="400px" border="1=px"> <tr v-for="item in array"> <td>{{item.id}}</td> <td>{{item.name}}</td> <td>{{item.price}}</td> </tr> </table> </div> <script> let vm = new Vue({ el:"#app", data:{ mes:"列表渲染技术", array:[ {id:1,name:"小王",price:200}, {id:2,name:"小红",price:400}, {id:3,name:"小明",price:300} ] } }) </script> </body> </html>
复制
8.组件化编程
1. 在大型应用开发的时候,页面可以划分成很多部分,往往不同的页面,也会有相同的部 分。例如可能会有相同的头部导航。 2. 但是如果每个页面都独自开发,这无疑增加了我们开发的成本。所以我们会把页面的不 同部分拆分成独立的组件,然后在不同页面就可以共享这些组件,避免重复开发 组件 (Component) 是 Vue.js 最强大的功能之一 ( 可以提高复用性 [1. 界面 2. 业务处理 ]) 组件也是一个 Vue 实例,也包括∶ data 、 methods 、生命周期函数等 组件渲染需要 html 模板,所以增加了 template 属性,值就是 HTML 模板 对于全局组件,任何 vue 实例都可以直接在 HTML 中通过组件名称来使用组件 data 是一个函数,不再是一个对象, 这样每次引用组件都是独立的对象 / 数据
8.1 全局组件
全局组件就相当于java中的一个类,当你用到该组件的时候,就相当于创建了一个实例,里面的数据是独占的,不是共享的,用的vue实例的数据池是共享的。
有许多微小的差别具体代码如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>组件化编程-全局组件</title> </head> <body> <div id="app"> <h1>组件化编程-全局组件</h1> <!--使用全局组件--> <counter></counter> <br/> <counter></counter> </div> <script src="vue.js"></script> <script> //1、定义一个全局组件, 名称为 counter //2. {} 表示就是我们的组件相关的内容 //3. template 指定该组件的界面, 因为会引用到数据池的数据,所以需要是模板字符串 //4. 要把组件视为一个Vue实例,也有自己的数据池和methods //5. 对于组件,我们的数据池的数据,是使用函数/方法返回[目的是为了保证每个组件的数据是独立], 不能使用原来的方式 //6. 这时我们达到目前,界面通过template实现共享,业务处理也复用 //7. 全局组件是属于所有vue实例,因此,可以在所有的vue实例使用 Vue.component("counter", { template: `<button v-on:click="click()">点击次数= {{count}} 次【全局组件化】</button>`, data() {//这里需要注意,和原来的方式不一样!!!! return { count: 10 } }, methods: { click() { this.count++; } } }) //创建Vue实例,必须有 let vm = new Vue({ el: "#app"//Vue实例的挂载点 }) </script> </body> </html>
复制
8.2局部组件
局部组件:不同于全局组件,局部组件是要引入到某个vue实例中,由挂载了这个vue实例的容器去使用(可以将局部组件放入到js文件中,当我们要用到该组件的时候就导入包即可)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>组件化编程-局部组件</title> </head> <body> <div id="app"> <h1>组件化编程-局部组件</h1> <!--使用局部组件 ,该组件是从挂载到app的vue中的--> <my_counter></my_counter><br/> <my_counter></my_counter><br/> <my_counter></my_counter><br/> </div> <script src="vue.js"></script> <script> //定义一个组件, 组件的名称为 buttonCounter //1. 可以把常用的组件,定义在某个commons.js中 export //2. 如果某个页面需要使用, 直接import const buttonCounter = { template: `<button v-on:click="click()">点击次数= {{count}} 次【局部组件化】</button>`, data() {//这里需要注意,和原来的方式不一样!!!! return { count: 10 } }, methods: { click() { this.count++; } } } //创建Vue实例,必须有 let vm = new Vue({ el: "#app",//Vue实例的挂载点 components: { //引入/注册某个组件, 此时my_counter就是一个组件, 是一个局部组件,他的使用范围在当前vue 'my_counter': buttonCounter } }) </script> </body> </html>
复制
8.3注意事项
1. 如果方法体 , 只有简单的语句 , 比如 count++, 那么可以进行简写 如: < button v-on :click ="count++" > 点 击 次 数 = {{count}} 次< button> 2. 组件定义需要放置在 new Vue() 前,否则组件注册会失败 3. 组件也是一个 Vue 实例,因此它的定义是也存在∶ data、methods、生命周期函数等
4. data 是一个函数,不再是一个对象, 这样每次引用组件都是独立的对象/数据
5. 组件渲染需要 html 模板,所以增加了 template 属性,值就是 HTML 模板 6. 全局组件是属于所有vue实例,因此,只有被vue实例挂载了过后才能使用全局组件
9.生命周期和钩子函数
1. Vue 实例有一个完整的生命周期,也就是说从开始创建、初始化数据、编译模板、挂载 DOM 、渲染 - 更新 - 渲染、卸载等一系列过程,我们称为 Vue 实例的生命周期 2. 钩子函数 ( 监听函数 ): Vue 实例在完整的生命周期过程中 ( 比如设置数据监听、编译模 板、将实例挂载到 DOM 、在数据变化时更新 DOM 等 ), 也会运行叫做生命周期钩子的函 数 3. 钩子函数的作用 就是在某个阶段 , 给程序员一个做某些处理的机会
vue实例的生命周期图
解释生命周期图:
1 在new vue()的时候,vue实例被创建,他会在内存里面维护一个编译模版。此时在beforeCreate只有比如data数据池,methods方法池的加载,但此时并没有具体数据的初始化。
2 在created的时候里面的数据才被真正的初始化
3 接下来判断vue实例是否有el属性,并且有template模版,有的话,在内存的编译模版里面,先将template模版进行解析,形成内存编译模版结构,也就是vue在内存里面维护了一个这样的模版,但是此时并没有将内存模版挂载到div上所以用户看不到。
如果没有template就会编译一些vue的一些基础的属性。
在beforeMount前都没有挂载到div上,前端界面看不到,但是在内存里面已经编译好了
4 在Mount过后,将内存的模版挂载到前端界面,此时用户看到了渲染后的结果
5. 在Mount时,会时刻监听vue实例中的数据池是否发生变化,如果发生变化在beforeUpdate函数中,就会将内存中的数据加以改变,在重新将模版挂载到div上,updated函数进行更新渲染。
6.就是实例销毁时,调用beforeDestory,和destory函数。
以上就是一个完整的vue的生命周期,请参照链接的图理解,讲的不好,多多指教!
下面是老师解读!
1) new Vue()
new 了一个 Vue 的实例对象,此时就会进入组件的创建过程。
2) Init Events & Lifecycle
初始化组件的事件和生命周期函数
3) beforeCreate
组件创建之后遇到的第一个生命周期函数,这个阶段 data 和 methods 以及 dom 结构都未
被初始化,也就是获取不到 data 的值,不能调用 methods 中的函数
4) Init injections & reactivity
这个阶段中, 正在初始化 data 和 methods 中的方法
5) created
- 这个阶段组件的 data 和 methods 中的方法已初始化结束,可以访问,但是 dom 结构未
初始化,页面未渲染
- 老师说明:在这个阶段,经常会发起 Ajax 请求
6) 编译模板结构(在内存)
7) beforeMount
当模板在内存中编译完成,此时内存中的模板结构还未渲染至页面上,看不到真实的数据
8) Create vm.$el and replace ‘el’ with it
这一步,再在把内存中渲染好的模板结构替换至真实的 dom 结构也就是页面上
9) mounted
此时,页面渲染好,用户看到的是真实的页面数据, 生命周期创建阶段完毕,进入到了运
行中的阶段
10) 生命周期运行中
10.1 beforeUpdate
当执行此函数,数据池的数据新的,但是页面是旧的
10.2 Virtual DOM re-render and patch
根据最新的 data 数据,重新渲染内存中的模板结构,并把渲染好的模板结构,替换至页面
上
10.3 updated
页面已经完成了更新,此时,data 数据和页面的数据都是新的
11) beforeDestroy
当执行此函数时,组件即将被销毁,但是还没有真正开始销毁,此时组件的 data、methods
数据或方法 还可被调用
12) Teardown…… 注销组件和事件监听
13) destroyed
组件已经完成了销毁
对重要阶段的钩子函数进行案例分析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--这里可以视为用户看到的页面-对应前面讲解的页面dom--> <div id="app"> <span id="num">{{num}}</span> <button @click="num++">赞!</button> <h2>{{name}},有{{num}}次点赞</h2> </div> <script src="vue.js"></script> <script> let vm = new Vue({ el: "#app", data: {//数据池 name: "kristina", num: 0 }, methods: { show() { return this.name; }, add() { this.num++; } }, beforeCreate() {//生命周期函数-创建vue实例前 console.log("=============beforeCreate=========="); console.log("数据模型/数据池的数据是否加载/使用?[no]", this.name, " ", this.num); //console.log("自定义方法是否加载/使用?[no]", this.show()); console.log("用户页面dom是否加载/使用?[yes]", document.getElementById("num")); console.log("用户页面dom是否被渲染?[no]", document.getElementById("num").innerText); }, created() {//生命周期函数-创建vue实例 console.log("=============created=========="); console.log("数据模型/数据池的数据是否加载/使用?[yes]", this.name, " ", this.num); console.log("自定义方法是否加载/使用?[yes]", this.show()); console.log("用户页面dom是否加载/使用?[yes]", document.getElementById("num")); console.log("用户页面dom是否被渲染?[no]", document.getElementById("num").innerText); //可以发出Ajax //接收返回的数据 //再次去更新data数据池的数据 //编译内存模板结构 //..... }, beforeMount() {//生命周期函数-挂载前 console.log("=============beforeMount=========="); console.log("数据模型/数据池的数据是否加载/使用?[yes]", this.name, " ", this.num); console.log("自定义方法是否加载/使用?[yes]", this.show()); console.log("用户页面dom是否加载/使用?[yes]", document.getElementById("num")); console.log("用户页面dom是否被渲染?[no]", document.getElementById("num").innerText); }, mounted() {//生命周期函数-挂载后 console.log("=============mounted=========="); console.log("数据模型/数据池的数据是否加载/使用?[yes]", this.name, " ", this.num); console.log("自定义方法是否加载/使用?[yes]", this.show()); console.log("用户页面dom是否加载/使用?[yes]", document.getElementById("num")); console.log("用户页面dom是否被渲染?[yes]", document.getElementById("num").innerText); }, beforeUpdate() {//生命周期函数-数据池数据更新前 console.log("=============beforeUpdate=========="); console.log("数据模型/数据池的数据是否加载/使用?[yes]", this.name, " ", this.num); console.log("自定义方法是否加载/使用?[yes]", this.show()); console.log("用户页面dom是否加载/使用?[yes]", document.getElementById("num")); console.log("用户页面dom数据是否被更新?[no]", document.getElementById("num").innerText); //验证数据==>修正 // if(this.num < 10 ) { // this.num = 8; // } }, updated() {//生命周期函数-数据池数据更新后 console.log("=============updated=========="); console.log("数据模型/数据池的数据是否加载/使用?[yes]", this.name, " ", this.num); console.log("自定义方法是否加载/使用?[yes]", this.show()); console.log("用户页面dom是否加载/使用?[yes]", document.getElementById("num")); console.log("用户页面dom数据是否被更新?[yes]", document.getElementById("num").innerText); } }) </script> </body> </html>
复制
抓包分析
10.vue Cli脚手架模块化开发
目前开发模式的问题 1. 开发效率低 2. 不够规范 3. 维护和升级 , 可读性比较差 vue Cli脚手架可以帮我们搭建框架,程序员只需要将框架的内容写完就好了。易于开发和维护。
10.1用webpack来创建vue Cli脚手架项目
最后看到的界面如下所示:
10.2 Vue Cli中项目结构的分析 (如图所示)
!!!10.3Vue请求页面的执行流程
由上述三个图片,可以了解vue Cli脚手架请求页面的流程:
首先就是main,js是程序的入口,创建了一个vue的实例,并将该实例挂载到id=app的容器中。
再去router路由找到目录router/index,js:上面导出默认的路由(可以看成组件默认导出),路由中的component组件去HelloWord.vue中寻找里面就是对文字及其内容的一个渲染、。最后渲染后的路由界面,会以路由视图的形似返回到vue实例中。
vue实例中的component和template模版是这个vue实例的渲染模版,在里面就是一张图片。当vue实例在内存中维护的编译模版完成后,将vue实例挂载到index.html前端界面中进行挂载。
11. vue-ElementUI
Element-UI的官网
ElementUI 是组件库,网站快速成型工具
11.1安装Element-ui的指令
安装 element-ui 组件库, cmd 下进入到项目,指令 npm i element-ui@2.12.0
10.2初步使用Element-UI应用实例
1. 首先第一步,要引入Element-UI
2. 比如我要引用提供的icon图标
3. 在vue组件的代码中引入上述代码运行即可得到
希望小伙伴多多关注!