vuex使用

Posted jlyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vuex使用相关的知识,希望对你有一定的参考价值。

1. 入口文件index.js

import Vuex from ‘vuex‘
import Vue from ‘vue‘
import modulesA from ‘./modules/modulesA‘

// 注册vuex到vue中
Vue.use(Vuex)

const state = {
    counter:1,
    todoList:[
        {id:1,name:"learn vuex",done:true},
        {id:2,name:"learn vue.js",done:true},
        {id:3,name:"learn vue.js",done:false},
    ]
}
// new Vuex.Store() 实例 
var store = new Vuex.Store({
  state,
  //getters对外提供数据,可对state中的数据过滤处理
  getters:{
    doneTodos(state){
        return state.todoList.filter(item=>item.done);
    },
    counter(state){
        return "counter:" + state.counter + "个";
    }
  },
  // 同步操作
  mutations:{
    add(state,num){
        state.counter += num;
    },
    sub(state,num){
        state.counter -= num;
    }
  },
  // 异步操作
  actions:{
      asyncAdd(context,num){
        setTimeout(()=>{
            context.commit(‘add‘,num)
        })
      }
  },
  //模块化管理数据
  modules:{
    modulesA,
  }
})
export default store

组件中使用

<template>
    <div class="com">
        <h5>home</h5>
        <ul>
            <li v-for="item in $store.getters.doneTodos">{{item.name}}</li>
        </ul>
        <p>
            {{$store.getters.counter }}
        </p>
        <p> <button @click="add(2)">+2</button>
            <span class="counter">{{$store.state.counter}}</span>
            <button @click="sub(2)">-2</button></p>
            <div>异步<button @click="asyncAdd(10)">+10</button></div>
        <div>
            <p>获取模块A数据isAdmin:{{$store.state.modulesA.isAdmin}}</p>
        </div>
    </div>
</template>

<script>
    export default {
        data() {
            return {}
        },
        methods: {
            add(num) {
                this.$store.commit(‘add‘, num);
            },
            sub(num) {
                this.$store.commit(‘sub‘, num);
            },
            asyncAdd(num){
                this.$store.dispatch(‘asyncAdd‘, num);
            }
        }
    }
</script>

 挂载store

new Vue({
  el: ‘#app‘,
  router,
  store,
  components: { App },
  template: ‘<App/>‘
})

  

 

2. 总结

    2.1 state中的数据,不能(不建议)直接修改,如果想要修改,必须通过 mutations(同步)/actions(异步)

    2.2  从 state 上获取数据,需要 this.$store.state.***,例如 :$store.state.counter

    2.3 使用 getters ,则用 this.$store.getters.***,例如 :$store.getters.counter

      2.4 调用mutations中的方法this.$store.commit(‘方法的名称‘, 参数) ,例如:this.$store.commit(‘sub‘, num);

    2.5 调用actions中的方法this.$store.dispatch(‘方法的名称‘, 参数) ,例如:this.$store.dispatch(‘asyncAdd‘, num);

以上是关于vuex使用的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

项目集成 vue-router 和 vuex

Vue 教程(四十九)Vuex 核心概念和项目结构

Vue 教程(四十九)Vuex 核心概念和项目结构

Vue 教程(四十九)Vuex 核心概念和项目结构

Vue 教程(四十九)Vuex 核心概念和项目结构