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

Vue3不同挂载写法下外部为实例data属性赋值不生效问题咨询

问题核心原理

两个写法的本质差异是Vue.createApp()和mount()的返回值类型完全不同:

  • Vue.createApp(...)返回的是Vue应用实例,这个实例主要用于全局配置(比如注册全局组件、插件),不会挂载你在组件配置中定义的响应式data属性,你给它新增的players只是普通自定义属性,不会被Vue响应式系统监听,自然无法触发视图更新。
  • mount(...)执行后返回的是根组件实例,你在data中声明的所有响应式属性都会直接挂载到这个实例上,修改它的属性会被响应式系统捕获,触发视图重渲染。

无法运行的代码问题点

你第一段代码先把应用实例赋值给app变量,再单独执行mount,没有接收mount的返回值:

let app= Vue.createApp({
    data() {
        return {
            players : []
        }
    },
})
// mount返回的根组件实例没有被赋值给app
app.mount("#app") 
// 此处是给应用实例新增普通属性,和响应式系统完全无关
app.players=[
    {name: 'nobita', age: 13},
    {name: 'suneo', age: 13},
    {name: 'sizuka', age: 13},
    {name: 'takeshi', age: 13},
]

这种写法里app是应用实例,修改它的属性不会触发任何响应式更新。


可正常运行的代码逻辑

你第二段代码用链式调用,直接把mount的返回值赋值给了app:

// app接收的是mount返回的根组件实例
let app= Vue.createApp({
    ...
}).mount("#app")  
// 此处修改的是根组件实例上的响应式属性,会被Vue监听
app.players=[
    {name: 'nobita', age: 13},
    {name: 'suneo', age: 13},
    {name: 'sizuka', age: 13},
    {name: 'takeshi', age: 13},
]

此时app就是根组件实例,上面的players是你提前声明的响应式属性,赋值会触发视图更新。


拓展写法

如果要分开写createApp和mount,只需要单独接收mount的返回值即可:

const app = Vue.createApp({/* 配置 */})
const vm = app.mount("#app") // vm为根组件实例
vm.players = [/* 数据 */] // 同样能触发响应式更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:57:04