Vuex入门
1. 介绍
1.1. 组件化开发
在现代 Web 开发复杂多变的需求驱动之下,组件化开发已然成为了事实上的标准。

组件化开发为我们带来了:
- 更快的开发效率
- 更好的可维护性
1.2. 组件内的状态管理流程
每个组件都有自己的状态、视图和行为等组成部分。
new Vue({
// state
data() {
return {
count: 0,
};
},
// view
template: `
<div>{{ count }}</div>
`,
// actions
methods: {
increment() {
this.count++;
},
},
});
- state,驱动应用的数据源;
- view,以声明方式将 state 映射到视图;
- actions,响应在 view 上的用户输入导致的状态变化
以下是一个表示“单向数据流”理念的简单示意:

1.3. 组件通信
然而大多数场景下的组件都并不是独立存在的,而是相互协作共同构成了一个复杂的业务功能。在 Vue 中为不同的组件关系提供了不同的通信规则。

- 父子关系
- 非父子
- 。。。
1.3.1. 父传子:Props Down
<blog-post title="My journey with Vue"></blog-post>
Vue.component("blog-post", {
props: ["title"],
template: "<h3>{{ title }}</h3>",
});
1.3.2. 子传父:Events Up
在子组件中使用 $emit 发布一个自定义事件:
<button v-on:click="$emit('enlarge-text')">Enlarge text</button>
在使用这 个组件的时候,使用 v-on 监听这个自定义事件
<blog-post ... v-on:enlarge-text="postFontSize += 0.1"></blog-post>
1.3.3. 通过 ref 获取子组件
在使用组件的时候,添加 ref 属性:
<blog-post title="My journey with Vue" ref="post"></blog-post>
然后使用 $refs 访问:
this.$refs.post;
1.3.4. 非父子:Event Bus
我们可以使用一个非常简单的 Event Bus 来解决这个问题:
event-bus.js :
export default new Vue();
然后在需要通信的两端:
使用 $on订阅:
// 没有参数
bus.$on("自定义事件名称", () => {
// 执行操作
});
// 有参数
bus.$on("自定义事件名称", (data) => {
// 执行操作
});
使用$emit发布:
// 没有自定义传参
bus.$emit("自定义事件名称");
// 有自定义传参
bus.$emit("自定义事件名称", 数据);