老样子,先上结论
监听reactive定义的响应式数据时:oldValue无法正确获取.强制开启深度监视(deep失效)
情况1 监视ref定义的一个响应式数据
正常监听
情况2 监视ref定义的多个响应式数据
正常监听
情况3 监视reactive定义的一个响应式数据的全部属性
此处修改任何值,oldValue的值与newValue的值一致(无法获取oldValue)
此时强制开启深度监听,deep配置无效(配置deep:false也可以监听到)
情况4 监视reactive定义的一个响应式数据的某个数据
正常监听
情况5 监视reactive定义的一个响应式数据的某一些数据
正常监听
情况6 特殊情况
正常无法监听
设置deep可以监听到 但是与情况2一致(oldValue无法获取)
上模板
基础结构
<template>
<div>{{ hello }}===={{ vue }}</div>
<div>姓名:{{ name }}</div>
<div>年龄:{{ age }}</div>
<div>爱好:{{ hobby }}</div>
<button @click="btn">修改ref</button>
<button @click="btn1">修改姓名</button>
<button @click="btn2">修改年龄</button>
<button @click="btn3">修改爱好</button>
</template>
<script>
import { reactive, toRefs, ref, watch } from 'vue'
export default {
name: 'Demo',
setup () {
const hello = ref('hello')
const vue = ref(3)
const demo = reactive({
name: '张三',
age: 18,
hobby: { play: '打豆豆' }
})
const btn = () => {
hello.value = 'hello啊'
vue.value = '我是vue3'
}
const btn1 = () => {
demo.name = '李四'
}
const btn2 = () => {
demo.age += 1
}
const btn3 = () => {
demo.hobby.play = '敲代码'
}
return { ...toRefs(demo), btn, btn1, btn2, btn3, hello, vue }
}
}
</script>
<style>
</style>
上代码
注意watch参数的写法
// 情况1 监视ref定义的一个响应式数据
watch(hello, (newValue, oldValue) => {
console.log(newValue, oldValue, 'ref定义的一个响应式数据')
// hello啊 hello ref定义的一个响应式数据
})
// 情况2 监视ref定义的多个响应式数据
watch([hello, vue], (newValue, oldValue) => {
console.log(newValue, oldValue, 'ref定义的多个响应式数据')
// ["hello啊", "我是vue3"]["hello", 3] "ref定义的多个响应式数据"
})
// 情况3 监视reactive定义的一个响应式数据的全部属性
watch(demo, (newValue, oldValue) => {
console.log(newValue, oldValue, 'reactive定义的一个响应式数据的全部属性')
// {name: "李四", age: 18, hobby: {…}} Proxy{name: "李四", age: 18, hobby: {…}} "reactive定义的一个响应式数据的全部属性"
// 注意:此处修改任何值,oldValue的值与newValue的值一致(无法获取oldValue)
// 注意:经测试此时强制开启深度监听,deep配置无效(配置deep:false也可以监听到)
})
// 情况4 监视reactive定义的一个响应式数据的某个数据
watch(
() => demo.name,
(newValue, oldValue) => {
console.log(
newValue,
oldValue,
'reactive定义的一个响应式数据的某个数据'
)
// 李四 张三 reactive定义的一个响应式数据的某个数据
}
)
// 情况5 监视reactive定义的一个响应式数据的某一些数据
watch([() => demo.name, () => demo.age], (newValue, oldValue) => {
console.log(
newValue,
oldValue,
'reactive定义的一个响应式数据的某一些数据'
)
// ["李四", 18]["张三", 18] "reactive定义的一个响应式数据的某一些数据"
// ["李四", 19]["李四", 18] "reactive定义的一个响应式数据的某一些数据"
})
// 情况6 特殊情况
watch(
() => demo.hobby,
(newValue, oldValue) => {
console.log(newValue, oldValue, '特殊情况')
// 无法监听
},
{ deep: true }
// {play: "敲代码"}{play: "敲代码"} "特殊情况"
// 注意:可以监听到 但是与情况2一致(oldValue无法获取)
)