更改响应式状态时,它可能会同时触发 [Vue 组件更新] & [侦听器回调]
默认情况下,用户创建的侦听器回调,都会在 Vue 组件更新之前被调用
这意味着你在侦听器回调中访问的 DOM 将是被 Vue 更新之前的状态
如果想在侦听器回调中能访问被 Vue 更新之后的DOM,需要配置 flush: 'post'
:
watch(source, callback, { flush: 'post' })
watchEffect(callback, { flush: 'post' })
后置刷新的 watchEffect()
有个更方便的别名 watchPostEffect()
:
import { watchPostEffect } from 'vue'
watchPostEffect(() => { })
# computed- 在组合式 API 中,计算属性 computed 是一个函数1. 完整写法 - 接收一个 [配置对象] 作为参数:`computed( { get(){ return X }, set(val){ } } )` 配置对象有 2 个配置项:getter、setter; getter:获取当前计算属性时触发;返回一个 ref 对象; setter:修改当前计算属性时触发;新值会作为参数传入; computed 会自动追踪响应
一、computed 和 watch 都可以观察页面的数据变化。当处理页面的数据变化时,我们有时候很容易滥用watch。 而通常更好的办法是使用computed属性,而不是命令是的watch回调。
二、computed:
在vue的 模板内({{}})是可以写一些简单的js表达式的 ,很便利。但是如果在页面中使用大量或是复杂的表达式去处理数据,对页面的维护会有很大的影响。这个时候就需要用到computed 计算属性来处理复杂的逻辑运算
1.优点:
在数据未发生变化时,优先读取缓存。computed 计算属性只有在相关的数据发生变化时才会改变要计算的属性,当相关数据没有变化是,它会读取缓存。而不必想 motheds方法 和 watch 方法是的每次都去执行函数。
2.setter 和 getter方法:(注意在vue中书写时用set 和 get)
setter 方法在设置值是触发。
getter 方法在获取值时触发。
三、watch:
虽然计算属性在大多数情况下是非常适合的,但是在有些情况下我们需要自定义一个watcher,在数据变化时来执行异步操作,这时watch是非常有用的。
watchEffect 的返回值:
watchEffect 的 onCleanup 回调参数:watchEffect 还有一个回调参数,此参数它也是一个函数,作用是清理副作用。
监听一个变量值的变化:
监听多个变量值的变化:
监听对象中具体的值:
监听ref的引用对象(添加参数3):
监听 reactive 定义的响应变量:
const name = ref('漩涡鸣人');
const {username, password} = toRefs(reactive({
username: '宇智波带土',
password: 'zs1262597806'
watch
const countCom = computed(() => count.value + 1);
console.log('count', count); // RefImpl { ..., value: 1 }
console.log('count', countCom)
看下(有this ,但是
vue3 是没有的,我们说过
vue3的this是undefin
ed)
与
vue2 中的
comput
ed 配置功能一致。
(注意的是简写会在修改的时候警告,所以我们按照完整写法写入。)写法:
引入
comput
ed
vue2 中深度监听和立即监听
不过有两个坑要注意:
1:监听reactive定义的响应式数据时:oldvalue无法正确获取。强制开启了深度监听(deep配置失效)。
2:监听reactive定义响应式数据中某个属性时,deep配置有效。代码展示
Vue 的 computed 和 watch 是两种不同的属性。
computed 是一种计算属性,它根据其他属性的变化动态计算属性值,并返回结果。computed 是基于它所依赖的响应式属性进行缓存的,只有在它所依赖的属性发生变化时才会重新计算。computed 比较适用于需要根据多个属性计算出一个结果的场景。
而 watch 则是一种观察属性变化的方式,它可以监听并响应单个属性的变化,从而执行相应的操作。watch 可以利用方法或回调函数来监听一个属性,当属性变化时会自动执行相应的代码。watch 比较适用于需要在属性变化时执行一些异步操作或复杂计算的场景。