深入探讨Vue.js组件和组件通信

2020-06-16 06:33:10易采站长站整理

{{todo.title}}
</label>
</li>
</ul>`,
props: {
initList: {
type: Array
}
},
data: function() {
return {
list: [] }
},
events: {
add: function(input) {
if(!input) return false;
this.list.unshift({
title: input,
done: false
});
}
}
});

 然后,因为这是两个组件,当然需要一个 Vue 实例来引导启动,我们的实例如下:


var vm = new Vue({
el: "#todo",
components: {
"todo-form": Form,
"todo-list": List
},
events: {
add: function(input) {
this.$broadcast("add", input);
}
}
});

 注意,其实 Form 和 List 在逻辑上是平级的组件,所以他们没有父子关系,他们共同都是 vm 的孩子。这里 vm 接到 Form 的消息之后会转发给 List。

html 代码就更简单了:


<div id="todo">
<todo-form username='Lily'></todo-form>
<todo-list></todo-list>
</div>

 Slot

通过 Slot 可以实现把父组件渲染出来的HTML插入到子组件中,目前还不清楚什么时候会需要这样做,而且这么做对子组件的侵入性太大。

动态切换组件

这个功能感觉有点多余,感觉很多情况下我们应该是通过逻辑代码来实现切换,而不是通过Vue内置的动态组件来切换。不过用来实现一个类似 tab 切换的功能还是很方便的。

我们这里给 Todo List 增加一个 about 页面。那么首先我们需要把 vm 改成一个组件,这个组件叫 Todo,它就是整个 Todo 页面:


var Todo = Vue.extend({
template: `
<div id="todo">
<todo-form username='Lily'></todo-form>
<todo-list></todo-list>
<slot>not show</slot>
</div>
`,
components: {
"todo-form": Form,
"todo-list": List
},
events: {
add: function(input) {
this.$broadcast("add", input);
}
}
});

 其实改动就第一行。

然后我们需要创建一个 About 组件:


var About = Vue.extend({
template: `
<div id="about">
<p>About Todo List V0.1.0</p>
<p>Content here</p>
</div>`
});

 接下来是重点了,我们要创建一个实例 vm,这vm要负责切换这两个页面:


var vm = new Vue({
el: "body",
data: {
currentView: "todo"
},
components: {
"todo": Todo,
"about": About
}
});