文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Vue中实现添加全局store

2024-04-02 19:55

关注

Vue添加全局store

在命令行中输入安装

npm install --save vuex

在main.js文件中引用

store和在new Vue中声明store

import store from './store'
store,

在src中创建一个page文件

在page文件下创建一个module的js文件(内容如下)

const state = {
HomeStatus:{
LoginStatus:false
},
Users:[],
}
const mutations = {
['setuseinfo'] (state, data) {
},
}
const actions = {
}

在src下创建一个store文件

在store文件下创建一个index的js文件

import Vue from 'vue'
import Vuex from 'vuex'
import page from '../page/module'
Vue.use(Vuex)
export default new Vuex.Store({
state: {},
modules:{
page
}
})

store使用方法讲解

vuex 包含有五个基本的对象

在这里插入图片描述

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'
        ])
        }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