You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt.js Composition API嵌套reactive对象更新后视图不响应问题

问题根因

你遇到的响应失效核心原因是外层root是普通JavaScript对象,并非响应式实例,仅root.data指向的对象是reactive生成的响应式对象。你之前的两种更新方式都是直接替换root.data的引用,普通对象的属性变更不会触发Vue的响应式更新通知,因此页面不会同步刷新。

原有写法的问题

  • $nuxt.$set是Vue2用于给响应式对象新增属性的兼容API,在Composition API场景下不需要使用,且对普通对象root调用该API不会产生响应式效果。
  • Object.assign生成的是全新普通对象,直接赋值给root.data后,root.data的指向从原响应式实例变为普通对象,后续修改也无法触发响应,同时普通对象root的属性变更无法被响应式系统捕获。

解决方案

方案1:将整个root声明为响应式对象(最推荐)

直接把整个root用reactive包裹,嵌套属性的更新、整体替换子属性都能正常触发响应式更新:

<template>
 {{ root.data.name }}
</template> 
<script>
   import { defineComponent, reactive } from '@nuxtjs/composition-api'
   export default defineComponent({
       setup() {
          // 整个root声明为响应式
          const root = reactive({
             data: {
                name: 'default'
             }
          })
          
          // 更新逻辑示例
          const update = () => {
            // 方式1:直接修改嵌套属性
            root.data.name = 'updated name'
            // 方式2:替换整个data属性也可正常触发更新
            // root.data = { name: 'updated name' }
          }

          return { root, update }
       }
   })
</script>

方案2:不修改root结构,直接更新响应式对象内部属性

如果你要保留root为普通对象的原有结构,不需要替换root.data的引用,直接修改它内部的属性即可,因为root.data本身是响应式实例:

// 直接修改响应式对象的属性,无需替换整个data
root.data.name = 'updated name'

内容的提问来源于stack exchange,提问作者Devb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:57:03