广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买
本篇文章带大家学习vue3,深入聊聊计算属性computed与侦听器watch的使用方法,希望对大家有所帮助!
一、watch1.检测reactive内部数据
<template> <p>{{ obj.hobby.eat }}</p> <button @click="obj.hobby.eat = '面条'">click</button></template><script> import { watch, reactive } from 'vue' export default { name: 'App', setup() { const obj = reactive({ name: 'ifer', hobby: { eat: '西瓜', }, }) watch(obj, (newValue, oldValue) => { // 注意1:监听对象的时候,新旧值是相等的 // 注意2:强制开启深度监听,配置无效 console.log('触发监听'); console.log(newValue === oldValue) // true }) return { obj } }, }</script>登录后复制
注意点:对 reactive 自身的修改则不会触发监听。【相关推荐:vuejs视频教程、web前端开发】
<template> <p>{{ obj.hobby.eat }}</p> <button @click="obj.hobby = { eat: '面条' }">click</button></template><script> import { watch, reactive } from 'vue' export default { name: 'App', setup() { const obj = reactive({ name: 'ifer', hobby: { eat: '西瓜', }, }) watch(obj.hobby, (newValue, oldValue) => { // obj.hobby = { eat: '面条' } console.log('对 reactive 自身的修改不会触发监听') }) return { obj } }, }</script>登录后复制
一定得注意不能修改reactive本身,修改本身不触发
2.监听 ref 数据
2.1监听一个 ref 数据<template> <p>{{ age }}</p> <button @click="age++">click</button></template><script> import { watch, ref } from 'vue' export default { name: 'App', setup() { const age = ref(18) // 监听 ref 数据 age,会触发后面的回调,不需要 .value watch(age, (newValue, oldValue) => { console.log(newValue, oldValue) }) return { age } }, }</script>登录后复制2.2监听多个 ref 数据
可以通过数组的形式,同时监听 age 和 num 的变化。
<template> <p>age: {{ age }} num: {{ num }}</p> <button @click="handleClick">click</button></template><script> import { watch, ref } from 'vue' export default { name: 'App', setup() { const age = ref(18) const num = ref(0) const handleClick = () => { age.value++ num.value++ } // 数组里面是 ref 数据 watch([age, num], (newValue, oldValue) => { console.log(newValue, oldValue) }) return { age, num, handleClick } }, }</script>登录后复制
立即触发监听属性:
{ immediate: true, }登录后复制
<template> <p>{{ age }}</p> <button @click="handleClick">click</button></template><script> import { watch, ref } from 'vue' export default { name: 'App', setup() { const age = ref(18) const handleClick = () => { age.value++ } watch( age, (newValue, oldValue) => { console.log(newValue, oldValue) // 18 undefined }, { immediate: true, } ) return { age, handleClick } }, }</script>登录后复制
开启深度监听 ref 数据
? 问题:修改 ref 对象里面的数据并不会触发监听,说明 ref 并不是默认开启 deep 的。见下登录后复制
<template> <p>{{ obj.hobby.eat }}</p> <button @click="obj.hobby.eat = '面条'">修改 obj.hobby.eat</button></template><script> import { watch, ref } from 'vue' export default { name: 'App', setup() { const obj = ref({ hobby: { eat: '西瓜', }, }) // 注意:ref 监听对象,默认监听的是这个对象地址的变化 watch(obj, (newValue, oldValue) => { console.log(newValue === oldValue) }) return { obj } }, }</script>登录后复制
面对这样的没有触发watch我们解决办法有三个:
解决 1:当然直接修改整个对象的话肯定是会被监听到的(注意模板中对 obj 的修改,相当于修改的是 obj.value)。 -`{{ obj.hobby.eat }}
`
解决 2:开启深度监听 ref 数据。watch( obj, (newValue, oldValue) => { console.log(newValue, oldValue) console.log(newValue === oldValue) }, { deep: true, })登录后复制
解决 3:还可以通过监听 ref.value 来实现同样的效果。就加上一句话,故此没有截图
因为 ref 内部如果包裹对象的话,其实还是借助 reactive 实现的,可以通过 isReactive 方法来证明。
<template> <p>{{ obj.hobby.eat }}</p> <button @click="obj.hobby.eat = '面条'">修改 obj</button></template><script> import { watch, ref } from 'vue' export default { name: 'App', setup() { const obj = ref({ hobby: { eat: '西瓜', }, }) watch(obj.value, (newValue, oldValue) => { console.log(newValue, oldValue) console.log(newValue === oldValue) }) return { obj } }, }</script>登录后复制监听普通数据 监听响应式对象中的某一个普通属性值,要通过函数返回的方式进行(如果返回的是对象/响应式对象,修改内部的数据需要开启深度监听)。
<template> <p>{{ obj.hobby.eat }}</p> <button @click="obj.hobby = { eat: '面条' }">click</button></template><script> import { watch, reactive } from 'vue' export default { name: 'App', setup() { const obj = reactive({ name: 'ifer', hobby: { eat: '西瓜', }, }) watch(obj.hobby, (newValue, oldValue) => { // obj.hobby = { eat: '面条' } console.log('对 reactive 自身的修改不会触发监听') }) return { obj } }, }</script>0登录后复制二、computed
作用:computed 函数用来定义计算属性,上述的基础概念都是同vue2一样的,关于vue2中这两个知识点的定义大家可以移步:【vue2】计算与侦听的用法。
<template> <p>{{ obj.hobby.eat }}</p> <button @click="obj.hobby = { eat: '面条' }">click</button></template><script> import { watch, reactive } from 'vue' export default { name: 'App', setup() { const obj = reactive({ name: 'ifer', hobby: { eat: '西瓜', }, }) watch(obj.hobby, (newValue, oldValue) => { // obj.hobby = { eat: '面条' } console.log('对 reactive 自身的修改不会触发监听') }) return { obj } }, }</script>1登录后复制
(学习视频分享:vuejs入门教程、编程基础视频)
以上就是聊聊vue3中watch和computed的使用方法的详细内容,更多请关注9543建站博客其它相关文章!
发表评论