您的位置:首页 > 教育 > 锐评 > 【前端】vue监视属性和计算属性对比

【前端】vue监视属性和计算属性对比

2024/10/5 18:30:36 来源:https://blog.csdn.net/weixin_43872912/article/details/141430583  浏览:    关键词:【前端】vue监视属性和计算属性对比

首先分开讲解各个属性的作用。
1.计算属性
作用:用来计算出来一个值,这个值调用的时候不需要加括号,会根据依赖进行缓存,依赖不变,computed的值不会重新计算。

    const vm = new Vue({el:'#root',data:{lastName:'张',firstName:'三',},computed:{fullName:{//get作用,读取fullName时get调用且返回值是fullName的值get(){return this.lastName.slice(0,3)+'-'+this.firstName.slice(0,3);},//当fullName被修改时,会调用setset(value){const arr = value.split('-');this.lastName = arr[0];this.firstName = arr[1];}}}})

其中computed的属性就是计算属性,其中get读取方法尽在初次读取的时候调用以及所依赖的数据发生变化的时候调用。set设置方法是当数据发生变化时就会直接调用去重新计算属性值。

在这里插入图片描述
2.监听属性
作用:和js中的事件监听类似,当vue中的属性值发生变化时执行。

const vm = new Vue({el:'#root',data:{ishot:true,numbers:{a:1,b:1}},methods:{change(){//this.ishot = (this.ishot==true)?false:truethis.ishot = !this.ishot},},computed:{info(){return this.ishot?'炎热':'凉爽'}},watch:{ishot:{immediate:true,   //初始化时让handler调用一下//handler什么时候调用?当isHot发生改变时。handler(newValue,oldValue){console.log("ishot被改变了:",newValue,'->',oldValue)}},//监视多级结构中某个属性的变化'numbers.a':{immediate:true,   //初始化时让handler调用一下//handler什么时候调用?当isHot发生改变时。handler(newValue,oldValue){console.log("a被改变了:",newValue,'->',oldValue)}},//监视多级结构中所有属性的变化numbers:{deep:true,  //开启深度监视handler(){console.log('numbers改变了');}}}})

上述代码中watch属性就是计算属性,它包含两个属性值,其中immediate属性记录的是,在初始化 的时候是否需要计算一次监视属性;还有一个deep属性值代表的是当所要监视的属性值是对象是,是否要进行深度监视,即当对象内部属性值发生变化时是否调用监视函数。

在这里插入图片描述
案例:列表过滤
问题描述搜索框,对列表中的数据进行模糊筛选。

在这里插入图片描述
在这个问题里面,列表会根据input框中的内容对列表中的名字内容进行筛选。
因为要显示的内容跟data中的列表不一样,所以一定是需要重新建一个参数的,因此就需要初始化。例如监听属性中immediate属性。
在这里插入图片描述

html:<div id="root"><h2>人员列表</h2><input type="text" placeholder="请输入名字" v-model="keyWord"><ul><!-- 动态绑定id标识 --><li v-for="(person,index) in filteredPersons" :key="person.id">{{person.name}}-{{person.age}}-{{person.sex}}</li></ul></div>
监视属性写法:js:new Vue({el:'#root',data:{keyWord:'',persons:[{id:'001',name:'马冬梅',age:19,sex:'女'},{id:'002',name:'周冬雨',age:20,sex:'女'},{id:'003',name:'周杰伦',age:21,sex:'男'},{id:'004',name:'温兆伦',age:22,sex:'男'}],filteredPersons:[]},watch:{//这里接收输出的值可以有两个,分别是新值和旧值;也可以只有一个新值keyWord:{immediate:true,handler(newValue){this.filteredPersons = this.persons.filter((p)=>{return p.name.indexOf(newValue)>=0;})}}}})
计算属性写法:js:new Vue({el:'#root',data:{keyWord:'',persons:[{id:'001',name:'马冬梅',age:19,sex:'女'},{id:'002',name:'周冬雨',age:20,sex:'女'},{id:'003',name:'周杰伦',age:21,sex:'男'},{id:'004',name:'温兆伦',age:22,sex:'男'}]},   computed:{filteredPersons:{get(){var filteredPersons = [];for(var i in this.persons){if(this.persons[i].name.indexOf(this.keyWord)>=0){filteredPersons.push(this.persons[i]);}}            return filteredPersons;         },set(value){this.keyWord = value;}}}})

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com