vue|4种方法☀️☀️的区别需要清楚

126 阅读4分钟

1、computed和watcher的区别

computed:计算属性

  1. 支持缓存,只有依赖的数据发生变化,才会重新计算
  2. 不支持异步,当computed中有异步操作时,无法监听数据的变化
  3. computed默认会从缓存中读取数据,计算属性是基于响应式数据来缓存的,也就是计算data声明过的,或者props中传入的数据
  4. 当一个属性受多个属性影响的时候,使用computed
  5. 必须return
  6. 默认第一次加载的时候就开始监听

watch:监听属性

  1. 不支持缓存
  2. 支持异步
  3. 监听的数据必须是data声明的数据或者props传入的数据
  4. 当一个值的改变影响多个值的时候,使用watch
  5. 不是必须return的
  6. 默认第一次加载不监听,如果需要监听,要加immediate
  7. 设置了deep才可以深度监听嵌套对象的数据变化

总结

当一个值的结果依赖其他值的结果时,选择使用computed,在下一次获取computed值时才会重新计算
watcher更多的是观察性质,不缓存,数据变化时就调用监听的回调函数

2、computed和methods的区别

1.computed以对象属性的方式进行调用,methods必须以括号的形式调用

// computed调用
{{msg}}
// methods调用
{{msg()}}

2.computed有缓存属性,如果需要使用多次,那么只会调用一次,methods是每次使用都要进行调用

思考💡

为什么computed是以对象属性的方式调用?

计算属性的实质是对象,其中定义了get和set方法

            computed: {
                name: {
                    get: function () {
                        return this.firstName + this.lastName;
                    },
                    set() {

                    }
                }
            },

但是一般的操作中,我们只需要get方法,不需要使用set方法,所以计算属性一般是只读属性;去掉无用的set方法之后,computed属性简写为我们常见的方式:

            computed: {
                name: function () {
                    return this.firstName + this.lastName;
                }
            },

3、filter 与 computed 的区别

1.过滤器概念

vue的过滤器是通过过滤操作来过滤数据,是不会改变数据的,通过过滤数据来改变用户看到的结果 计算属性和methods是通过修改数据来改变用户看到的结果的

2.过滤器使用

一般用在{{}}和v-bind中,然后放在|操作符之后进行操作

<li>商品价格:{{item.price | filterPrice}}</li>

 filters: {
    filterPrice (price) {
      return price ? ('¥' + price) : '--'
    }
  }

4、watch的几种用法

方法一:直接写一个监听处理函数

每次监听到属性值(如cityName)改变时,执行此函数

<input type="text" v-model="cityName"/>
  watch: {
    cityName(newVal, oldVal){
      this.cityName = newVal
    }
  }

方法二:监听方法名

方法名在 methods 中定义

export default{
  data () {
    return {
      cityName: '上海'
    }  
  },
  watch: {
    cityName: 'nameChange'
  },
  methods: {
    nameChange(newVal, oldVal){
      this.cityName = newVal
    }
  }
}

方法三:使用 immediate(立即)和 deep 属性及 handler (处理者)方法

watch特点

当值第一次绑定时不会执行监听函数,只有值发生改变时才会执行监听函数

如果需要第一次绑定时执行监听函数,使用 immediate 属性

immediate属性

监听属性后面写成对象形式,包含 handler 方法和 immediate 属性
immediate 属性表示 watch 首次绑定时,是否执行 handler 方法
immediate 为 true 表示 watch 声明的时候,立即执行 handler 方法
immediate 值为 false 则和一般 watch 用法一样,在数据发生变化时才执行handler 方法
export default{
  watch: {
    cityName: {
      handler(newVal, oldVal){
        this.cityName = newVal
      },
      immediate: true
    }
  }

deep深度监听

当需要监听一个对象改变时,普通 watch 无法监听到对象内部属性变化

watch 中使用 deep 属性,可以对对象中的属性进行深度监听

<input type="text" v-model="cityName.name"/>
export default{
  data () {
    return {
      cityName: {id: 1, name: '上海'}
    }  
  },
  watch: {
    cityName: {
      handler(newVal, oldVal){
        console.log('newVal', newVal)
        console.log('oldVal', oldVal)
      },
      immediate: true,
      deep: true,
    }
  }
}

设置 deep: true 可以监听到cityName.name 变化

此时会给 cityName 所有属性都加上这个监听器

当对象属性较多时,每个属性值变化都会执行 handler 方法

监听对象属性名

如果只需要监听对象中的一个属性值,使用字符串形式监听对象属性名

export default{
  data () {
    return {
      cityName: {id: 1, name: '上海'}
    }  
  },
  watch: {
    'cityName.name': {
      handler(newVal, oldVal){
        console.log('newVal', newVal)
        console.log('oldVal', oldVal)
      },
      immediate: true,
      deep: true,
    }
  }
}

注意

数组(一维、多维)变化不需要通过深度监听

对象数组中对象属性变化需要进行深度监听

watch中不要使用箭头函数,因为箭头函数中的 this 是指向当前作用域

参考👀

juejin.cn/post/684490…

blog.csdn.net/taoqidejing…