【问题标题】:VueJS can't bind input to properties generated in beforeMount hookVueJS 无法将输入绑定到 beforeMount 钩子中生成的属性
【发布时间】:2020-03-03 17:40:36
【问题描述】:

我正在尝试在beforeMount 挂钩中生成一系列嵌套的对象。 我尝试在输入之间强制执行的任何数据绑定都不起作用。没有错误。

这是我正在做的一个简单版本,它封装了问题。

new Vue({
  el: "#app",
    data () {return {
    multi: {}, 
    ids: ["eaf", "6ef", "3ey"]
  }},
  beforeMount () {
    this.ids.forEach(i=> {
    	this.multi[i] = {
      	name: "",
      }
    })
  }
})
<div id="app">
  
  <div id="group" v-for="(i, index) in ids">
    <p>Group {{i}}</p>
    <p>{{multi[i].name}}</p>
    
    <input type="text" v-model="multi[i].name">
  </div>
</div>

v-model 绑定不起作用。

【问题讨论】:

    标签: javascript vue.js data-binding


    【解决方案1】:

    Vue 不会检测已经反应的对象中的新道具。您应该使用 Vue.$set 或预先创建带有所有必要道具的 multi 对象。见Detection caveats

    【讨论】:

    • 哦,我明白了.. 该死的我也这么想。我正在创建的对象非常大,并且考虑到上下文,我无法提前知道该对象将有多大或它将包含哪些属性。我将研究vue set。非常感谢,
    【解决方案2】:

    填充对象不需要多次调用$set。你也可以这样做:

    beforeMount () {
        const multi = {};
        this.ids.forEach(i=> {
            multi[i] = {
              name: "",
            }
        })
        this.multi = multi;
    }
    

    之所以有效,是因为您无需在this.multi 上设置属性,而是创建一个新对象并将现有数据属性设置为它。 Vue 可以检测到这种变化。

    【讨论】:

    • 哦,我明白了。我不知道。非常感谢您分享。
    • 不客气。我更喜欢尽可能少地使用$set,它并没有在 Vue 3 中使用。另外,直接设置数据还允许在其他地方(如外部 API)创建对象,而无需导入 Vue 并使用 @ 987654325@.
    猜你喜欢
    • 2021-01-09
    • 2020-08-10
    • 2018-05-30
    • 2019-09-24
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2018-04-03
    相关资源
    最近更新 更多