computed&watch

发布时间 2023-11-03 15:50:30作者: CrashedCat

computed计算属性

对于任何复杂逻辑,你都应当使用计算属性。
computed计算属性的作用是对数据的计算和缓存,优点是能够提高性能。
vue2中,没咋用vue2写过项目,所以基本的代码展示都以vue3的格式。

method:{},
computed:{},

vue3

const num1 = ref('')
      const num2 = ref('')
      const num3 = computed(() => {
        return Number(num1.value) + Number(num2.value)
      })
 // 计算属性求和->不能直接修改,修改必须实现set方法
      const num3 = computed({
        get: () => {
          return Number(all.num1) + Number(all.num2)
        },
        set:(value) => {
          console.log(value)
          return all.num2 = Number(value) + 1
        }
      })

监听watch

监听基本属性

const nums = ref(9)
watch(nums, (newValue, oldValue) => {
    console.log('watch 已触发', newValue)
})

监听复杂类型

const demo = reactive({
	name: '小王',
	nickName: '小王',
	soulmate: {
		name: '',
		nickName: ''
	}
})

//1.监听整个对象,只要这个对象有任何修改,那么就会触发 watch 方法。
watch(demo, (newValue, oldValue) => {
    console.log('watch 已触发', newValue)
})
//2.监听对象的所有属性,跟第一种效果一样
watch(() => demo, (newValue, oldValue) => {
	console.log('watch 已触发', newValue)
}, { deep: true })
//3.监听具体属性
watch(() => demo.name, (newValue, oldValue) => {
    console.log('watch 已触发', newValue)
})
//4.只监听子属性,(孙属性都不行)
watch(() => ({ ...demo }), (newValue, oldValue) => {
    console.log('watch 已触发', newValue)
})
//组合监听,用数组包括不同的类型,但是我觉得这样的可读性不是很好,还是要根据具体业务来
watch([() => demo.name, nums], ([newName, newNums], [oldName, oldNums]) => {
	console.log('watch 已触发: name', newName)
	console.log('watch 已触发: nums', newNums)
})

第三个参数,有immediate和deep两种,immediate 的作用就是设置是否立即执行监控,当我们将其值设置为 true 时,那么被监控的对象在初始化时就会触发一次 watch 方法,相当于页面一刷新就会触发。

computed和watch的区别

1、computed是计算属性;watch是监听,监听data中的数据变化。

2、computed支持缓存,当其依赖的属性的值发生变化时,计算属性会重新计算,反之,则使用缓存中的属性值;watch不支持缓存,当对应属性发生变化的时候,响应执行。

const dataSource = computed({
  get() {
    return {
      fieldList: dataList.value,
    };
  },
  set(newValue) {
    const newList = newValue.fieldList;
    const newAllDataList = allDataList.value.map((table) => {
      const newTable = newList.find((item) => item.tableName === table.tableName);
      return newTable || table;
    });
    setAllDataList(newAllDataList);
  },
});

3、computed不支持异步,有异步操作时无法监听数据变化;watch支持异步操作。

4、computed第一次加载时就监听;watch默认第一次加载时不监听
immediate 组件创建时刻执行与否
immediate: true,第一次加载时监听(默认为false)

watch(() => props.visible, (value) => {
  if (value) {//value的值就是props.visible,当数据变化时触发操作
    showSelectTableDialog.value = true;// 每次都默认打开
  }
}, { immediate: true });

deep 深度监听 不推荐使用(非常的消耗性能)
监听的属性是对象的话 不开启deep 对象子属性变化不会触发watch
开启了deep 对象内部所有子属性变化 都会触发watch
[deep还没有用过,不是特别理解]
5、computed中的函数必须调用return(计算后要有一个结果噻);watch不是。

6、使用场景:
computed:一个属性受到多个属性影响,如:购物车商品结算。
watch:一个数据影响多条数据,如:搜索数据。
数据变化响应,执行异步操作,或高性能消耗的操作,watch为最佳选择。

参考资料:
https://www.cnblogs.com/meirongliu/p/17184104.html
https://blog.csdn.net/weixin_64222137/article/details/129880092