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

#vue.js #vuejs3 #vue-composition-api

#vue.js #vuejs3 #vue-composition-api

Вопрос:

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

   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 }

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

Ответ №1:

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

В том смысле, что реактивные данные не могут быть переназначены с = помощью, но это способ переназначения реактивных данных. Это так 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 , так что строго не переназначать.

демонстрационный пример; включая просмотр

Ответ №2:

Согласно официальным документам :

Поскольку отслеживание реактивности Vue работает через доступ к свойствам, мы всегда должны сохранять одну и ту же ссылку на реактивный объект. Это означает, что мы не можем легко «заменить» реактивный объект, потому что связь реактивности с первой ссылкой потеряна

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

  }
 

Комментарии:

1. БУДЬТЕ ОСТОРОЖНЫ, это заменит , а не обновит объект. Ответ с большим количеством голосов следует использовать для большего количества вариантов использования.

2. пожалуйста, прочтите это Это означает, что мы не можем легко «заменить» реактивный объект, потому что соединение реактивности с первой ссылкой теряется из vuejs.org/guide/essentials /…

Ответ №3:

Я думаю , что:

 formData = reactive(newObject)
 

Комментарии:

1. Как это отвечает на вопрос, где OP спрашивает, как обновить объект? Как этот ответ улучшает существующие?

2. Это не сработает. Смотрите документацию здесь: vuejs.org/guide/essentials /…