一、Vue简介
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与 现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能模拟的 ECMAScript 5 特性。Vue.js 支持所有兼容ECMAScript5的浏览器。
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统
获取vue.js:
1)、去vue2官网或git下载,地址: https://github.com/vuejs/vue
2)、使用cdn
3)、安装node.js,使用npm获取,具体的安装细节: https://cn.vuejs.org/v2/guide/installation.html
二、使用例子
引入vue.js文件
<script src="../js/vue.js" type="text/javascript" charset="utf-8"></script>
每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的:
var vm = new Vue({ // 选项 })
vue定义data数据,进行声明式渲染:例子:
html代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue2介绍</title> </head> <body> <div id="app1"> {{message}} </div> <div id="app2"> <span v-bind:title="message"> 把鼠标放到这里试试 </span> </div> <!--引入vue.js--> <script src="../js/common/vue.js"></script> <script type="text/javascript"> //vue应用对象 var app1 = new Vue({ el: "#app1",//绑定使用对象 data: { message: "Hello Vue2!" } }); // 我们的数据对象 var data = {message: "页面加载时间是:" + new Date().toLocaleDateString()} //vue应用对象 var app2 = new Vue({ el: "#app2", data: data // 该对象被加入到一个 Vue 实例中 }); </script> </body> </html>
vue在标签中加入不少的属性,其中我整理了一点,具体的看官方文档
v-text :传递文本:
v-html:传递HTML标签
v-once:只渲染元素和组件一次,之后重新渲染,该元素和组件均会被视作静态内容跳过。
v-if:判断,条件为true
v-show:是否显示标签,为false时标签为display:none
v-else:判断,条件为false时
v-for:循环
v-on:绑定事件的 如:v-on:click 绑定点击事件
v-bind:传递属性值,绑定属性,也可以写为“:”
v-model:绑定value值
v-ref:获取到整个组件(component)的对象
v-el:获取到DOM对象
v-pre:跳过某元素和他的子元素的编译,可以用来显示原始Mustache标签
v-cloak:使某元素保持某种指定行为,直到与该元素相关的实例编译结束。
v-on:click:绑定点击事件
v-on:keyup.enter:监听回车事件
v-on:keyup:监听键盘事件
v-on:.delete:监听删除键
@click:@和v-on是一个意思,@click绑定点击事件
@change:绑定选择事件,一搬用于下拉框
number:输入值转为数值类型 v-model.number
debounce
transition
:is
v-bind:title:绑定标签的title属性
v-text:例子
<p id="test" v-text="'我叫'+student.name+',今年'+student.age+'岁'"></p> <script type="text/javascript"> var app1= new Vue({ el : "#test", data : { student : { name : "小明", age : 18 } } }); </script>
结果:我叫小明,今年18岁
vue组件或者实例中,不管是生命周期钩子函数created还是自定义函数plus,他们中的this都是指当前vue实例。
三、Vue生命周期
每个 Vue 实例在被创建之前都要经过一系列的初始化过程。例如需要设置数据监听、编译模板、挂载实例到 DOM、在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,给予用户机会在一些特定的场景下添加他们自己的代码。
比如 created 钩子可以用来在一个实例被创建之后执行代码:
new Vue({ data: { a: 1 }, created: function () { // `this` 指向 vm 实例 console.log('a is: ' + this.a) } })
也有一些其它的钩子,在实例生命周期的不同场景下调用,如 mounted、updated、destroyed。钩子的 this 指向调用它的 Vue 实例。
不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())。因为箭头函数是和父级上下文绑定在一起的,this 不会是如你所预期的 Vue 实例,经常导致 Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function 之类的错误。
Vue生命周期视图
1、beforeCreate
在vue实例初始化之后,还没有被创建成功,数据观测(data observer) 和 event/watcher 事件配置之前被调用。
2、created
vue实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。
可以在组件的这个期间请求数据,如果是keep-alive组件会被缓存起来,生命周期不会再次触发,如果需要更新数据可以watch当前router变化,如果router是当前组件所在的router则请求数据。
3、beforeMount
在挂载开始之前被调用:相关的 render 函数首次被调用。
4、mounted
vm.$el已挂载在文档内,对已有dom节点的操作可以在这期间进行。
5、 beforeUpdate
数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。
6、updated
由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。
然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。
7、activated
keep-alive 组件激活时调用。
8、deactivated
keep-alive 组件停用时调用。
9、beforeDestroy
实例销毁之前调用。在这一步,实例仍然完全可用。
10、destroyed
Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
例子:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <div id="app1"> <input v-model="msg" /> {{msg}} </div> <button type="button" onclick="destroy()">销毁</button> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var app1 = new Vue({ el: "#app1", data:{ msg:"我是data数据" }, beforeCreate:function(){ console.log("Vue实例创建前:"+this.$el); console.log("data数据:"+this.msg); }, created:function(){ console.log("Vue实例创建后:"+this.msg); console.log("data数据:"+this.msg); }, beforeMount:function(){ console.log("挂载前:"+this.$el); console.log("data数据:"+this.msg); }, mounted:function(){ console.log("挂载后:"+this.$el); console.log("data数据:"+this.msg); }, beforeUpdate:function(){ console.log("实例更新前:"+this.$el); console.log("data数据:"+this.msg); }, updated:function(){ console.log("实例更新后:"+this.$el); console.log("data数据:"+this.msg); }, beforeDestroy:function(){ console.log("实例销毁前:"+this.$el); console.log("data数据:"+this.msg); }, destroyed:function(){ console.log("实例销毁后:"+this.$el); console.log("data数据:"+this.msg); } }); function destroy(){ app1.$destroy(); } </script> </body> </html>
运行结果:
在文本框输入内容进行修改:
点击销毁按钮
四、方法、处理用户输入计算、监听data数据变化
一般我们用v-on进行对标签的绑定事件,实现用户进行交互。绑定事件的方法我们要写到一个集合里面:methods
例子:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <div id="app1"> <input v-model="msg" /> {{msg}} <br/> <button type="button" v-on:click="show">调用方法</button> <button type="button" @click="upMsg">修改msg</button> </div> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var app1 = new Vue({ el: "#app1", data:{ msg:"我是data数据" }, methods:{ show:function(){ console.log("我被执行了"); }, upMsg:function(){ this.msg = "我被修改了";
console.log(this.msg);
} } }); </script> </body> </html>
结果:
方便处理data数据的计算:computed
例子:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style> input{ width: 30px; height: 30px; padding: 5px; border: 1px solid #000; outline:none; text-align: center; } </style> </head> <body> <div id="app1"> <input type="text" v-model="i"/> + <input type="text" v-model="n"/> = <input type="text" v-model="sum" /> </div> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var app1 = new Vue({ el: "#app1", data:{ i:0, n:0 }, computed:{ sum:function(){ return parseInt(this.i) + parseInt(this.n); //parseInt 数据类型转换 } } }); </script> </body> </html>
运行结果:
监听data数据变化:watch
例子:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <div id="app1"> <input type="text" v-model="i"/> {{i}} <input type="text" v-model="n.name"/> {{n.name}} </div> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var app1 = new Vue({ el: "#app1", data:{ i:0, n:{ name:"张三" } }, watch:{ //普通的watch监听 i(val,oldval){ console.log("新值"+val); console.log("旧值"+oldval); }, //深度监听,可监听到对象、数组的变化 n:{ handler(val, oldVal){ console.log("n.name: "+val.name, oldVal.name);
console.log(val.name === oldVal.name);//但是这两个值为true }, deep:true } } }); </script> </body> </html>
运行结果:
但是我们的深度监听好像出了问题,val值和oldVal值是一样的。
因为:这样就只能知道对象发生变化却不知道具体哪个值发生了变化
如果想监听对象某一个值得变化可以利用计算属性:computed
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <div id="app1"> <input type="text" v-model="i"/> {{i}} <input type="text" v-model="n.name"/> {{n.name}} </div> <script type="text/javascript" src="js/vue.js" ></script> <script type="text/javascript"> var app1 = new Vue({ el: "#app1", data:{ i:0, n:{ name:"张三" } }, watch:{ //普通的watch监听 i(val,oldval){ console.log("新值"+val); console.log("旧值"+oldval); }, //这里监听计算方法函数 newValue(val,oldval){ console.log("data数据对象的原值:"+oldval); console.log("data数据对象的新值:"+val); } }, computed:{ newValue() { return this.n.name } } }); </script> </body> </html>
运行结果:
小结:
computed是计算属性的,methods是计算方法的,最主要的区别是 computed计算属性可以对
属性进行缓存的,计算属性只有当该属性发生变化的时候才会重新计算值,只要值没有改变,它是不会重新渲染的,但是methods方法不同,每次调用该方法的时候,都会重新执行的。