再读Vuex

vuex是vue的状态管理工具


单向数据流

在components中通过dispatch来触发actions,actions通过commit来触发mutations,mutations最终触发state的变更,state的变更引起组件中computed计算属性的响应,从而反应到组件中。

注意点归纳

  1. 为了避免在需要使用state的组件中频繁地导入store管理模块,vuex提供了注入的机制,从根组件将stroe注入所有组件,且子组件能通过 this.$store 访问到。
const app = new Vue({
  el: '#app',
  // 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
  store,
  components: { Counter }
})
  1. mapState辅助函数,当一个子组件需要依赖多个state,通过在计算属性中使用mapState辅助函数,将所有需要的state 混入 计算属性中,当任一state改变,将触发计算属性重新计算。
computed: mapState(['toast'])
//当计算属性还需要计算其他的数据时,使用ES2015的...解构方法,将所有state混入计算属性。...对象展开运算符将其解构成对象属性的形式,而不是对象的形式。
computed:{
          otherdata(){},
          ...mapState(['xx','xxx'])
}
  1. Getter相当于State的filter,可以将state数据进行一些操作之后再返回给组件,当需要这个过滤器时,mapState辅助函数还可以替换为mapGetter辅助函数,再混入computed,监听过滤后的state。
import { mapGetters } from 'vuex'
export default {
  // ...
  computed: {
  // 使用对象展开运算符将 getter 混入 computed 对象中
    ...mapGetters([
      'doneTodosCount',
      'anotherGetter',
      // ...
    ])
  }
}
  1. Vuex中更改store的唯一方法是提交mutation(突变),mutations中定义突变函数名,通过commit('突变函数名')来触发mutation,多数情况下,突变函数应接受两个参数,一个是突变的state,一个是payload(载荷,一个有关突变数据的对象)。
mutations: {
  increment (state, payload) {
    state.count += payload.amount
  }
}
store.commit('increment', {
  amount: 10
})
/***********************************************/
/***在组件中,可以将需要的突变函数混入method方法***/
import { mapMutations } from 'vuex'
export default {
  // ...
  methods: {
    ...mapMutations([
      'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`

      // `mapMutations` 也支持载荷:
      'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)`
    ]),
    ...mapMutations({
      add: 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')`
    })
  }
}
  1. 在mutation之中只能进行同步的操作,所有的异步操作需要放到action中,再然后,通过dispatch来触发action,action是通过commit mutation来实现变动的。Action也可以在methods中通过...mapAction来分发action。例如:
 getArticles: ({commit}) => {
    const start = beginLoading(commit)
    return Vue.http.get('/api/getArticles')
      .then(response => response.json())
      .then(articles => {
        stopLoading(commit, start)
         //触发mutation
         commit('SET_ARTICLES', articles)
      })
  }
  1. 上方({commit})的操作的解释,commit为从 函数实参对象中提取的数据,传入函数的还是一个包含此commit函数对象的对象。
    image.png

长路漫漫,
勿忘初心 。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,964评论 0 7
  • Vuex是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件...
    萧玄辞阅读 3,148评论 0 6
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 8,035评论 4 111
  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应...
    白水螺丝阅读 4,684评论 7 61
  • 上一章总结了 Vuex 的框架原理,这一章我们将从 Vuex 的入口文件开始,分步骤阅读和解析源码。由于 Vuex...
    你的肖同学阅读 1,808评论 3 16