Vue.js 3 - 替换/更新反应性对象而不会失去反应性

cla*_*.io 3 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?
        }
      })
    })
  }
Run Code Online (Sandbox Code Playgroud)

formData = data 不会工作,而且 formData = { ...formdata, data }

有一个更好的方法吗?

ash*_*nde 18

尽管 Boussadjra Brahim 的解决方案有效,但它并不是问题的确切答案。

从某种意义上说,反应数据不能重新分配,=但它们是重新分配反应数据的一种方式。它是Object.assign

因此这应该工作

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

注意:当你的反应对象为空或总是包含相同的键时,解决方案是最好的方法;但是如果 egformDatakey xdata没有key x然后 after Object.assignformData仍然会有key x,所以不是严格不重新分配。

  • 那么如果我们想要把x键也删除的话该怎么办呢? (5认同)

Bou*_*him 5

reactive 应该定义一个带有嵌套字段的状态,这些字段可以像以下那样进行变异:

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

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

  }
Run Code Online (Sandbox Code Playgroud)

或者如果您只有一个嵌套字段,请使用 ref :

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

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

  }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这将_替换_而不是*更新*对象。得票较多的答案应该用于更多用例。 (2认同)