vue组件通信及vueX状态管理复习

261 阅读4分钟

一:组件通信方式-父组件给子组件传值

  1. 子组件通过props接收数据
  2. 父组件给子组件通过相应属性传值

二:组件通信方式-子组件给父组件传值

  1. 组件通过$emit
  2. 父组件通过$on

三:组件通信方式-父组件给子组件传值

  1. 使用事件中心 Event.bus

四:其他常见的组件通信方式

  1. $root(获取当前Vue实例的根组件实例)

  2. $parent(获取父组件的属性和方法)

  3. $children (获取子组件的属性和方法)

  4. $refs (在普通HTML标签上是使用获取到的是DOM ,在组件标签上使用获取到的是组件实例)

五:Vuex状态管理库

  1. Vuex是专门为Vue.js设计的状态管理库
  2. Vuex采用集中式的方式存储需要共享的状态
  3. Vuex的作用是进行状态管理,解决负责组件通信,数据共享
  4. Vuex集成到了devtools中,提供历史回滚功能

六:什么情况下使用Vuex

  1. 非必要情况下不要使用Vuex(项目不大,组件间共享不多)
  2. 大型的单页面应用程序,解决多个视图依赖于同一个状态,来自不同视图的行为,需要更变同一状态

七:Vuex的核心概念

  1. state是管理的全局状态,把状态绑定到组件(视图),渲染到界面展示给用户,用户可以通过比如按钮等进行交互,通过dispatch分发到Actions,不直接提交Mutations是因为Actions可以进行异步操作,异步操作完成后通过commit提交到Mutations进行更改,Mutations是同步的,所有状态的修改是通过Mutations,通过Mutations的目的是可以追踪状态的所有变化
  2. Store是一个容器,包含着应用中的大部分状态,我们不能直接改变Store中的状态,需要提交MUtations中进行改变
  3. State是一个状态保存在Store中
  4. Getter就像是vue中的计算属性,内部可以对计算的结果进行缓存,只有当依赖的状态发生改变的时候才会重新去计算
  5. Mutation状态的变化必须提交Mutations来完成
  6. Action和MUtations类似,不同的是Actions可以进行异步操作,内部改变状态的时候都需要提交Mutations
  7. Module模块,可以将Store分割为模块,每个模块拥有自己的Store,State,Getter,Mutation,Action

八:基本代码结构

  1. 创建store.js文件,安装Vuex

  2. 导入Vue  import Vue from 'vue'

  3. 导入Vuex   import Vuex from 'vuex'

  4. 使用Vue.use注册组件  Vue.use(Vuex)

  5. 导出 new Vuex.Store

  6. 在app.js中 导入  import store from './store'

  7. 在创建Vue示例对象的时候传入 

    export default new Vuex.Strore({ state: {}, mutations: {}, actions: {}, modules: {} })

九:State

  1. state是单一状态树,里面集中存储使用的状态数据,并且state是响应式的,我们获取数据的时候可以直接在state获取

  2. $store.state.count 可以获取state的count数据

  3. $store.state.msg 可以获取state的msg数据

  4. 当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按键几次,manState 函数返回的是一个对象。我们需要使用一个函数将多个对象合并为一个,已使我们可以将最终对象传给 computed 属性

  5. {{ count }}  使用mapState可以直接获取

  6. {{ msg }}  使用mapState可以直接获取

  7. 使用对象方式重新命名

  8. {{ num }} 使用mapState可以直接获取

  9. {{ message }} 使用mapState可以直接获取

十:Getter

  1. Vuex的getter类似于vue中的计算属性

  2. Vuex 允许我们在 Store 中定义getter(可以认为是 store 的计算属性)。就像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算

  3. 没有使用mapGetter    {{ $store.getters.reverseMsg }}

  4. 使用mapGetter  {{ reverseMsg }}

十一:Mutations

  1. $store.commit('increate', 1)   没有是要映射

  2. increate(1)   使用映射

十二:Actions

  1. 需要执行异步操作,那么就需要使用Action

  2. $store.dispatch('increateAsync', 3)

  3. increateAsync(3)

十三:Module

  1. 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store对象就可能变得相当臃肿。
  2. 为了解决以上问题,Vuex允许我们将 store 分割成模块(module)。每个模块拥有自己的state,mutations,actions,getter,甚至是嵌套子模块——从上至下进行同样方式的分割
  3. 使用模块后怎么使用状态,a是模块名称,products是模块中state的属性
  4. 获取  $store.state.a.products
  5. 提交  $store.commit

命名空间

  1. 默认情况下,模块内部的 action, mutation 和 getter 是注册在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应

  2. 如果希望你的模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,他的所有 getter,action 及 mutation都会自动根据模块注册的路径调整命名

  3. 使用命名空间后使用map方法,第一个参数需要增加模块名称

  4. ...mapState('模块名称',和原来参数一样是对象或者数组)

十四:Vuex严格模式

  1. 开启严格模式如果没有通过Mutation进行修改的话,会报错

  2. 不要在生产模式下开启,会影响新能,因为严格模式会深度检测状态树来检测不合规的状态更改