我有这个非常简单的Vue js页面如下:
<html>
<head>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="main-container">
<div id="contact-table">
<table>
<thead>
<tr>
<th>Contact Name</th>
<th>Email</th>
</tr>
</thead>
<tbody v-for="contact in contacts">
<tr v-on:click="selectContact(contact.index)">
<td>
{{contact.name}}
</td>
<td>
{{contact.email}}
</td>
</tr>
</tbody>
</table>
</div>
<div id="contact-form">
<input type="text" v-model="contactName"/>
<input type="text" v-model="contactEmail"/>
<button type="button" v-on:click="updateContact">Update Contact</button>
</div>
</div>
</body>
<script>
var hub = {
contacts: [
{
name: "James",
email: "Jame@bond.com",
index: 0
},
{
name: "Mary",
email: "Mary@lamb.com",
index: 1
}
],
index: 0
};
var contactTable = new Vue({
el: "#contact-table",
data: {
contacts: hub.contacts
},
methods: {
selectContact: function(index) {
hub.index = index;
console.log(hub.index);
}
}
});
var contactForm = new Vue({
el: "#contact-form",
data: {
contactName: hub.contacts[hub.index].name,
contactEmail: hub.contacts[hub.index].email
},
methods: {
updateContact: function() {
hub.contacts[hub.index].name = this.contactName;
hub.contacts[hub.index].email = this.contactEmail;
}
}
});
</script>
</html>
基本上它包含两个Vue部分 - 表格和输入表格。通过单击表中的行,它应该更改输入表单中的值,但是单击“更新联系人”按钮,它应该更新表单详细信息。
第二部分运行良好 - 但是,当我单击表的行时,虽然console.log告诉我hub.index已更新,但输入表单中的视图不是。
我认为这应该是一个双向约束,所以我只是想知道我在哪里做错了。
答案 0 :(得分:1)
你的集线器变量在vue实例之外,所以这个变量不是被动的,这意味着如果这个变量改变了vue将不会更新DOM。您还可以在vue的数据部分中定义hub
并使其成为被动的。
您还需要有一个事件总线,因为您想要通信between your two components,您可以使用$emit发送事件并使用$on收听其他组件中的组件。< / p>
以下是您的代码的工作小提琴:https://jsfiddle.net/mimani/50ajs58L/1/
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<body>
<div id="main-container">
<div id="contact-table">
<table>
<thead>
<tr>
<th>Contact Name</th>
<th>Email</th>
</tr>
</thead>
<tbody v-for="(contact, index) in contacts">
<tr v-on:click="selectContact(index)">
<td>
{{contact.name}}
</td>
<td>
{{contact.email}}
</td>
</tr>
</tbody>
</table>
</div>
<div id="contact-form">
<input type="text" v-model="contactName" />
<input type="text" v-model="contactEmail" />
<button type="button" v-on:click="updateContact">Update Contact</button>
</div>
</div>
</body>
<script>
var hub = {
contacts: [{
name: "James",
email: "Jame@bond.com",
index: 0
}, {
name: "Mary",
email: "Mary@lamb.com",
index: 1
}],
index: 0
};
var bus = new Vue()
var contactTable = new Vue({
el: "#contact-table",
data: {
contacts: hub.contacts
},
methods: {
selectContact: function(index) {
hub.index = index;
console.log(hub.index);
bus.$emit('updateIndex', index)
}
}
});
var contactForm = new Vue({
el: "#contact-form",
data: {
contactName: hub.contacts[hub.index].name,
contactEmail: hub.contacts[hub.index].email,
index: hub.index
},
methods: {
updateContact: function() {
hub.contacts[this.index].name = this.contactName;
hub.contacts[this.index].email = this.contactEmail;
}
},
created() {
var that = this
bus.$on('updateIndex', function(index) {
that.index = index
that.contactName = hub.contacts[that.index].name
that.contactEmail = hub.contacts[that.index].email
})
}
});
</script>
这里我使用了事件总线,但随着应用程序的增长,您可以考虑使用state management技术,它可以为所有组件提供变量,或者您可以使用vuex在社区中流行。您可以查看this和this答案了解更多详情。