Vue 中 store 使用方法讲解

vuex 包含有五个基本的对象:

state存储状态。也就是变量;
getters派生状态。也就是set、get中的get,有两个可选参数:state、getters分别可以获取state中的变量和其他的getters。外部调用方式:store.getters.personInfo()。就和vue的computed差不多;
mutations提交状态修改。也就是set、get中的set,这是vuex中唯一修改state的方式,但不支持异步操作。第一个参数默认是state。外部调用方式:store.commit(‘SET_AGE’, 18)。和vue中的methods类似。
actions:和mutations类似。不过actions支持异步操作。第一个参数默认是和store具有相同参数属性的对象。外部调用方式:store.dispatch(‘nameAsyn’)。this.$store.dispatch(‘user/login’, this.loginForm)
modules:store的子模块,内容就相当于是store的一个实例。调用方式和前面介绍的相似,只是要加上当前子模块名,如:store.a.getters.xxx()。

在这里插入图片描述

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state.js'
import getters from './getters'
import mutations from './mutations.js'
import actions from './actions.js'
//安装Vue Devtools调试工具https://blog.csdn.net/li22356/article/details/113092495
//挂载Vuex,帮助手册https://www.jianshu.com/p/2e5973fe1223
//模块化可参考https://www.jb51.net/article/150752.htm
Vue.use(Vuex);
//创建VueX对象,单页面使用<h1>{{ $store.state.name }}</h1>console.log(this.$store.state.name)
//新增state对象Vue.set(state,"age",15),删除Vue.delete(state,'age')
const store = new Vuex.Store({
  //存放数据,存放状态
  //使用方法
  state,
  //加工state成员给外界
  //state 当前VueX对象中的状态对象
  // getters 当前getters对象,用于将getters下的其他getter拿来用
  //组件使用this.$store.getters.fullInfo
  getters,
  //state成员操作,操作state数据的方法的集合,比如对该数据的修改、增加、删除等等。
  //组件调用this.$store.commit('SET_TOKEN','new token')挂载方法
  //同步处理
  mutations,
  //异步处理
  //组件中使用this.$store.dispatch('aEdit','new TOKEN')
  actions
});
export default () => {
  return store
}

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
    //这里放全局参数,比如用户登录信息
  state: {
	token: "helloVueX",
    name: "",
    age: ""
  },
  mutations: {
    //这里是set方法,比如对该数据的修改、增加、删除等等。
    //组件调用this.$store.commit('SET_TOKEN','new token')挂载方法
    SET_TOKEN: (state, token) => {
	    state.token = token
	    console.log(state.token);
	  }
  },
  //getters 当前getters对象(可对对象进行二次更改),用于将getters下的其他getter拿来用,组件通过this.$store.getters.fullInfo拿来使用
 getters: { 
	 token: state => state.token,
	  nameInfo(state) {
	    return "姓名:" + state.name
	  },
	  fullInfo(state, getters) {
	    return getters.nameInfo + '年龄:' + state.age
	  }
 },
 //异步处理
//组件中使用this.$store.dispatch('aEdit','new TOKEN')
  actions: {
	   QQlogin({commit}, token) {
	    return new Promise((resolve, reject) => {
	      setToken(token);         //把token存放到cookie里
	      commit('SET_TOKEN', token)     //commit调用mutations 数据
	      resolve()
	    })
	  },
	  aEdit(context, payload) {
	    return new Promise((resolve, reject) => {
	      setTimeout(() => {
	        context.commit('SET_TOKEN', payload)
	        resolve()
	      }, 2000)
	    })
	  }
  },
  modules: {

//这里是我自己理解的是为了给全局变量分组,所以需要写提前声明其他store文件,然后引入这里

  }

})

vuex,module间的方法调用

我们用vuex时通常会分功能创建多的module,单个module里的操作大家应该很清楚,那多个module之间怎么调用了?

详细代码:

现在我有两个module:user 和 menu,要在user中调用menu的actions方法,操作如下:

const user = {
  state: {
    permissions: []
  },
  mutations: {
    SET_PERMISSIONS: (state, permissions) => {
      state.permissions = permissions
    }
  },
  actions: {
    getPermissions({commit}) {
      queryPermissions().then(res => {
        sessionStorage.setItem('permissions', JSON.stringify(res))
        this.dispatch('setPermissions', res); // 调本module里的方法
      })
    },
    setPermissions({commit, dispatch, state, rootState}, data) {
      commit('SET_PERMISSIONS', data); // 本module的commit
      dispatch('setMenuData', data); // 调menu里的方法
      console.log(rootState.menu.menus); // 取menu里的参数
    }
  }
}
 
export default user
const menu = {
  state: {
    menus: []
  },
  mutations: {
    SET_MENUS: (state, data) => {
      state.menus = data
    }
  },
  actions: {
    setMenuData({commit, state}, data) {
      commit('SET_MENUS', data);
    }
  }
}
export default menu

解释:

actions里各个方法的第一个参数其实有很多属性,只是我们平时习惯了解构的写法,如setMenuData({commit, state},data)。当把第一个参数的值全输出,如setMenuData(param,data),输出param会发现其中包含以下属性:

vue文件调用store的action方法

const actions = {
    // 根据权限动态生成路由
    async generateRoutes({ commit }) {
      // 执行代码
    }
}
created() {
        this.generateRoutes()
    },
methods: {
        ...mapActions('menu', [
            'generateRoutes'
        ])
        }
  • 17
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Vue 3的状态管理有一个新的特性叫做Vue 3 Composition API。您可以使用Composition API来创建和管理您的Vue 3应用程序的状态。下面是一个简单的示例,演示了如何在Vue 3使用Composition API来创建和使用一个简单的store: 首先,您需要创建一个新的JavaScript文件(例如store.js),并在其导入Vue和createStore函数: ```javascript import { reactive, readonly } from 'vue'; // 创建一个可变的状态对象 const state = reactive({ count: 0, }); // 创建一个修改状态的方法 function increment() { state.count++; } // 导出一个只读的状态对象和修改状态的方法 export const store = readonly({ state, increment, }); ``` 然后,在您的Vue组件导入并使用store: ```javascript <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> import { store } from './store.js'; export default { computed: { count() { return store.state.count; }, }, methods: { increment() { store.increment(); }, }, }; </script> ``` 在上面的示例,我们创建了一个可变的状态对象`state`,并将其包装在`reactive`函数以实现响应式。然后,我们创建了一个`increment`方法来修改状态对象的`count`属性。最后,我们通过`readonly`函数将状态对象和修改方法包装在一个只读的store对象进行导出。 在Vue组件,我们可以使用computed属性来获取状态对象的属性值,并在方法调用store对象的修改方法来更新状态。这样,我们就可以在Vue 3应用程序使用Composition API来创建和使用一个简单的store了。 请注意,上述示例只是一个简单的演示,您可以根据您的实际需求扩展和修改store对象和组件。希望对您有帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GY程序源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值