之前讲解的都是vue1.0的使用,现在我们开始介绍vue2.0,
这里的介绍是在vue1.0的基础上进行介绍的,主要介绍的是同vue1.0版本相比2.0的变化

vue2.0的变化
1.在每个组件模板中,组件的定义有一点变化且不再支持片段代码
之前可以写片段代码:

<template>
			    <h3>我是标题</h3>
			    <strong>我是组件</strong>
		  </template>

现在--必须有一个根元素来包裹片段代码

Vue.component('my-aaa',{
		    template:'#aaa'
	  });
	  <template id="aaa">
		    <div>
			      <h3>我是标题</h3>
			      <strong>我是组件</strong>
		    </div>
	  </template>

 

2.vue2.0组件定义的变化:
不再支持Vue.extend()的定义方式,有改动
1)Vue.component在2.0继续能够使用,但是不简洁

Vue.component(组件名称,{
				    data(){},
				    methods:{},
				    template:''
			  });

2)vue2.0推荐定义组件的一个简洁的方法

var Home={	//定义一个json,即是定义的一个组件
				    template:'#aaa'
			  };  //相当于vue1.0之前的vue.extend();
			  Vue.component('my-aaa',Home);	//定义好组件之后,需要注册,componet也可以写在里面
			  <template id="aaa">
				    <div>
					      <h3>我是标题</h3>
					      <strong>我是组件</strong>
				    </div>
			  </template>

 

3.变化最大的是vue生命周期的变化
之前:

  0)init-->实例刚被创建但是属性方法什么都没有
  1)created-->实例已经创建,属性方法已经绑定,但是DOM还没有生成(实例创建完成执行)
  2)beforeCompile-->在实例编译之前执行
  3)compiled-->在编译之后执行
  4)ready-->把数据插入到文档中时执行 相当于jquery中的window.onload
  5)beforeDestroy-->销毁之前
  6)destroyed-->销毁之后
现在:

  0)beforeCreate(){}-->实例刚被创建但是属性方法什么都没有
  1)created-->实例已经创建,属性方法已经绑定,但是DOM还没有生成
  2)beforeMount-->模板编译之前
  3)mounted-->模板编译完成(代替的是之前的compiled,ready两个过程)
  4)beforeUpdate-->组件或者数据更新之前
  5)updated-->组件或数据更新完成
  6)beforeDestroy-->销毁之前
  7)destroyed-->销毁之后

 

4.vue2.0循环的变化
2.0里面默认可以添加重复的数据,之前要添加track-by="$index"
  track-by="id"在2.0已经废弃了
  之前:<li v-for="(index,val) in arr" track-by="$index">{{val}}{{$index}}</li>
  现在:<li v-for="(val,index) in arr" :key="index">{{val}}{{index}}</li>
  去掉一些隐式变量如$index,$key更贴近原生的js语法
  之前:<li v-for="(index,val) in arr">{{val}}{{$index}}</li>
  现在:<li v-for="(val,index) in arr">{{val}}{{index}}</li>
  之前:<li v-for="(key,val) in json">{{val}}{{$key}}</li>
  现在:<li v-for="(val,key) in json">{{val}}{{key}}</li>

 

5.自定义键盘的指令
  之前:vue.directive('on').keyCodes.ctrl=17;
  现在:vue.config.keyCodes.ctrl=17;

 

6.过滤器的变化
之前自带许多自带的过滤器:

{{msg | currency}}
			  {{msg | json}}

现在2.0把内置的过滤器全部删除了
除了json直接可以实现,其他的都需要自己自定义过滤器(通过js)实现

自定义过滤器还有,自定义过滤器的传参发生变化:
自定义过滤器:

vue.filter(function(input){
						    return input<10?'0'+input:''+input;
					  });

过滤器传参变化:
  之前:{{msg|toDoch '12' '5'}}
  现在:{{msg|toDoch('15','5')}}

 

7.组件通信的变化
主要用-->vm.$emit(),vm.$on()

子组件与父组件
  1)子组件想要拿到父组件的数据
    通过props,没有更改
  2)子组件想要更改父组件数据/传递数据给父组件
    之前:子组件拿到父组件的数据后可以更改父组件的数据,通过sync同步
    现在:不允许直接给父级数据做更改

示例1:使用vue2.0进行子组件将数据传给父组件时会报错,且父组件数据不会与子组件数据同步

<div id="box">
			  父级数据-->{{msg}}
			  <br/>
			  <child-com :m.sync="msg"></child-com>
		</div>
		<template id="child">
			  <div>
				    <span>我是子组件</span>
				    <input type="button" value="按钮" @click="change()">
				    <strong>{{m}}</strong>
			  </div>
		</template>		new Vue({
			  el:'#box',
			  data:{
				    msg:'我是父组件的数据'
			  },
			  components:{
				    'child-com':{
					      props:['m'],
					      template:'#child',
					      methods:{
						        change(){
							          this.m="被更改了!"
						        }
					      }
				    }
			  }
		});

 

若想改父组件的数据:
 1)父组件每次传一个对象给子组件,在js中对象之间是引用的

<div id="box">
				    父级数据-->{{giveData.msg}}
				    <br/>
				    <child-com :m="giveData"></child-com>
			  </div>
			  <template id="child">
				    <div>
					      <span>我是子组件</span>
					      <input type="button" value="按钮" @click="change()">
					      <strong>{{m.msg}}</strong>
				    </div>
			  </template>			  new Vue({
				    el:'#box',
				    data:{
					      giveData:{	//父组件定义一个对象,数据以对象的形式传给子组件
						        msg:'我是父组件的数据'
					      }
				    },
				    components:{
					      'child-com':{
						        props:['m'],
						        template:'#child',
						        methods:{
							          change(){
								            this.m.msg="被更改了!"	//这里修改的是传过来对象里的msg属性
							          }
						        }
					      }
				    }
			  });

2)不通过传对象的方法,只是要求不报错,可以通过mounted中转一下

<div id="box">
				  父级数据-->{{msg}}
				  <br/>
				  <child-com :m="msg"></child-com>
			</div>
			<template id="child">
				  <div>
					    <span>我是子组件</span>
					    <input type="button" value="按钮" @click="change()">
					    <strong>{{b}}</strong>
				  </div>
			</template>			new Vue({
				  el:'#box',
				  data:{
						    msg:'我是父组件的数据'
				  },
				  components:{
					    'child-com':{
						      data(){
							        return {
								          b:''
							        }
						      },
						      mounted(){	//通过mounted中转,把得到的父级数据赋给自己的数据b
							        this.b=this.m
						      },
						      props:['m'],
						      template:'#child',
						      methods:{
							        change(){
								          this.b="被更改了!"	//通过mounted中转后,这里修改的是自己的数据b
							        }
						      }
					    }
				  }
			});

8.单一事件管理组建的通信

下面这个例子可以实现单一事件组件的通信

 

1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title></title>
  6     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
  7     <meta name="apple-mobile-web-app-capable" content="yes">
  8     <meta name="apple-mobile-web-app-status-bar-style" content="black">
  9     <style>
 10 
 11     </style>
 12     <script src="vue.js"></script>
 13     <script>
 14         //准备一个空的实例对象
 15         var Event=new Vue();
 16 
 17 
 18         var A={
 19             template:`
 20                 <div>
 21                     <span>我是A组件</span> -> {{a}}
 22                     <input type="button" value="把A数据给C" @click="send">
 23                 </div>
 24             `,
 25             methods:{
 26                 send(){
 27                     Event.$emit('a-msg',this.a);
 28                 }
 29             },
 30             data(){
 31                 return {
 32                     a:'我是a数据'
 33                 }
 34             }
 35         };
 36         var B={
 37             template:`
 38                 <div>
 39                     <span>我是B组件</span> -> {{a}}
 40                     <input type="button" value="把B数据给C" @click="send">
 41                 </div>
 42             `,
 43             methods:{
 44                 send(){
 45                     Event.$emit('b-msg',this.a);
 46                 }
 47             },
 48             data(){
 49                 return {
 50                     a:'我是b数据'
 51                 }
 52             }
 53         };
 54         var C={
 55             template:`
 56                 <div>
 57                     <h3>我是C组件</h3>
 58                     <span>接收过来的A的数据为: {{a}}</span>
 59                     <br>
 60                     <span>接收过来的B的数据为: {{b}}</span>
 61                 </div>
 62             `,
 63             data(){
 64                 return {
 65                     a:'',
 66                     b:''
 67                 }
 68             },
 69             mounted(){
 70                 //var _this=this;
 71                 //接收A组件的数据
 72                 Event.$on('a-msg',function(a){
 73                     this.a=a;
 74                 }.bind(this));
 75 
 76                 //接收B组件的数据
 77                 Event.$on('b-msg',function(a){
 78                     this.b=a;
 79                 }.bind(this));
 80             }
 81         };
 82 
 83 
 84         window.onload=function(){
 85             new Vue({
 86                 el:'#box',
 87                 components:{
 88                     'com-a':A,
 89                     'com-b':B,
 90                     'com-c':C
 91                 }
 92             });
 93         };
 94     </script>
 95 </head>
 96 <body>
 97     <div id="box">
 98         <com-a></com-a>
 99         <com-b></com-b>
100         <com-c></com-c>
101     </div>
102 </body>
103 </html>

 

9.debounce也已经废弃
要想延迟使用
lodash --工具库(自己了解)
方法:_.debounce(fun,时间)