一:组件通信方式-父组件给子组件传值
- 子组件通过props接收数据
- 父组件给子组件通过相应属性传值
二:组件通信方式-子组件给父组件传值
- 组件通过$emit
- 父组件通过$on
三:组件通信方式-父组件给子组件传值
- 使用事件中心 Event.bus
四:其他常见的组件通信方式
-
$root(获取当前Vue实例的根组件实例)
-
$parent(获取父组件的属性和方法)
-
$children (获取子组件的属性和方法)
-
$refs (在普通HTML标签上是使用获取到的是DOM ,在组件标签上使用获取到的是组件实例)
五:Vuex状态管理库
- Vuex是专门为Vue.js设计的状态管理库
- Vuex采用集中式的方式存储需要共享的状态
- Vuex的作用是进行状态管理,解决负责组件通信,数据共享
- Vuex集成到了devtools中,提供历史回滚功能
六:什么情况下使用Vuex
- 非必要情况下不要使用Vuex(项目不大,组件间共享不多)
- 大型的单页面应用程序,解决多个视图依赖于同一个状态,来自不同视图的行为,需要更变同一状态
七:Vuex的核心概念
- state是管理的全局状态,把状态绑定到组件(视图),渲染到界面展示给用户,用户可以通过比如按钮等进行交互,通过dispatch分发到Actions,不直接提交Mutations是因为Actions可以进行异步操作,异步操作完成后通过commit提交到Mutations进行更改,Mutations是同步的,所有状态的修改是通过Mutations,通过Mutations的目的是可以追踪状态的所有变化
- Store是一个容器,包含着应用中的大部分状态,我们不能直接改变Store中的状态,需要提交MUtations中进行改变
- State是一个状态保存在Store中
- Getter就像是vue中的计算属性,内部可以对计算的结果进行缓存,只有当依赖的状态发生改变的时候才会重新去计算
- Mutation状态的变化必须提交Mutations来完成
- Action和MUtations类似,不同的是Actions可以进行异步操作,内部改变状态的时候都需要提交Mutations
- Module模块,可以将Store分割为模块,每个模块拥有自己的Store,State,Getter,Mutation,Action
八:基本代码结构
-
创建store.js文件,安装Vuex
-
导入Vue import Vue from 'vue'
-
导入Vuex import Vuex from 'vuex'
-
使用Vue.use注册组件 Vue.use(Vuex)
-
导出 new Vuex.Store
-
在app.js中 导入 import store from './store'
-
在创建Vue示例对象的时候传入
export default new Vuex.Strore({ state: {}, mutations: {}, actions: {}, modules: {} })
九:State
-
state是单一状态树,里面集中存储使用的状态数据,并且state是响应式的,我们获取数据的时候可以直接在state获取
-
$store.state.count 可以获取state的count数据
-
$store.state.msg 可以获取state的msg数据
-
当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按键几次,manState 函数返回的是一个对象。我们需要使用一个函数将多个对象合并为一个,已使我们可以将最终对象传给 computed 属性
-
{{ count }} 使用mapState可以直接获取
-
{{ msg }} 使用mapState可以直接获取
-
使用对象方式重新命名
-
{{ num }} 使用mapState可以直接获取
-
{{ message }} 使用mapState可以直接获取
十:Getter
-
Vuex的getter类似于vue中的计算属性
-
Vuex 允许我们在 Store 中定义getter(可以认为是 store 的计算属性)。就像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算
-
没有使用mapGetter {{ $store.getters.reverseMsg }}
-
使用mapGetter {{ reverseMsg }}
十一:Mutations
-
$store.commit('increate', 1) 没有是要映射
-
increate(1) 使用映射
十二:Actions
-
需要执行异步操作,那么就需要使用Action
-
$store.dispatch('increateAsync', 3)
-
increateAsync(3)
十三:Module
- 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store对象就可能变得相当臃肿。
- 为了解决以上问题,Vuex允许我们将 store 分割成模块(module)。每个模块拥有自己的state,mutations,actions,getter,甚至是嵌套子模块——从上至下进行同样方式的分割
- 使用模块后怎么使用状态,a是模块名称,products是模块中state的属性
- 获取 $store.state.a.products
- 提交 $store.commit
命名空间
-
默认情况下,模块内部的 action, mutation 和 getter 是注册在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应
-
如果希望你的模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,他的所有 getter,action 及 mutation都会自动根据模块注册的路径调整命名
-
使用命名空间后使用map方法,第一个参数需要增加模块名称
-
...mapState('模块名称',和原来参数一样是对象或者数组)
十四:Vuex严格模式
-
开启严格模式如果没有通过Mutation进行修改的话,会报错
-
不要在生产模式下开启,会影响新能,因为严格模式会深度检测状态树来检测不合规的状态更改