3-4 vue生命周期及实例的属性和方法-实例方法/数据
目录:
- 实例方法/数据
一、实例方法/数据
关于数据的实例方法就只有三个,vue.js的官方文档如下:实例方法/数据。
vm.$set(object,key,value) => 更新对象的属性,存在更新,不存在则创建 vm.$delete(object,key) => 删除对象的属性 vm.$watch(data,callback[,options]) => 监视数据变化,data:数据 callback:回调函数 options:选项,可有可无
1、vm.$set(object,key,value) => 通过vue实例的$set方法为对象添加属性,可以实时监视。
有同学疑问了,我为啥要用这种方式为对象添加属性呐,我按照以往的方式不行吗?接下来我们就试试看:
<body> <div id="box"> <button @click="doUpdate">修改属性</button> <button @click="doAdd">添加属性</button> <hr> <h2>{{user.name}}</h2> <h2>{{user.age}}</h2> </div> <script type="text/javascript" src="../vue.js"></script> <script> //创建vue实例 let vm = new Vue({ el: "#box", data:{ user:{ id:1001, name:'tom' } }, methods:{ doUpdate(){ this.user.name = "汤姆"; }, doAdd(){ //通过这种方式为对象添加属性时,vue无法实施监视到 this.user.age = 25; console.log(this.user); } } }); </script> </body>
输出结果:
很明显,通过这种方式为对象添加属性时,vue无法实施监视到,所以我们需要通过另外一种方式,使得Vue 实时监控,所以我们doAdd()函数可以这样改造:
doAdd(){ //通过vue实例的$set方法为对象添加属性,可以实时监视 //this.$set(this.user,'age',25);//存在则修改,不存在则添加 //全局方式添加 //Vue.set(this.user,'age',18); //console.log(this.user); //一般情况下都是通过判断的方式设置age的值 if(this.user.age){ this.user.age++; }else { Vue.set(this.user,'age',18); } },
2、vm.$delete(object,key) => 删除对象中的某个属性
doDelete(){ if(this.user.age){ //局部的 //this.$delete(this.user,"age"); //全局的 //Vue.delete(this.user,"age"); } }
3、vm.$watch(data,callback[,options]) => 监视数据变化
①有2种方式监视数据变化:
- 方式1:使用vue实例的提供watch()方法
- 方式2:使用vue实例提供的watch选项
<body> <div id="box"> <input type="text" v-model="name"> <h3>{{name}}</h3> <hr> <input type="text" v-model="age"> <h3>{{age}}</h3> </div> <script type="text/javascript" src="../vue.js"></script> <script> //创建vue实例 let vm = new Vue({ el: "#box", data:{ name: 'tom', age: 23 }, watch:{ //方式2:使用vue实例提供的watch选项 age:(newVal,oldVal) => { //监视age属性,newVal:更新后的值、oldVal更新前的值 console.log('age被修改啦:原值:'+oldVal+',新值:' + newVal); } } }); //方式1:使用vue实例的提供watch()方法 vm.$watch('name',(newVal,oldVal) => { //监视name属性,newVal:更新后的值、oldVal更新前的值 console.log('name被修改啦:原值:'+oldVal+',新值:' + newVal); }); </script> </body>
console控制台输出:
那这边有同学要说了,我用计算属性不也是一样的嘛?为啥要用$watch去监视数据的变化呐,$watch把变化后的数据发送ajax请求到后台,这边有计算属性不太合适,场合不对,自己监视用$watch。
注意:$watch这个只有局部的方法,没有全局的watch,如果有全局的,这下如果有两个实例,两个实例有同一个变量,我到底要监视哪一个呐,随意$watch没有全局方法。
②对象数据变化的监视
对象的数据监视跟普通属性变化不一样,对象的值虽然变了,但是内存地址没有变,所以无效,所以要深度监视。
<body>
<div id="box">
<!--我想这个Name发生改变,我也能监视-->
<input type="text" v-model="user.name">
<h2>{{user.name}}</h2>
</div>
<script type="text/javascript" src="../vue.js"></script>
<script>
//创建vue实例
let vm = new Vue({
el: "#box",
data:{
user:{
id:1001,
name:'jerry' //对象的值虽然变了,但是内存地址没有变,所以无效,所以要深度监视
}
},
watch:{ //方式2:使用vue实例提供的watch选项
user:{
handler:(newVal,oldVal) => { //newVal,oldVal拿的都是user对象,当你执行下一句的时候,地址空间已经更新了
console.log('user被修改啦:原值:'+oldVal+',新值:' + newVal);
},
deep: true //深度监视,当对象中的属性发生变化时也会监视
}
}
});
//方式1:使用vue实例的提供watch()方法
vm.$watch('user',(newVal,oldVal) => { ////newVal,oldVal拿的都是user对象
console.log('name被修改啦:原值:'+oldVal+',新值:' + newVal);
},{deep: true}); //在后面加一个true表示深度监视,当对象中的属性发生变化时也会监视
</script>
</body>
console控制台输出: