美文网首页vue
Vuex的基本使用

Vuex的基本使用

作者: 顺其自然AAAAA | 来源:发表于2021-12-12 08:47 被阅读0次

    一、安装

    NPM

    npm install vuex --save
    

    Yarn

    yarn add vuex
    

    在main.js引入使用

    import Vue from 'vue'
    import App from './App.vue'
    import router from './router'
    import store from './store'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    
    Vue.use(ElementUI);
    new Vue({
      router,
      store,
      render: h => h(App)
    }).$mount('#app')
    

    创建store文件夹,里面创建一个js文件 store/index.js

    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)  // 必须显式地通过 Vue.use() 来安装 Vuex
    
    export default new Vuex.Store({
      state: {
        addCount: 0, // 显示的数值
        subCount: 1
      },
      mutations: {
      },
      actions: {
      },
      modules: {
      }
    })
    

    二、开始使用(显示)---state

    在vue中state有三种用法(显示)
    第一种

    <div>增加的数量1:{{$store.state.addCount}}</div>
    

    第二种

    <div>减少的数量:{{countTest}}</div>
    <script>
    export default {
      data() {
        return {
          countTest: null
        }
      },
      mounted() {
        this.countTest = this.$store.state.subCount;  
      },
    }
    </script>
    

    第三种

    <div>增加的数量2:{{addCount}}</div>
    <script>
    import {mapState} from 'vuex'
    export default {
      computed: {
        ...mapState(['addCount'])
      },
    }
    </script>
    

    三、Mutation

    Mutation用于变更Store中的数据
    ① 只能通过mutation变更Store数据,不可以直接操作Store中的数据。
    ② 通过这种方式虽然操作起来稍微繁琐一些,但是可以集中监控所有数据的变化。

      mutations: {
        /*
        add 函数接收两个参数
        state: store里面的state对象(和mutition平级的state)
        data: 外界传入的值,可以随意命名,a,b,c都可以
        */ 
        add(state,data) {
          // 每点击一次,在原来的基础上加 data数值
          state.addCount += data;
        }
      },
    

    触发mutations的第一种方式

      methods: {
        handleAdd() {
          // commit 的作用, 就是调用某个 mutation 函数
          this.$store.commit('add',2)
        }
      },
    

    触发mutations的第二种方式

    export default new Vuex.Store({
      state: {
        addCount: 0, // 显示的数值
        subCount: 1,
        aTest: '我是测试1'
      },
      mutations: {
        /*
        add 函数接收两个参数
        state: store里面的state对象(和mutition平级的state)
        data: 外界传入的值,可以随意命名,a,b,c都可以
        */ 
        add(state,data) {
          // 每点击一次,在原来的基础上加 data数值
          state.addCount += data;
        },
        sub(state,step) {
          state.aTest = step;
        }
      },
    })
    
    <script>
    // 从vuex 中 按需导入 mapMutations 函数
    import {mapState, mapMutations} from 'vuex'
    export default {
      computed: {
        ...mapState(['addCount'])
      },
    // 通过导入的mapMutations函数,将需要的mutations函数,映射为当前组件的methods方法
      methods: {
      // 讲指定的mutations 函数,映射为当前组件的methods 函数
        ...mapMutations(['sub']),
        handleAdd() {
          this.$store.commit('add',2)
        },
        handleTihuan() {
          this.sub('嘿嘿嘿!!!')
        }
      },
    }
    </script>
    

    四、Actions

    Actions 用于处理异步任务。
    如果通过异步操作变更数据,必须通过Action,而不能使用Mutation,但是在Action中还是要通过触发Mutation的方式间接变更数据。
    触发actions的第一种方式:

    export default new Vuex.Store({
      state: {
        addCount: 0, // 显示的数值
      },
      mutations: {
        add(state) {
          state.addCount += 1;
        },
      },
      actions: {
        asyncAdd(context) {
          setTimeout(()=>{
            context.commit('add')
          },1000)
        }
      },
    })
    -----------------
      methods: {
        handleAdd() {
          this.$store.dispatch('asyncAdd')   // store 里面的方法名是哪个就在dispatch里面写哪个方法名
        },
      },
    

    触发actions异步任务时携带参数:

      actions: {
        asyncAdd(context,step) {
          setTimeout(()=>{
            context.commit('add',step)
          },1000)
        }
      }
    -----
    this.$store.dispatch('asyncAdd',2)
    

    触发actions的第二种方式:

      actions: {
        asyncSub(context,step) {
          setTimeout(()=>{
            context.commit('sub',step)
          },1000)
        } 
      },
    
    ------
    import {mapState, mapMutations, mapActions} from 'vuex'
      methods: {
        ...mapMutations(['sub']),
        ...mapActions(['asyncSub']),
        handleSub() {
          this.asyncSub(1);
        },
      },
    ------
    // 或者直接在DOM元素中使用
    <div>减少的数量:{{$store.state.subCount}}</div>
        <!-- <el-button type="warning" @click="handleSub">减少</el-button> -->
        <el-button type="warning" @click="asyncSub(2)">减少</el-button>
    

    五、Getters

    Getters用于对Store中的数据进行加工处理形成新的数据
    ① Getters 可以对Store 中已有的数据加工处理之后形成新的数据,类似于Vue的计算属性。
    ② Store 中数据发生变化,Getters 的数据也会跟着变化。
    使用getters的第一种方式:

      getters: {
     // 这里的state 是store 里面state
        showNumber: state => {
          return '当前最新的数据是【'+ state.testCount +'】'
        }
      },
    -----------
      // this.$store.getters.名称
     this.$store.getters.showNumber
    

    使用getters的第二种方式:

    import {mapState, mapMutations, mapActions, mapGetters} from 'vuex'
    --------------
     computed: {
        ...mapGetters(['showNumber'])
      },
    -----------
    <div>{{showNumber}}</div>
    

    后续可能还有更新。。。

    相关文章

      网友评论

        本文标题:Vuex的基本使用

        本文链接:https://www.haomeiwen.com/subject/atmkfrtx.html