vue Watch和Computed的使用总结

01. 监听器watch

(1)作用

  • watch:用于监听data中的数据变化,只在被监听的属性值发生变化时执行
export default {
    data() {
        return {
            number: 1
        }
    },
    watch:{
        // 普通监听方法,这里表示监听data中的 number属性
        // 第一个参数表示改变后的新值,第二个参数表示改变前的旧值
        number(newVal,oldVal){
            console.log(newVal);
            console.log(oldVal);
        }
    }
}

(2)属性和方法

  • immediate:表示在组件创建后,立即监听属性,在最初绑定值的时候,设置为:immediate: true
  • handler:监听对象的时候使用,发生变化时,执行handler中的方法~
  • deep:表示深度监听对象、数组内部的属性的变化,设置为:deep: true
export default {
    data(){
        return {
            number: 1
        }
    },
    watch: {
        // 监听 number属性
        number: {
			handler(newVal, oldVal){

            },
            immediate: true, // 立即监听
        }
    }
}

(3)监听对象

  • 可以监听对象的直接赋值操作

    • 但不能监听对象属性的添加、修改、删除
export default {
    data() {
        return {
            obj: {
                a: 1
            }
        }
    },
    watch: {
        obj: {
            handler(newVal){
                console.log('监听到了', newVal)
            },
            immediate: true
        }
    },
    created(){
        // 无法监听到,因为是对属性进行的修改操作
        // 打印一次,且打印结果为修改后的值,
        this.obj.a = 2 

        // 可以监听到,因为是直接对 对象进行的 赋值操作
        // 打印两次(immediate立即监听会打印一次,修改时打印一次)
        this.obj = { a: 2}
    }
}

由于 Vue 会在初始化实例时,会对属性执行 getter/setter 转化过程

所以属性必须在 data 对象上存在,才能让 Vue 转换它,这样才能让它是响应式的

因此,Vue 无法检测到对象属性的添加、删除、修改等操作

默认情况下 handler 只监听对象内部属性的引用的变化

因此,我们只有进行赋值操作的时候,它才会监听到

  • 可以直接监听对象的某一个属性值

    • 如果这个属性是基本类型的值,就可以正常监听
export default {
    watch: {
        'obj.a': {
            handler(newVal){
                console.log(newVal)
            }
        }
    },
    created(){
        // 以下两个都可以监听到 打印两次
        this.obj.a = 2
        this.obj = { a:2 }
    }
}
  • 可以使用deep属性进行深度监听

    • 只能监听原有属性的变化,不能监听新增属性
    • vue 无法监听 this.$set 修改原有属性的变化

这是因为,this.$set()就是相当于在data中对初始值进行改变

它可以触发监听,但变化体现不出来,即newVal === oldVal

export default {
    watch: {
        obj: {
            handler(newVal){
            	console.log(newVal)
            },
            deep: true,
            immediate: true
        }
    },
    created(){
        // 进行深度监听后,直接修改属性的变化也可以监听到
        // 打印两次(因为immediate)
        this.obj.a = 2

        // 无法监听到 对象属性的增加
        // 打印一次,且打印结果为添加了新增属性的对象
        // 即,它只会 因immediate而执行一次 ,且打印输出 {a:1,b:2}
        this.obj.b = 2

        // 可以触发监听,但无法监听到变化
        // 打印两次,两次值都是{a:2},不能体现变化
        this.$set(this.obj, 'a', 2)
    }
}

(4)监听数组

  • 可以监听

    • 数组的直接赋值操作
    • 通过数组方法的添加、修改、删除操作
    • 通过this.$set()方法进行的数组操作

数组方法如pop()、push()等,和this.$set(arr, index, newVal)方法

它们可以触发监听,但无法体现变化,即newVal === oldVal

  • 无法监听

    • 无法监听数组的非数组方法的添加、删除、修改操作
    • 无法监听直接通过索引值改变数组的变化
    • 无法监听直接修改数组长度的变化
export default {
    data() {
        return {
            arr: [1]
        }
    },
    watch: {
        arr: {
            handler(newVal, oldVal) {
                console.log('新:', newVal)
                console.log('旧:', oldVal)
            },
            immediate: true
        }
    },
    created() {
        // 可以监听到---直接整个数组赋值
        this.arr = [2]

        // 无法监听到---索引赋值、长度修改
        this.arr[1] = 2
        this.arr[0] = 2
        this.arr.length = 2

        // 可以触发监听,但无法监听到变化 => 即新、旧值都是一样的
        this.arr.push(2)
        this.$set(this.arr, 0, 2)
    }
}

02. 计算属性computed

(1)计算属性的set方法

  • 计算属性可以写为一个 Object,而非 Function,只是 Function 形式是我们默认使用它的 get 方法,当写为 Object 时,我们还可以使用它的 set 方法
computed: {
  fullName: {
    get () {
      return `${this.firstName} ${this.lastName}`;
    },
    set (val) {
      const names = val.split(' ');
      this.firstName = names[0];
      this.lastName = names[names.length - 1];
    }
  }
}

当执行 this.fullName = 'Aresn Liang',computed 的 set 就会调用,firstName 和 lastName 就会被赋值为 Aresn 和 Liang

computed 可以依赖其它 computed,甚至是其它组件的 data

(2)区别

  • 计算属性和监听器

    • 计算属性computed是:监听依赖值的变化

      • 只要依赖值不变,都会直接读取缓存进行复用
      • 计算属性不能响应异步操作中数据的变化
      • 需要人为调用
    • 监听器watch是:监听属性值的变化
      • 只要属性值发生变化,都可以触发一个回调函数
      • 监听器可以响应异步操作中数据的变化
      • 自动触发
  • 计算属性和方法
    • methods 是一个方法,它可以接受参数,而 computed 不能
    • computed 是可以缓存的,methods 不会

