Vue3 reactive 定义一个变量时,如何具有响应式?

错误示范
const arr = reactive([]);
const load = () => {
  const res = [2, 3, 4, 5]; //假设请求接口返回的数据
  // 方法1 失败,直接赋值丢失了响应性
  // arr = res;
  // 方法2 这样也是失败
  // arr.concat(res);
  // 方法3 可以,但是很麻烦
  res.forEach(e => {
    arr.push(e);
  });
};

 错误原因:

 reactive声明的响应式对象被 arr 代理,操作代理对象需要有代理对象的前缀,直接覆盖会丢失响应式。也就是说,vue3 使用proxy,对于对象和数组都不能直接整个赋值

 ref 定义数据(包括对象)时,都会变成 RefImpl(Ref 引用对象) 类的实例,无论是修改还是重新赋值都会调用 setter,都会经过 reactive 方法处理为响应式对象。但是 reactive 定义数据(必须是对象),是直接调用 reactive 方法处理成响应式对象。如果重新赋值,就会丢失原来响应式对象的引用地址,变成一个新的引用地址,这个新的引用地址指向的对象是没有经过 reactive 方法处理的,所以是一个普通对象,而不是响应式对象。

 
实现方案:
// 方案1: 使用ref函数
const state = ref([])
state.value = [1, 2, 3]

// 方案2: 使用数组的push方法
const arr = reactive([])
arr.push(...[1, 2, 3])

  

posted @ 2023-06-02 14:11  小短腿奔跑吧  阅读(294)  评论(0编辑  收藏  举报