Vuex 经过 store 选项,提供了一种机制将状态从根组件“注入”到每个子组件中(需调用 Vue.use(Vuex)):经过在根实例中注册 store 选项,该 store 实例会注入到根组件下的全部子组件中,且子组件能经过 this.$store 访问到
computed: { f1() { return this.$store.state.xxxx } }, watch: { f1(curVal, oldVal) { //这里的curVal就是须要监听的值 } }
computed 里通常写个函数,这个函数里必定是return一个结果。 这里你能够直接用f1做为本组件监听$store.state.xxxx, 也能够在本组件里声明一个变量而后再经过watch监听,将watch中的curVal赋值给该变量从而达到使用的目的。
当一个组件须要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,咱们可使用 mapState 辅助函数帮助咱们生成计算属性,让你少按几回键:vue
// 在单独构建的版本中辅助函数为 Vuex.mapStatevuex
import { mapState } from 'vuex' export default { // ... computed: mapState({ // 箭头函数可以使代码更简练 count: state => state.count, // 传字符串参数 'count' 等同于 `state => state.count` countAlias: 'count', // 为了可以使用 `this` 获取局部状态,必须使用常规函数 countPlusLocalState (state) { return state.count + this.localCount } }) }
当映射的计算属性的名称与 state 的子节点名称相同时,咱们也能够给 mapState 传一个字符串数组。数组
computed: mapState([ // 映射 this.count 为 store.state.count 'count' ])
对象展开运算符
mapState 函数返回的是一个对象。咱们如何将它与局部计算属性混合使用呢?一般,咱们须要使用一个工具函数将多个对象合并为一个,以使咱们能够将最终对象传给 computed 属性。可是自从有了对象展开运算符(现处于 ECMAScript 提案 stage-4 阶段),咱们能够极大地简化写法:函数
computed: { localComputed () { /* ... */ }, // 使用对象展开运算符将此对象混入到外部对象中 ...mapState({ // ... }) }