【问题标题】:Vue.js - Values created in a method (on-click) not being displayed in a v-for loopVue.js - 在方法(单击)中创建的值未显示在 v-for 循环中
【发布时间】:2018-12-01 22:57:19
【问题描述】:

我希望程序获取一些数据@click,然后将其显示在v-for 循环中。

单击按钮后,数据会显示在控制台中,但我没有看到页面上显示任何内容。

是不是因为在元素渲染之后创建了数据? 如何让 Vue 重新渲染循环以显示获取的数据?

代码笔:https://codepen.io/x84733/pen/jKxQKo?editors=1010

<v-btn @click="fetchData">
  fetch propeties 
</v-btn>

<h2>Properties:</h2>
<div v-for="item in properties">
  <div>{{item.title}}: {{item.value}}</div>
</div>

...  

data () {
  return {
    properties: {}
  }
},
methods: {
  fetchData () {
    var nameObj = {'title': 'name'}
    var sizeObj = {'title': 'size'}

    nameObj['value'] = 'file.txt'
    sizeObj['value'] = 12

    this.properties['name'] = nameObj
    this.properties['size'] = sizeObj

    console.log(this.properties)
  }
}

【问题讨论】:

标签: vue.js vuejs2


【解决方案1】:

在 vuejs 的文档中明确提到 v-for 用于数组而不是对象。

https://vuejs.org/v2/guide/list.html

您的属性是一个名称为大小的对象。

进行此更改

new Vue({
  el: '#app',
  data () {
    return {
      properties: []
    }
  },
  methods: {
    fetchData () {
      var nameObj = {'title': 'name'}
      var sizeObj = {'title': 'size'}
      
      nameObj['value'] = 'file.txt'
      sizeObj['value'] = 12
      
      this.properties.push(nameObj)
      this.properties.push(sizeObj)
      
      console.log(this.properties)
    }
  }
})

在此更改后,您的代码将正常工作

【讨论】:

  • 但是如果我像这样手动创建对象(在循环渲染之前):properties: {filename: {'title': 'filename': 'value': 'file.txt'}} 然后它会显示它。如果方法创建了对象,为什么不显示对象?
  • @Un1 因为向对象添加新属性不是反应性的(您必须强制更新)。在此处阅读有关反应性警告:vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats
  • 啊,明白了,非常感谢代码和解释!
猜你喜欢
  • 2019-08-20
  • 2019-02-04
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多