vue3 setup 使用catch监听器
简单使用方法之一:

<script> const app = Vue.createApp({ setup() { const { ref, watch } = Vue; // 定义 val const val = ref(""); // 使用监听器,用法之一... watch(val, (currentValue, prevValue) => { console.log(currentValue, prevValue); }) return { val } }, template: ` <div> 测试:<input v-model="val"></input> Value : {{val}} </div> `, }); const vm = app.mount('#root'); </script>
如果你用了 对象,即监听对象里面的某一个 ,那么就用箭头函数的方式即可:

<script> const app = Vue.createApp({ setup() { const { reactive, watch, toRefs } = Vue; // 定义 valObj const valObj = reactive({ val: '' }); // 监听器,主义这里使用的是箭头函数的方式监听val watch(() => valObj.val, (currentValue, prevValue) => { console.log(currentValue, prevValue); }) // 取出val const { val } = toRefs(valObj); return { val } }, template: ` <div> 测试:<input v-model="val"/> <p>val : {{val}}</p> </div> `, }); const vm = app.mount('#root'); </script>
下面这种比较🐮了,合在一起干:
注意看监听器的代码:

<script> const app = Vue.createApp({ setup() { const { reactive, watch, toRefs } = Vue; // 定义 valObj const valObj = reactive({ val: 'val', val2: 'val2' }); // 监听器 对象混合 - 注意看 watch([() => valObj.val, () => valObj.val2], ([newVal, newVal2], [oldVal, oldVal2]) => { console.log("val:"); console.log(newVal, oldVal); console.log("val2:"); console.log(newVal2, oldVal2); }) // 取出val const { val, val2 } = toRefs(valObj); return { val, val2 } }, template: ` <div> 测试val:<input v-model="val"/> <p>val : {{val}}</p> </div> <div> 测试val2:<input v-model="val2"/> <p>val : {{val2}}</p> </div> `, }); const vm = app.mount('#root'); </script>
深度监听,想非惰性?

// 下面加了配置 immediate ,所以深度监听了,变非惰性的了。 watch([() => valObj.val, () => valObj.val2], ([newVal, newVal2], [oldVal, oldVal2]) => { console.log("val:"); console.log(newVal, oldVal); console.log("val2:"); console.log(newVal2, oldVal2); }, { immediate: true })
新玩意:
watchEffect 这玩意没惰性,直接执行的。 immediate
用法差不多,但是看你自己:
这玩意自动检测是否使用或是否以来,制动执行,例:
页面一打开就打印 “我是咸瑜” :
因为 ”我是咸瑜“这个字符串没什么依赖对吧,所以他只打印一次,因为 immediate
那如果我这样:

<script> const app = Vue.createApp({ setup() { const { reactive, watch, watchEffect, toRefs } = Vue; // 定义 valObj const valObj = reactive({ val: 'val', val2: 'val2' }); watchEffect(()=>{ console.log("我有打印val ,所以我将监听val的改变!并打印:",valObj.val); }) // 取出val const { val, val2 } = toRefs(valObj); return { val, val2 } }, template: ` <div> 测试val:<input v-model="val"/> <p>val : {{val}}</p> </div> <div> 测试val2:<input v-model="val2"/> <p>val : {{val2}}</p> </div> `, }); const vm = app.mount('#root'); </script>
你尝试改变val,他会一直打印val,就是i自己感知,然后里面的全打印,全执行,简单点说就是:
无论你改变的是 val 还是 val2 ,三条log 都会执行。
缺点就是 这玩意不能获取之前的值。。。。
如果你想让他失效(灭了他)
这样写即可:
同理,上面那种也是一样的原理,,,自己玩去。。。。
本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/16153309.html