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

如何在原生JavaScript中获取Vue.js组件的data属性值

Vue3原生JS获取组件data数据解决方案

结论

该需求可以正常实现,你的写法错误原因如下:

  • app.component()返回的btn是组件定义对象,而非页面中实际渲染的组件实例,它的data属性是你声明的函数,不是执行后生成的响应式数据对象,因此无法直接读取count。
  • 组件实例需要在应用完成挂载、组件渲染后才会生成,你在app.mount()执行前就打印取值,此时实例还未创建。

正确实现方式

步骤1:给子组件绑定ref

在模板中使用button-counter组件时添加ref属性,用于关联组件实例:

<button-counter ref="counter"></button-counter>

步骤2:挂载完成后读取实例数据

app.mount()执行后会返回根组件实例,通过根实例的$refs即可获取绑定的子组件实例,读取count属性:

// 挂载应用,获取根组件实例
const rootInstance = app.mount("#app")
// 等待DOM更新完成确保实例已生成,也可直接在mount后读取
Vue.nextTick(() => {
  console.log(rootInstance.$refs.counter.count) // 正确输出 0
})

注意事项

如果你直接执行btn.data()可以拿到{count: 0},但这只是组件定义的初始数据模板,和页面中运行的组件实例数据相互独立,修改该值不会同步到页面,要获取运行时的实时数据必须读取组件实例的属性。

修正后完整代码

<div id="app" v-cloak>
  <h1>{{greeting}}</h1>
  <button-counter ref="counter"></button-counter>
</div>
<script src="https://unpkg.com/vue@next"></script>
<script>
  let app = Vue.createApp({
    data: function(){
      return {
        greeting: "hi"
      }
    }
  })

  app.component('button-counter', {
    data: function () {
      return {
        count: 0
      }
    },
    template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
  })
  // 挂载后取值
  const rootInstance = app.mount("#app")
  Vue.nextTick(() => {
    console.log(rootInstance.$refs.counter.count)
  })
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:45:07