欢迎光临
个人技术文档整理

Vue:计算属性(computed)和 侦听属性(watch) 之间的区别

计算属性 vs 侦听属性

功能:计算属性是用来解决模板语法冗余的, 侦听器是用来侦听data中某一数据的变化(功能不同)

  • 1. 计算属性有缓存机制, 侦听器没有
  • 2. 计算属性不支持异步操作, 侦听器支持
  • 3. 计算属性可以给vue新增属性, 侦听器必须是data中已有的属性
  • 4. (可选)计算属性只要使用了就会立即执行一次, 侦听器默认只有当数据第一次改变才会执行, 需要设置immediate属性来控制是否立即执行一次 

 

computed和watch之间的区别

  • computed能完成的功能,watch都可以完成
  • watch 能完成的功能,computed不一定能完成,例如watch可以进行异步操作

两个重要的小原则

  • 所有被Vue管理的函数,最好写成普通函数,这样 this的指向才是vm或组件实例对象
  • 所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm或组件实例对象 

 

computed 优先案例

    <div id="app">
        <input type="text" placeholder="firstName" v-model="firstName"><br />
        <input type="text" placeholder="lastName" v-model="lastName"><br />
        {{fullName}}
    </div> 
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                firstName: '张',
                lastName: '三',
                fullName: '张 三'
            },
            watch: {
                firstName(val) {
                    this.fullName = val + ' ' + this.lastName
                },
                lastName: function (val) {
                    this.fullName = this.firstName + ' ' + val
                }
            }
        })
    </script>

上面代码是命令式且重复的。将它与计算属性的版本进行比较:(推荐写法

    <div id="app">
        <input type="text" placeholder="firstName" v-model="firstName"><br />
        <input type="text" placeholder="lastName" v-model="lastName"><br />
        {{fullName}}
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                firstName: '张',
                lastName: '三'
            },
            computed: {
                fullName: function () {
                    return this.firstName + ' ' + this.lastName
                }
            }
        })
    </script>

 

watch 异步操作,computed无法实现 案例


    <div id="app">
        <input type="text" placeholder="firstName" v-model="firstName"><br />
        <input type="text" placeholder="lastName" v-model="lastName"><br />
        延迟显示值:{{fullName}}
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                firstName: '张',
                lastName: '三',
                fullName: '张 三'
            },
            watch: {
                //修改后,延迟1秒处理
                firstName(val) {
                    //this=vm
                    setTimeout(() => {
                        //this =>外层继承(vm)  
                        this.fullName = this.firstName + ' ' + val
                    }, 1000);
                },
                lastName: function (val) {
                    setTimeout(() => {
                        this.fullName = this.firstName + ' ' + val
                    }, 1000);

                }
            }
        })
    </script>

 

赞(2)