Vuex的应用场景

  • 单页面开发
  • 组件通信

    Vuex的属性

  • Vuex包含五大属性:

  1. state(存放状态) 、
  2. action(提交mutation,进行异步操作)
  3. getters(state的计算属性)
  4. modules(将store模块化)
  5. mutation(更改状态逻辑,进行同步操作)
  • state
    1. Vuex其实就是一个仓库,仓库里面放了很多对象。其中state就是存放数据源的地方,对应与Vue对象里面的data
    2. 其中state里面存放的数据为响应式数据,Vue组件从store仓库中读取数据,若仓库中的数据发生改变的时候,依赖这个数据的组件也会随之更新
    3. state通过mapState把全局的state和getters映射到当前组件的computed计算属性中
  • getters
    1. getters可以对state进行计算操作,它就是store的计算属性
    2. 虽然在组件内也有计算属性,但是getters可以在多组件复用
    3. 如果一个状态只在一个组件内使用,可以不用getters
  • mutation
    1. action类似于mutation
      1. mutation必须是同步操作
      2. action可以包含任意的异步操作
      3. action提交的是mutation,不是直接变更状态
      4. 视图触发action,action触发mutation

不多**,代码供上

  1. const store = new Vuex.Store({
  2. state: {
  3. // 存放状态
  4. },
  5. getters: {
  6. // state的计算属性
  7. },
  8. mutations: {
  9. // 更改state中状态的逻辑,同步操作
  10. },
  11. actions: {
  12. // 提交mutation,异步操作
  13. },
  14. // 如果将store分成一个个的模块的话,则需要用到modules
  15. //然后在每一个module中写state, getters, mutations, actions等。
  16. modules: {
  17. a: moduleA,
  18. b: moduleB,
  19. // ...
  20. }
  21. });

Vuex的作用

某个状态的变化可以在组件内实时监测、并进行处理

不用Vuex的弊端

  • 可维护性会下降,你要想修改数据,你得维护三个地方
  • 可读性会下降,因为一个组件里的数据,你根本就看不出来是从哪来的
  • 增加耦合,大量的上传派发,会让耦合性大大的增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背。

    辅助函数

    知识点

首先在讲解用法前我们先创建一个仓库实例

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import {Mockurl} from '@/until'
  4. Vue.use(Vuex)
  5. export default new Vuex.Store({
  6. state: {
  7. count:0,
  8. data:[],
  9. sex:0
  10. },
  11. mutations: {
  12. changeData(state,actions){
  13. state.data = [...actions.data]
  14. },
  15. add(state){
  16. ++state.count
  17. },
  18. dis(state){
  19. --state.count
  20. }
  21. },
  22. actions: {
  23. getData(store){
  24. axios.get('/get/data').then(data=>{
  25. store.commit('changeData',data)
  26. })
  27. }
  28. },
  29. getters:{
  30. sex(state){
  31. return state.sex === 0 ? '男':'女'
  32. }
  33. }
  34. })

mapState读取仓库状态

  1. <template>
  2. <div>{{count}}</div>
  3. </template>
  4. <script>
  5. import { mapState } from 'vuex'
  6. export default {
  7. computed:{
  8. ...mapState(['count']),
  9. }
  10. }
  11. </script>

mapMutations 修改仓库状态

  1. <template>
  2. <div>
  3. <span @click="dis" >-</span>
  4. {{count}}
  5. <span @click="add" >+</span>
  6. </div>
  7. </template>
  8. <script>
  9. import { mapMutations } from 'vuex'
  10. export default {
  11. methods:{
  12. ...mapMutations(['add','dis'])
  13. }
  14. }
  15. </script>

mapActions 异步处理

  1. <script>
  2. import { mapActions } from 'vuex'
  3. export default {
  4. methods:{
  5. ...mapActions(['getData'])
  6. }
  7. }
  8. </script>

getters 数据派生

  1. <template>
  2. <div>
  3. 性别:{{sex}}
  4. </div>
  5. </template>
  6. <script>
  7. import { mapGetters } from 'vuex'
  8. export default {
  9. computed:{
  10. ...mapGetters(['sex'])
  11. }
  12. }
  13. </script>