(3)使用场景

  • 当一个属性受多个属性影响的时候就需要用到computed
  • 当一条数据影响多条数据的时候就需要用watch,如搜索数据

以上就是vue Watch和Computed的使用总结的详细内容,更多关于vue Watch和Computed的使用的资料请关注我们其它相关文章!

(0)

相关推荐

  • Vue中computed和watch有哪些区别

    计算属性computed: 支持缓存,只有依赖数据发生改变,才会重新进行计算 不支持异步,当computed内有异步操作时无效,无法监听数据的变化 computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过或者父组件传递的props中的数据通过计算得到的值 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed 如果computed属性属性值是函数,那么默认会走get方法:函数的返回值就是属性的属性

  • Vue的data、computed、watch源码浅谈

    导读 记得初学Vue源码的时候,在defineReactive.Observer.Dep.Watcher等等内部设计源码之间跳来跳去,发现再也绕不出来了.Vue发展了很久,很多fix和feature的增加让内部源码越来越庞大,太多的边界情况和优化设计掩盖了原本精简的代码设计,让新手阅读源码变得越来越困难,但是面试的时候,Vue的响应式原理几乎成了Vue技术栈的公司面试中高级前端必问的点之一. 这篇文章通过自己实现一个响应式系统,尽量还原和Vue内部源码同样结构,但是剔除掉和渲染.优化等等相关的代

  • vue中watch和computed的区别与使用方法

    computed 计算属性说明: computed 是基于响应性依赖来进行缓存的.只有依赖数据发生改变,才会重新进行计算(当触发重新渲染,若依赖数据没有改变,则 computed 不会重新计算).若没改变,计算属性会立即返回之前缓存的计算结果. 不支持异步,当 computed 内有异步操作时无效,无法监听数据的变化的值. computed 中的成员可以只定义一个函数作为只读属性, 也可以定义成 get/set 变成可读写属性 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对

  • 详解Vue中的watch和computed

    前言 对于使用Vue的前端而言,watch.computed和methods三个属性相信是不陌生的,是日常开发中经常使用的属性.但是对于它们的区别及使用场景,又是否清楚,本文我将跟大家一起通过源码来分析这三者的背后实现原理,更进一步地理解它们所代表的含义. 在继续阅读本文之前,希望你已经具备了一定的Vue使用经验,如果想学习Vue相关知识,请移步至官网. Watch 我们先来找到watch的初始化的代码,/src/core/instance/state.js export function in

  • vue计算属性computed、事件、监听器watch的使用讲解

    一.计算属性(computed) <template> <div class="box"> <h1>计算属性</h1> <hr> <!-- 直接渲染得到数据 --> <p><input type="text" v-model="message"></p> <!-- 对data的数据进行简单的操作 这样有一个不好的地方就是后期对页面数据

  • Vue中computed及watch区别实例解析

    计算属性computed : 1. 支持缓存,只有依赖数据发生改变,才会重新进行计算 2. 不支持异步,当computed内有异步操作时无效,无法监听数据的变化 3.computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过或者父组件传递的props中的数据通过计算得到的值 4. 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed5.如果computed属性属性值是函数,那么默认会走get方法:

  • 如何理解Vue中computed和watch的区别

    概述 我们在 Vue 项目中多多少少都会有用到 computed 和 watch,这两个看似都能实现对数据的监听,但还是有区别.所以以下通过一个小栗子来理解一下这两者的区别. computed 计算属性 计算属性基于 data 中声明过或者父组件传递的 props 中的数据通过计算得到的一个新值,这个新值只会根据已知值的变化而变化,简言之:这个属性依赖其他属性,由其他属性计算而来的. <p>姓名:{{ fullName }}</p> ... ... data: { firstNam

  • Vue中computed、methods与watch的区别总结

    前言 对于那些开始学习Vue的人来说,对于方法.计算属性和观察者之间的区别有点混淆. 尽管通常可以使用它们中的每一个来完成或多或少相同的事情,但了解每个人在哪里胜过其他人还是很重要的. 在这个快速提示中,我们将了解Vue应用程序的这三个重要方面及其用例.我们将通过使用这三种方法中的每一种构建相同的搜索组件来实现这一点. Methods 在一个方法中,或多或少是您所期望的--一个对象属性的函数.您可以使用方法对发生在DOM中的事件作出反应,或者可以从组件中的其他位置调用它们,例如,从计算属性或观察

  • vue中watch和computed为什么能监听到数据的改变以及不同之处

    先来个流程图,水平有限,凑活看吧-_-|| 首先在创建一个Vue应用时: var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) Vue构造函数源码: //创建Vue构造函数 function Vue (options) { if (!(this instanceof Vue) ) { warn('Vue is a constructor and should be called with the `new` keyw

  • Vue中watch、computed、updated三者的区别及用法

    1.watch 理解: 监听器,监听某个数据的变化从而来执行一些操作,当data里面的数据发生变化的时候来执行一下开销较大或异步的操作 1.监听值类型(简单类型)数据 //在一个vue实例中 new Vue({ el:"#myApp", data:{ num1:1, num2:2 }, methods:{}, watch:{ //这里两个属性,第一个值是变化后最新的值,第二个是变化前 num1(after,before){ this.num2 = after +1 } immediat

随机推荐