Vue中computed和watch使用场景和方法


watch和computed都是以Vue的依赖追踪机制为基础,它们都试图处理这样一件事情:当某一个数据(称它为依赖数据)发生变化的时候,所有依赖这个数据的“相关”数据“自动”发生变化,也就是自动调用相关的函数去实现数据的变动

methods用来定义函数,它需要手动调用才能执行,需要像”fuc()”这样去调用它(假设函数为fuc)

computed是计算属性,事实上和data对象里的数据属性是同一类的(使用上),在取值的时候,用this.fullName去取用,就和取data一样(不要当成函数调用!!)

watch和computed各自处理的数据关系场景不同:

1. watch擅长处理的场景:一个数据影响多个数据
2. computed擅长处理的场景:一个数据受多个数据影响

computed 和 methods相比,computed有缓存,性能开销小,何谓computed缓存呢?
在改变number(任一跟computed中不相关的数据)时,整个应用会重新渲染,如果使用的是getName ()方法,则这个方法会被重复调用

而computed不会重新计算,只有依赖的值有变化时(该案例中,number不是computed依赖的值),才会去重新计算,这就是computed的缓存

import Vue from 'vue' new Vue({ el: '#root', template: ` <div> <p>Name: {{name}}</p> <p>Name: {{getName()}}</p> <p>Number: {{number}}</p> <p>FullName: {{fullName}}</p> <p><input type="text" v-model="number"></p> <p>FirstName: <input type="text" v-model="firstName"></p> <p>LastName: <input type="text" v-model="lastName"></p> <p>Name: <input type="text" v-model="name"></p> <p>Obj.a: <input type="text" v-model="obj.a"></p> </div> `, data: { firstName: 'Wang', lastName: 'HaiLi', number: 0, fullName: '', obj: { a: 0 } }, computed: { name: { get () { console.log('new name') return `${this.firstName} ${this.lastName}` }, set (name) { const names = name.split(' ') this.firstName = names[0] this.lastName = names[1] } } }, watch: { 'obj.a': { handler () { console.log('obj.a changed') // this.obj.a += 1 // 不要在watch和computed修改当前值,会无限循环 }, immediate: true // 默认只有数据改变才会监听,第一次不会执行,设置true则第一次也能执行 // deep: true } }, methods: { getName () { console.log('getName invoked') return `${this.firstName} ${this.lastName}` } } })




原文链接:https://www.jianshu.com/p/4f2c995b64bc


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM