9.1. 引言
Vue组件化做的确实非常彻底,它独有的vue单文件组件也是做的非常有特色。组件化的同时带来的是:组件之间的数据共享和通信的难题。 尤其Vue组件设计的就是,父组件通过子组件的prop进行传递数据,而且数据传递是单向
的。也就是说:父组件可以把数据传递给子组件,但是 反之则不同。如下图所示:
9.2. 单向数据流动
单方向的数据流动带来了非常简洁和清晰的数据流,纯展示性或者独立性较强的模块的开发确实非常方便和省事。 但是复杂的页面逻辑,组件之间的数据共享处理就会需要通过事件总线的方式解决或者使用Vue的Vuex框架了。
9.3. 子组件通知父组件数据更新:事件方式的实现
子组件可以在子组件内触发事件,然后在父容器中添加子组件时绑定父容器的方法为事件响应方法的方式.如下图所示:
- 使用 v-on 绑定自定义事件
每个 Vue 实例都实现了事件接口(Events interface),即:使用 $on(eventName) 监听事件使用 $emit(eventName) 触发事件
参考代码案例:
Vue入门之event message 推荐次数:{
{ voteCount }}
- { {o}}
9.4. 事件总线方式解决非父子组件数据同步
如果非父子组件怎么通过事件进行同步数据,或者同步消息呢?Vue中的事件触发和监听都是跟一个具体的Vue实例挂钩。 所以在不同的Vue实例中想进行事件的统一跟踪和触发,那就需要一个公共的Vue实例,这个实例就是公共的事件对象。
参考下面做的一个购物车的案例的代码:
Vue入门之event message
9.5. Vuex解决复杂单页面应用
上面的方式只能解决一些简单的页面中的组件的通信问题,但是如果是复杂的单页面应用就需要使用更强大的Vuex来帮我们进行状态的统一管理和同步。
当第一次接触Vuex的时候,眼前一亮,之前经过Redux之后,被它繁琐的使用令我痛苦不已,虽然思路很清晰,其实完全可以设计的更简单和高效。 当我接触到Vuex之后,发现这就是我想要的。的确简洁就是一种艺术。
其实本质上,Vuex就是一个大的EventBus对象的升级版本,相当于一个特定的仓库,所有数据都在统一的仓库中,进行统一的管理。
几个核心的概念:
- State: Vuex仓库中的数据。
- Getter: 类似于Vue实例中的计算属性,Getter就是普通的获取state包装函数。
- Mutations: Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。
- Action: action可以触发Mutations,不能直接改变state。
看下面一张图了解一下Vuex整体的数据流动:
9.6. Vuex实例demo
可能前面的图和概念都太多了,先看一个例子,简单了解一下Vuex中的仓库的数据 怎么整合到 Vue的实例中去。
创建Vuexdemo的项目
# 通过vue-cli创建vuexdemo的项目,注意首先cd到你的存放项目代码的目录vue init webpack vuexdemo# 过程中,会有几个选项你可以选择输入Y或者n来开启或者关闭某些选项。# 创建完成后,就可以通过以下命令,进行初始化和安装相关的依赖项了。cd vuexdemonpm installnpm run dev# 然后安装 vuexnpm i vuex -S 转载:http://aicoder.com/vue/preview/all.html#9
10. 总结
Vue的入门系列基本都写完了,大部分内容是参考了官网的文档。
还有很多内容没有整理到这个系列中。比如:vue的过渡动画,vue的异步刷新队列,vue的过滤器等,我相信你通过本文档就能 实现vue的入门了,那些琐碎的知识点只要看一下官方的文档应该很容入门。
这一次整理过程,让我对Vue有了更深入的认识,之前不熟悉的东西,强迫自己把 文档写一遍后,认识比以前更清晰了。Vue确实带来很多的惊喜。希望这个文档对你有用。