vuex总结

 
1、是什么
 
Vuex是专为Vue应用设计的状态管理模式(状态管理库)。采用集中式存储管理应用的所有组件的状态.
 
状态子管理包括: state(驱动应用的数据源) ,   view(以声明方式将state映射到视图),   action(响应在view层的用户输入导致的状态变化)
 
 
2、何时用
 
vuex帮助我们管理共享状态,但是也附加了更多概念,框架。需要综合权衡短期和长期效益。 如果应用很简单,能不用vuex就不用,
 
(多层嵌套的组件,兄弟组件之间的状态传递)这种情况下,要把组件的共享状态抽取出来,以一个全局单例模式管理。通过定义和隔离状态管理中的各种概念(state,mutations,actions)并强制遵守一定的规则,代码将会变得更结构化且易维护。这样你在阅读代码的时候能更容易地解读应用内部的状态改变。
 
如果有些状态严格属于单个组件,最好还是作为组件的局部状态。
 
 
3、store模式
 
4、vuex和单纯的全局对象有何区别
 
a、Vuex的状态存储是响应式的。 b、不可以直接改变store中的状态,只能通过显示地提交(commit) mutation.
 
 
5、怎么用
 
a、安装Vuex,创建store(提供初始state和一些mutation),还要确保使用Vue.use(Vuex)
b、获取状态对象: store.state
c、触发状态变更:store.commit(‘mutation的名字’)
 
 
d、在组件中调用store中的状态:在计算属性computed中返回某个状态
如:computed: {
    count () {
      return store.state.count
      // return this.$store.state.count  //改进方式
    }
  }
 
以上做法的缺点:
注意⚠️: 在根实例中注册 store 选项,该 store 实例会注入到根组件下的所有子组件中,且子组件能通过 this.$store 访问到,别忘了use(Vuex)。
 
 
e、在组件中触发变化:在组件的methods中提交mutation。
 
 
如何将状态和状态变更事件分布到各个子模块中
 
computed
 
6、核心概念—state
 
a、state
b、mapState辅助函数:当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余,为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性。
 
             ⚠️:当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。
            
   如:
             computed: mapState([
                'count'    // 映射 this.count 为 store.state.count
             ])
 
c、对象展开运算符(…):mapState 函数返回的是一个对象。
             let n = { x, y, ...z };
             n; // { x: 1, y: 2, a: 3, b: 4 }
 
 
7、核心概念—Getter
 
a、getter
 
   使用场景:当需要从 store 中的 state 中派生出一些状态。(Getter 接受 state 作为其第一个参数)
 
   理解:可以认为是 store的计算属性。(就像计算属性一样,getter的返回值回根据他的依赖被缓存起来,只有依赖值改变--->store的计算属性重新计算。
 
   访问方式:通过属性访问,store.getters.gertter’sname
        通过方法访问,让 getter 返回一个函数,来实现给 getter 传参。(⚠️:getter 在通过方法访问时,每次都会去进行调用,而不会缓存结果)
 
如:
 
getters: {
  // ...
  doneTodosCount: (state, getters) => {  //Getter 也可以接受其他 getter 作为第二个参数
    return getters.doneTodos.length
  }
}
 
 
computed: {
  doneTodosCount () {
    return this.$store.getters.doneTodosCount
  }
}
 
 
b、mapGetters辅助函数:将store中的getter映射到局部计算属性
 
 
 
 
8、核心概念—mutation
 
a、 作用: 更改Vuex的store中的状态的唯一方法。(类似于methods)   
 
    如何定义:一个字符串的事件类型&一个回掉。
 
如:const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 变更状态
      state.count++
    }
  }
})
 
提交方式:store.commit('mutation名字’);
 
 
 
b、提交载荷(载荷即额外的参数,通常是个对象) 载荷方式
 
mutations: {
  increment (state, n) {
    state.count += n
  }
}
 
对象风格的提交方式:
如:store.commit({
  type: 'increment',
  amount: 10
})
 
 
c、使用mutation应该注意什么:
   最好提前在你的 store 中初始化好所有所需属性;
   当需要在对象上添加新属性时,你应该 使用 Vue.set(obj, 'newProp', 123),  或者:以新对象替换老对象。如state.obj = { ...state.obj, newProp: 123 }
   mutation必须是同步函数
 
 
 
9、核心概念—action
 
作用:action类似于mutation
不同点:action提交mutation,不是直接变更状态;且action可以包含任何异步操作。
 
触发action: store.dispath(‘action名字')
 
 
 

 

 
 
 
 
posted @ 2018-12-11 10:23  CatherLee  阅读(142)  评论(0编辑  收藏  举报