【问题标题】:Watching Objects with Sockets in VueJS?在 VueJS 中使用套接字观察对象?
【发布时间】:2016-12-16 06:57:51
【问题描述】:

我正在使用套接字从远程服务器接收数据。

我正在使用以下应用程序 Vue 组件:

let app = {
 name: 'app',
 data: {
  dataStore: {}
 },
 mounted () {
  var vm = this;
  socket.on('data-receive', (data) => { //data = {user: 'myUser' value: 45}
   vm.dataStore[data.user] = data.value // also tried Vue.set(vm.dataStore, data.user, data.value)
   console.log(vm.dataStore)
  })
 }

奇怪的是控制台按预期正确记录了dataStore。甚至 Vue 开发人员工具也显示了存储在 dataStore 中的正确数据。但是,dataStore 在以下 HTML 中呈现为 {}

<app>
{{dataStore}}
</app>

这是渲染的内容:

{}

是否有强制重新渲染?

【问题讨论】:

  • 为什么不将dataStore 引用为this.dataStore
  • 会有所作为吗?
  • in console.log 我认为是的
  • 让我检查一下...
  • 好的然后console.log 打印dataStore 正确然后?

标签: javascript sockets vuejs2


【解决方案1】:

尝试以下:

mounted () {
  var vm = this;
  socket.on('data-receive', (data) => { 
   Vue.set(vm.dataStore, 'user', data.user)   // or vm.$set(...)
   Vue.set(vm.dataStore, 'value', data. value)
   console.log(vm.dataStore)
  })
}

documentation中所述:

Vue 无法检测属性添加或删除。由于 Vue 在实例初始化期间执行 getter/setter 转换过程,因此数据对象中必须存在一个属性,以便 Vue 对其进行转换并使其具有响应性

可以使用Vue.set(object, key, value) 方法向嵌套对象添加反应属性:

编辑:

正如评论中所建议的,由于代码在套接字中,这可能发生在 vue 实例之外,并且使用 forceUpdate 在 HTML 中呈现更新的变量。

【讨论】:

  • 我尝试使用Vue.set(),但失败了。即使那时我也没有渲染
  • 如果我想这样做怎么办:这行得通吗? Vue.set(vm.dataStore, data.user, data.value)?因为我有很多用户要跟踪
  • 这不起作用.. conole.log 像以前一样工作,但我仍然只有渲染有问题。强制渲染的东西?
  • @FaizuddinMohammed 是 app 一个 vue 组件,为什么我要问的是 data must be a function 是 vue 组件。
  • 使用Vue.$forceUpdate() 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-01-21
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2018-07-12
  • 2018-04-13
  • 2022-11-25
相关资源
最近更新 更多