Vuex是什么

2019-08-20  本文已影响0人  iDevOps

如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新

学习Vuex, 一定要看懂官网的这张图
image.png

我们从Vue Components开始简单过一遍这个图

  1. 在Vue Components中, 我们执行dispatch操作调用Actions中定义的方法
  2. Actions中的方法执行commit操作调用Mutations的方法
  3. Mutations可以直接操作State里面的值
  4. State中保存我们的状态值, State中的值一旦发生变化,就会重新渲染(Render)和它关联的Vue Components, 走到这里正好走了一个圈

除此之外, 图中我们还有两个地方没有提到, 那就是Backend API和Devtools

最后一个知识点, Mutations可以省略吗?
可以省略, 省略我们直接使用Actions操作State, 但是不建议,我们在图中也看到了, 在Mutations的地方对接了Devtools,如果去掉了Mutations我们就无法使用Devtools的调试了, 另外还有就是如果我们的状态值变的很多的时候, Actions和Mutations可以分层调用的作用, 类似Java或Php中的Service层和Model层, Mutations层的代码可能会被Actions重复调用, 起到代码复用的效果

好了, 今天就先大概介绍这么多

上篇文章我们介绍了Vuex是什么, 本文我们主要介绍Vuex中的State

什么是State?

State就是Vuex保存数据的地方

让State中的状态和Vue Components中的属性关联
1. 在store定义一个状态count默认为0
const store = new Vuex.Store({
  state: {
    count : 0
  }
})
2. 使组件中的count和状态count关联上
// 方式1
// 组件的值和状态值绑定, 状态值改变, 组件中定义的值也跟着改变
export default {
  data() {
    return {
      count: this.$store.state.count
    }
  }
}

// 方式2. 通过辅助函数关联, 效果和方式1一致
import { mapState } from 'vuex'
data(){
   // 这里无需写count: 0
},
computed: {
    ...mapState(['count']),
}

注: 使用 Vuex 并不意味着你需要将所有的状态放入 Vuex。虽然将所有的状态放到 Vuex 会使状态变化更显式和易调试,但也会使代码变得冗长和不直观。如果有些状态严格属于单个组件,最好还是作为组件的局部状态

Vuex中的Getter是干什么的?

有时候我们需要从 store 中的 state 中派生出一些状态,例如对列表进行过滤并计数, 这个时候我们就需要用到Getter了

在Getter中定义方法对列表进行过滤
const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    // 只返回done为true的列表
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    },
    // 返回一个函数
   getTodoById: (state) => (id) => {
     return state.todos.find(todo => todo.id === id)
   }
  }
})
获取Getter中的数据
this.$store.getters.doneTodos;
this.$store.getters.getTodoById(1);
辅助函数
import { mapGetters } from 'vuex'
export default {
  // ...
  computed: {
  // 使用对象展开运算符将 getter 混入 computed 对象中
    ...mapGetters([
      'doneTodos',
      'getTodoById',
      // ...
    ])
  }
}
上一篇 下一篇

猜你喜欢

热点阅读