文章目录
- 一、问题一:reactive 定义的响应式数据无 oldValue
 - 问题
 - 分析
 - 解决
 
- 二、问题二:watch默认开启了深度监视且无法关闭
 - 问题
 - 分析
 - 解决
 
一、问题一:reactive 定义的响应式数据无 oldValue
问题
- 监视 reactive 所定义的一个响应式数据,是无法正确获取到 oldValue 的
 - 源码如下:
 
<script setup lang="ts">
import { ref, reactive, watch } from "vue";
const dataInfo = reactive(
  {
    'name': '法外狂徒张三',
    'age': 15
  }
)
watch(dataInfo, (newValue, oldValue) => {
  console.log(newValue, oldValue);
})
setTimeout(() => {
  dataInfo.age++;
  dataInfo.name += '!'
}, 5200);
</script>
 
- 运行结果如下

 - 从运行结果可以看出,获取到的 newValue 和 oldValue 两者是一样的
 
分析
我们从 Vue3 官网可以了解到: newValue 此处和 oldValue 是相等的, 除非 state.someObject 被整个替换了
 
解决
开发中如果要用到 oldValue 的值,可以对象中的该值单独提出作为 ref 去包裹使用
二、问题二:watch默认开启了深度监视且无法关闭
文章目录
- 一、问题一:reactive 定义的响应式数据无 oldValue
 - 问题
 - 分析
 - 解决
 
- 二、问题二:watch默认开启了深度监视且无法关闭
 - 问题
 - 分析
 - 解决
 
问题
- 当我们想要监视一个多层级的数据时,Vue2 需开启深度监视,但Vue3会默认开启,当我们选择关闭深度监视时,时无法关闭的
 - 源码如下:
 
<script setup lang="ts">
import { ref, reactive, watch } from "vue";
const dataInfo = reactive(
  {
    'name': '法外狂徒张三',
    'age': 15,
    'data':{
	    data1:1,
	    data2:2,
  }
)
watch(dataInfo, (newValue, oldValue) => {
  console.log(newValue, oldValue);
},{deep:false})
setTimeout(() => {
  dataInfo.data.data1++;
  dataInfo.name += '!'
}, 5200);
</script>
 
分析
当我们想要监视一个多层级的数据时,Vue2 需开启深度监视,但Vue3会默认开启,当我们选择关闭深度监视时,时无法关闭的
解决
监视 reactive 定义响应式对象的向里一级,开启深度监听 deep:true 是有用的
<script setup lang="ts">
import { ref, reactive, watch } from "vue";
const dataInfo = reactive(
  {
    'name': '法外狂徒张三',
    'age': 15,
    'data':{
	    data1:1,
	    data2:2,
  }
)
watch(dataInfo.data, (newValue, oldValue) => {
  console.log(newValue, oldValue);
},{deep:true})
setTimeout(() => {
  dataInfo.data.data1++;
  dataInfo.name += '!'
}, 5200);
</script>
                


















