Vue.js 3 - заменить / обновить реактивный объект без потери реактивности

Мне нужно обновить реактивный объект некоторыми данными после извлечения:

  setup(){
    const formData = reactive({})

    onMounted(() => {
      fetchData().then((data) => {
        if (data) {
          formData = data //how can i replace the whole reactive object?
        }
      })
    })
  }

formData = data не будет работать и formData = { ...formdata, data }

Есть лучший способ сделать это?


person claud.io    schedule 15.01.2021    source источник


Ответы (2)


reactive должен определять состояние с вложенными полями, которые можно изменять, например:

 setup(){
    const data= reactive({formData :null })

    onMounted(() => {
      fetchData().then((data) => {
        if (data) {
          data.formData = data 
        }
      })
    })

  }

или используйте ref, если у вас есть только одно вложенное поле:

  setup(){
    const formData = ref({})

    onMounted(() => {
      fetchData().then((data) => {
        if (data) {
          formData.value = data 
        }
      })
    })

  }
person Boussadjra Brahim    schedule 15.01.2021

Хотя решение Буссаджры Брахима работает, это не точный ответ на вопрос.

В том смысле, что реактивные данные нельзя переназначить с помощью =, но это способ переназначить реактивные данные. Это Object.assign.

Следовательно, это должно работать

    setup(){
        const formData = reactive({})
    
        onMounted(() => {
          fetchData().then((data) => {
            if (data) {
              Object.assign(formData, data) // equivalent to reassign 
            }
          })
        })
      }

Примечание. Решение - лучший способ, когда ваш реактивный объект пуст или всегда содержит одни и те же ключи; но если, например, formData имеет key x, а data не имеет key x, то после Object.assign, formData по-прежнему будет иметь key x, поэтому, строго говоря, не переназначение.

person ashwin bande    schedule 15.01.2021