首頁  >  文章  >  web前端  >  vue3怎麼使用reactive包裹數組正確賦值

vue3怎麼使用reactive包裹數組正確賦值

王林
王林轉載
2023-05-16 16:10:066566瀏覽

    使用reactive包裹陣列正確賦值

    需求:將介面請求到的清單資料賦值給回應資料arr

    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);
      });
    };

    vue3使用proxy,對於物件和陣列都無法直接整個賦值。

    使用方法1能理解,直接賦值給用reactive包裹的物件也不能這麼做。

    方法2為什麼不行?

    只有push或根據索引遍歷賦值才可以保留reactive數組的回應性?

    如何方便的將整個陣列拼接到響應式資料上?

    提供幾種辦法

    const state = reactive({
      arr: []
    });
     
    state.arr = [1, 2, 3]

    const state = ref([])
     
    state.value = [1, 2, 3]

    const arr = reactive([])
     
    arr.push(...[1, 2, 3])

    這幾種辦法都可以觸發回應性,推薦第一種

    vue3的reactive重新賦值無效

    vue3官方的文檔說明

    reactive() 傳回一個物件的響應式代理

    所以reactive 方法應該要作用於一個對象Object,如果要使用數組,則需要包裝一下:

    let list = reactive({
        data: [{id: 01, name: 'XXX'}]
    })

    或使用ref:

    let list = ref([{id: 1, name: 'Andy'}])

    已下引用原作者的程式碼:

    import { reactive, ref } from 'vue'
    export default {
      setup() {
        // 需要一个带默认值的数组list;
          let list = reactive([{id: 1, name: 'Andy'}])
        
        // 每次触发事件重置list,把新值放入,此种方式不会触发视图更新
        const checkBtn = () => {
          // 此时重置操作 地址指向变成一个新的地址,不会触发视图更新
          list = [{id: 1, name: 'Andy'}]
          list.push({id: 2, name: 'Lucy'})
        }
        
        // --------------------------------------------------
        // 正确的重置处理方法如下:使用reactive将数组包裹到一个对象中
        let list = reactive({
          data: [{id: 1, name: 'Andy'}]
        });
        const checkBtn = () => {
          list.data = [{id: 1, name: 'Andy'}]
          list.data.push({id: 2, name: 'Lucy'})
        }
        // 或者使用ref
        let list = ref([{id: 1, name: 'Andy'}]);
        const checkBtn = () => {
          list.value = [{id: 1, name: 'Andy'}]
          list.value.push({id: 2, name: 'Lucy'})
        }
        return {
          list,
          checkBtn
        }
      },
    }

    以上是vue3怎麼使用reactive包裹數組正確賦值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除