关于将Vuex存储数据存入sessionStorage使用的过程

需求阐述:

在我们开发系统的时候往往在不同的模块需要调用相同的数据去展示或者供接口使用,所以可以通过将数据存储Vuex中再将其存入sessionStorage使用

过程:

1.创建store文件夹并创建index.js文件用于动态加载modules目录下所有.js文件,并将其导出的默认值存储到一个对象中

import Vue from 'vue'
import Vuex from 'vuex'
//store数据持久化
import createPersistedState from 'vuex-persistedstate'

// getter
import getters from './getters'

Vue.use(Vuex)

/**
 * 动态加载modules目录下所有.js文件,并将其导出的默认值存储到一个对象中。
 * 
 * @returns {Object} 包含所有模块默认导出的键值对对象。
 */
const modulesFiles = require.context('./modules', true, /\.js$/)
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
	// 从模块路径中提取模块名
	const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
	const value = modulesFiles(modulePath)
	// 将模块的默认导出存储到modules对象中
	modules[moduleName] = value.default
	return modules
}, {})

/**
 * 创建一个Vuex.Store实例,用于管理应用的状态。
 * 
 * @param {Object} modules - Vuex模块对象,用于组织和管理状态。
 * @param {Object} getters - Vuex的getter方法对象,用于从状态中计算出衍生数据。
 * @return {Vuex.Store} 返回一个初始化好的Vuex.Store实例。
 */
const store = new Vuex.Store({
	modules,
	getters,
	// 应用插件来实现状态的持久化存储。
	plugins: [createPersistedState({
		// 使用sessionStorage来存储状态。
		storage: window.sessionStorage,
		// 定义一个reducer来缩小需要持久化的状态范围。
		reducer(val) {
			return {
				user: val.user, // 仅持久化demo部分的状态。
			}
		}
	})]
})

export default store

2.创建modules文件夹可以创建不同的js文件用来存储不同的对象

3.创建api用于调取后端接口

4.在modules文件夹下的文件去设置需要存储的数据

import Demo from '@/api/demo'
const getDefaultState = () => {
	return {
  // 初始化用户信息
		userName: '',
    userHeight:'',
    userWeight:'',
    userID:'',
	}
}

const state = getDefaultState()

const mutations ={

  	// 设置用户姓名
	SET_USER_ID: (state, userID) => {
		state.userID = userID
	},
	// 设置用户姓名
	SET_USER_NAME: (state, userName) => {
		state.userName = userName
	},
  	// 设置用户身高
	SET_USER_HEIGHT: (state, userHeight) => {
		state.userHeight = userHeight
	},
   	// 设置用户体重
	SET_USER_WEIGHT: (state, userWeight) => {
		state.userWeight = userWeight
	},

}


const actions = {
	/**
	 * 调用后端接口获取用户信息
	 * @param {Object} context 包含commit和state的对象,用于在Action中提交mutation和访问state
	 * @returns {Promise} 返回一个Promise对象,成功时resolve携带获取到的用户信息,失败时reject错误对象
	 */
	GetInfo({ commit, state }) {
		const params = {
			// 构造请求后端接口所需的参数
      userID:state.userID // 用户代码,从state中获取
		}
		return new Promise((resolve, reject) => {
			// 发起GET请求获取用户信息
			Demo.getDemo(params).then(response => {
				const data = response.data || {} // 获取响应数据,若无则设为空对象
				// 分别提交mutation来更新state中的用户姓名、身高和体重信息
				commit('SET_USER_NAME', data.userName)
				commit('SET_USER_HEIGHT', data.userHeight)
				commit('SET_USER_WEIGHT', data.userWeight)
				resolve(data) // 成功时resolve携带用户信息
			}).catch(error => {
				reject(error) // 发生错误时reject错误对象
			})
		})
	},
}

/**
 * 导出一个默认的对象,配置了 Vuex 的 store 模块的选项
 * 包括:命名空间设置、状态(state)、突变(mutations)和动作(actions)
 * 
 * @property {boolean} namespaced - 指定模块是否使用命名空间
 * @property {Object} state - 定义模块的初始状态
 * @property {Object} mutations - 定义可以修改状态的函数
 * @property {Object} actions - 定义异步操作或提交 mutation 的函数
 */
export default {
	namespaced: true,
	state,
	mutations,
	actions
}

5.创建getter.js用于从state中获取特定的用户信息。

6.创建Login.vue文件通过触发登录按钮的点击事件触发dispatch方法调用user模块的GetInfo方法(当然这个只是个简单的demo用于讲述存储的过程并没有详细写关于登录的细节)

<template>
  <div>
    <el-form :model="loginForm"> 
      <el-form-item label="账号">
        <el-input v-model="loginForm.account" />
      </el-form-item>
      <el-form-item label="密码">
        <el-input v-model="loginForm.password" />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="login">登录</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  name: "login",
  data() {
    return {
      loginForm:{
        account: '',
        password: ''
      }
    };
  },
  methods: {
		// 用户登录:通过触发登录按钮调用login方法,通过dispatch方法调用user模块的GetInfo方法
		login() {
			this.$store.dispatch('user/GetInfo', this.loginForm).then(() => {
			}).finally(() => {
			})
		}
  },
};
</script>
<style scoped lang='scss'>

</style>

7.关键点:将vuex数据存在sessionStorage写在了store的index.js中

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你在使用 Vuex 时无法从 `sessionStorage` 中获取数据,可能是因为 Vuex 的状态是响应式的,而 `sessionStorage` 中存储数据不是响应式的。这意味着当你从 `sessionStorage` 中获取数据并将其存储Vuex 状态中时,如果你更新了 `sessionStorage` 中的数据Vuex 状态并不会自动更新。 为了解决这个问题,你可以在 Vuex 的 `created` 钩子函数中初始化状态,从 `sessionStorage` 中获取数据并将其存储Vuex 状态中。然后,你可以使用 Vuex 提供的 `watch` 函数监视 `sessionStorage` 中数据的更改,并在数据更改时手动更新 Vuex 状态。 以下是一个示例代码,演示如何在 Vuex 内获取 `sessionStorage` 数据: ```javascript import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { myData: null, }, mutations: { setMyData(state, data) { state.myData = data; }, }, actions: { initMyDataFromSessionStorage({ commit }) { const data = sessionStorage.getItem('myData'); commit('setMyData', data); }, }, created() { this.dispatch('initMyDataFromSessionStorage'); window.addEventListener('storage', (event) => { if (event.key === 'myData') { this.commit('setMyData', event.newValue); } }); }, }); export default store; ``` 在这个示例代码中,我们在 Vuex 的 `created` 钩子函数中调用 `initMyDataFromSessionStorage` action,并使用 `commit` 函数将从 `sessionStorage` 中获取的数据存储Vuex 状态中。然后,我们使用 `window.addEventListener` 监听 `storage` 事件,并在事件触发时使用 `commit` 函数手动更新 Vuex 状态。这样,无论你是从同一浏览器的不同标签页还是从不同的浏览器中更改了 `sessionStorage` 中的数据,都可以在 Vuex 状态中正确地反映出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值