Vue3的watch、computed、watchEffect

计算属性 computed

使用:两种方式,一种是只读,另外一种可读可写

// 计算属性写法1 --- 只读,接收一个回调函数
    let persom = rective({
      firstName: 'zhang'
      lastName: 'san'
    })
    person.fullName = computed(() => {
      const { firstName, lastName } = person
      return firstName + lastName
    })
// 计算属性写法2 --- 可读可写,接收一个有get和set方法的对象
    let persom = rective({
      firstName: 'zhang'
      lastName: 'san'
    })
    person.fullName = computed({
      get () {
        const { firstName, lastName } = person
        return firstName + '-' + lastName
      },

      // value就是计算属性的值 firstName + '-' + lastName
      set (value) {
        console.log('computed-set', value);
        let [firstName, lastName] = value.split('-')
        person.firstName = firstName
        person.lastName = lastName
      }
    })

watch 监听

vue 中 watch 用来监听数据的响应式变化,获取数据变化前后的值,watch 第一个参数只能接收 ref、reactive 对象、数组或者一个回调函数(回调函数的目的只要是用来让 watch 监听某个属性的)

watch(监听的数据,副作用函数,配置对象)

watch(data, (newData, oldData) => {}, {immediate: true, deep: true})

注意 如果监听的对象是 ref 定义的复杂数据类型,监听的时候需要监听 对象.value,如果不加.value,那就需要开启深度监听 deep: true

1. 监听 ref 定义的基本数据类型

 // 一、监听单个值的变化,需要写多个watch
    watch(sum, (newVal, oldVal) => {
      console.log(newVal)
    })

    watch(msg, (newVal, oldVal) => {
       console.log(newVal)
    })

2. 监听多个

// 二、监听多个
    // 监听多个值的变化,把需要监听的值放到一个数组里面
    // 输出的newVal和oldVal都是数组,数组里面的元素的顺序跟第一个参数顺序一样
    watch([sum, msg], (newVal, oldVal) => {
      console.log(newVal) // newVal, oldVal都是数组
    })

3. 监听 reactive 定义的复杂数据类型(整个对象的全部属性)

  • 存在的问题 1 -- 获取到的 newVal 和 oldVal 是相同的
  • 存在的问题 2 -- 无论被定义的对象层级有多少层,watch 都能监听到最里层的值的变化,就是相当于强制开启了深度监听,并且这个深度监听是关不掉的,但是在 vue2 中监听多级对象需要配置 deep: true

4. 监听某一个属性

监听 name 属性,监听某个属性,第一个函数需要写回调函数并且该函数返回该属性
watch(() => person.name ,副作用函数,配置对象)

5. 监听 reactive 定义的响应式对象的某些属性

watch([() => person.name, () => person.age] ,副作用函数,配置对象)

6. 监听 reactive 定义的响应式对象里面的某个对象,不会被强制开启 deep: true,如果配置深度监听是能生效的,但是这种情况下的 oldVal 也不正确

 let person = reactive({
   name: ''
   job: {
     salary: ''
   }
 })
 watch(() => person.job ,副作用函数,{ deep: true })

watchEffect 监听

传入的一个回调函数作为参数,回调函数也不用接收任何值,当函数体内的依赖项变化的时候,重新执行 watchEffect 函数,并且该函数默认会执行一次,也就是默认开启了 immediate。

    const person = reactive({
      name: '张三',
      age: 19
    })

    watch(person, (newVal, oldVal) => {
      console.log('oldVal', oldVal);
      console.log('newVal', newVal);
    })

    watchEffect(() => {
      const name = person.name
      // name如果变化了,watchEffect函数会立即执行
    })

和 cumputed 的不同点

  • cumputed 必须写返回值,并且 cumputed 能缓存结果
  • watchEffect 不用直接指定要监视的数据, 回调函数中使用的哪些响应式数据就监视哪些响应式数据,默认初始时就会执行第一次, 从而可以收集需要监视的数据
    监视数据发生变化时回调
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值