自学内容网 自学内容网

vue3 ref reactive响应式数据,赋值的问题、解构失去响应式问题

在 Vue3 中,使用 ref 和 reactive 创建响应式数据时,赋值操作和解构赋值存在一些需要注意的事项。以下是对这些问题的详细解答以及代码示例:

  1. ref reactive 的基本用法

    • ref:主要用于基本数据类型(如 Number、String、Boolean )的响应式处理。通过 .value 属性访问和修改值。
    • reactive:适用于对象或数组类型的数据,将其转换为响应式。直接访问和修改对象的属性。
  2. 响应式数据赋值的问题

    • 错误示范:直接赋值会导致响应性丢失。
      let list = ref([]);
      getList();
      
      async function getList() {
        list = await httpGetList();  // 直接赋值错误
      }
      
      function httpGetList() {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve([1, 2, 3, 4, 5]);
          }, 500);
        });
      }
    • 正确写法:应通过 .value 属性进行赋值。
      let list1 = ref([]);
      getList1();
      
      async function getList1() {
        list1.value = await httpGetList();  // 通过 .value 赋值
      }
  3. reactive 对象的赋值问题

    • 错误示范:直接赋值会导致响应性丢失。
      let list = reactive([]);
      getList();
      
      async function getList() {
        list = await httpGetList();  // 直接赋值错误
      }
    • 正确写法:应使用数组方法如 push 来修改内容。
      let list2 = reactive([]);
      getList2();
      
      async function getList2() {
        let resp = await httpGetList();
        list2.push(...resp);  // 使用 push 方法修改内容
      }
  4. 解构赋值失去响应性的问题

    • 原因:解构赋值会将响应式对象的属性复制到新变量,导致新变量失去响应性。
    • 解决方法:使用 toRefs 函数将响应式对象转换为包含多个 ref 的对象,确保每个属性保持响应性。
      import { reactive, toRefs } from 'vue';
      
      const state = reactive({
        name: '张三',
        age: 14
      });
      
      const stateAsToRefs = toRefs(state);
      // stateAsToRefs 现在是一个包含 ref 属性的对象
      console.log(stateAsToRefs.name.value);  // 输出:张三
      stateAsToRefs.name.value = '李四';
      console.log(state.name);  // 输出:李四

总结来说,在 Vue3 中使用 ref 和 reactive 时,应注意正确的赋值方式和解构赋值导致的响应性丢失问题。通过合理使用 .value 属性和 toRefs 函数,可以有效避免这些问题,确保数据的响应性。


原文地址:https://blog.csdn.net/qq_30193097/article/details/144746074

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!