Vue3_11(Composition API) computed | watchEffect | Watch
响应式计算和侦听 | Vue.js https://v3.cn.vuejs.org/guide/reactivity-computed-watchers.html#%E8%AE%A1%E7%AE%97%E5%80%BC
computed
方式一:接收一个getter函数,并为 getter 函数返回的值,返回一个不变的 ref 对象;
方式二:接收一个具有 get 和 set 的对象,返回一个可变的(可读写)ref 对象;
1 2 3 4 5 6 7 8 9 10 11 12 13 | // 1.用法一: 传入一个getter函数 // computed的返回值是一个ref对象 const fullName = computed(() => firstName.value + " " + lastName.value); // 2.用法二: 传入一个对象, 对象包含getter/setter const fullName = computed({ get : () => firstName.value + " " + lastName.value, set (newValue) { const names = newValue.split( " " ); firstName.value = names[0]; lastName.value = names[1]; } }); |
watchEffect 自动收集响应式数据的依赖
首先,watchEffect传入的函数会被立即执行一次,并且在执行的过程中会收集依赖;其次,只有收集的依赖发生变化时,watchEffect传入的函数才会再次执行
获取watchEffect的返回值函数,调用该函数即可停止侦听
1 2 3 4 5 6 7 8 9 10 | const stop = watchEffect(() => { console.log( "name:" , name.value, "age:" , age.value); }); const changeAge = () => { age.value++; if (age.value > 25) { stop(); } } |
给watchEffect传入的函数被回调时,其实可以获取到一个参数:onInvalidate
当副作用即将重新执行 或者 侦听器被停止(如果在 setup()
或生命周期钩子函数中使用了 watchEffect
,则在组件卸载时)时会执行该函数传入的回调函数
我们可以在传入的回调函数中,执行一些清除工作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | const stop = watchEffect((onInvalidate) => { const timer = setTimeout(() => { console.log( "网络请求成功~" ); }, 2000) // 根据name和age两个变量发送网络请求 onInvalidate(() => { // 在这个函数中清除额外的副作用 // request.cancel() clearTimeout(timer); console.log( "onInvalidate" ); }) console.log( "name:" , name.value, "age:" , age.value); }); |
调整watchEffect的执行时机
默认值是pre,它会在元素 挂载 或者 更新 之前执行;
post,将推迟副作用的初始运行,直到组件的首次渲染完成
sync
,这将强制效果始终同步触发。然而,这是低效的,应该很少需要
1 2 3 4 5 | watchEffect(() => { console.log(title.value); }, { flush: "post" }) |
Watch
懒执行副作用(第一次不会直接执行);
更具体的说明当哪些状态发生变化时,触发侦听器的执行;
访问侦听状态变化前后的值;
侦听单个数据源
一个getter函数:但是该getter函数必须引用可响应式的对象(比如reactive或者ref);
直接写入一个可响应式的对象,reactive或者ref(比较常用的是ref);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | const info = reactive({name: "why" , age: 18}); // 1.侦听watch时,传入一个getter函数 watch(() => info.name, (newValue, oldValue) => { console.log( "newValue:" , newValue, "oldValue:" , oldValue); }) // 2.传入一个可响应式对象: reactive对象/ref对象 // 情况一: reactive对象获取到的newValue和oldValue本身都是reactive对象 watch(info, (newValue, oldValue) => { console.log( "newValue:" , newValue, "oldValue:" , oldValue); }) // 情况二: ref对象获取newValue和oldValue是value值的本身 const name = ref ( "why" ); watch(name, (newValue, oldValue) => { console.log( "newValue:" , newValue, "oldValue:" , oldValue); }) // 如果希望newValue和oldValue是一个普通的对象 watch(() => { return {...info} }, (newValue, oldValue) => { console.log( "newValue:" , newValue, "oldValue:" , oldValue); }) //上面简便写法 watch(() => ({...info}), (newValue, oldValue) => { console.log( "newValue:" , newValue, "oldValue:" , oldValue); }) |
侦听多个数据源
1 2 3 4 5 6 7 8 | // 1.定义可响应式的对象 const info = reactive({name: "why" , age: 18}); const name = ref ( "why" ); // 2.侦听器watch watch([() => ({...info}), name], ([newInfo, newName], [oldInfo, oldName]) => { console.log(newInfo, newName, oldInfo, oldName); }) |
Watch 参数
深层的侦听 设置 deep 为true
立即执行 设置 immediate 为true
分类:
Vue
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!