您能否告诉我如何在VUE js中创建组件之间共享数据(创建列表时)。我有两个组件list components
和add todo component
。我想在用户点击时在列表中添加项目add button
。但问题是不同组件中存在的输入字段,列表存在于不同的组件中
这是我的代码
https://plnkr.co/edit/bjsVWU6lrWdp2a2CjamQ?p=preview
//代码在这里
var MyComponent = Vue.extend({
template: '#todo-template',
props: ['items']
});
var AddTODO = Vue.extend({
template: '#add-todo',
props: ['m'],
data: function () {
return {
message: ''
}
},
methods: {
addTodo: function () {
console.log(this.message)
console.log(this.m);
//this.m =this.message;
},
},
});
Vue.component('my-component', MyComponent);
Vue.component('add-todo', AddTODO)
var app = new Vue({
el: '#App',
data: {
message: '',
items: []
},
});
答案 0 :(得分:2)
拥有一个伟大的MVVM框架的关键在于让你拥有一个视图模型:你的页面/ app /中的所有状态的中央存储。组件可以发出事件。你可以有一个活动巴士。 但如果您可以使用包含所有州的简单全局变量来保存当天,这是迄今为止最干净,最好的解决方案。因此,只需将您的待办事项放在数组中,在全局范围内的变量中,然后在需要它们的每个组件的data
中声明它们。 Here it is working in Plunkr。
<强>标记强>
<div id="App" >
<add-todo></add-todo>
<my-component></my-component>
</div>
<template id="add-todo">
<div>
<input type="text" v-model="message">
<button @click="addTodo">Add todo</button>
</div>
</template>
<template id="todo-template">
<div>
<ul >
<li v-for="(item,index) in store.items">
{{item.message}}
</li>
</ul>
</div>
</template>
<script src="vue.js"></script>
<script src="script.js"></script>
<强>码强>
// This is the magic store. This is all you need.
var vueStore = {items : []};
var MyComponent = Vue.extend({
template: '#todo-template',
data : function(){return {store : vueStore}}
});
var AddTODO = Vue.extend({
template: '#add-todo',
data: function () {
return {
message: '',
store : vueStore
}
},
methods: {
addTodo: function (event) {
this.store.items.push({'message' : this.message})
},
},
});
Vue.component('my-component', MyComponent);
Vue.component('add-todo', AddTODO)
var app = new Vue({
el: '#App',
data: {
store : vueStore
},
});
这不是一个野蛮的黑客!我们被要求停止思考事件,提升食物链,并考虑反应管道。组件不关心中央存储何时或由谁更新。 Vue负责照顾它。
Here's关于州管理的页面。
答案 1 :(得分:0)
因此,您可以使用事件并将创建的待办事项发送到根vue实例。 我编辑/分叉你的plunkr(我更喜欢小提琴类型)。
https://plnkr.co/edit/bnMiDmi30vsj3a8uROBK?p=preview
所以我在这里编辑了这一行,它监听自定义事件added
并将第一个参数推送到项目。
<add-todo v-on:added='items.push(arguments[0])'></add-todo>
还有这些发出事件的行。我从属性m
更改为数据message
,因为你不应该改变道具:
<input type="text" v-model="message">
<button @click="$emit('added', message)">Add todo</button>