uniapp vuex 使用mapState调用取不到值。

本文讲述了在uni-app项目中使用Vuex时,如何解决在index.vue组件中通过mapState映射状态但无法获取到值的问题,涉及Vuex的状态管理及组件间通信的要点。

uniapp vuex 使用mapState调用取不到值。

uni-app自带vuex,所以正确引入即可。
1、新建uniapp项目时,根目录会自动创建store文件夹存放vuex
2、手动创建index.js

import Vue from 'vue'
import Vuex from 'vuex'

//挂载Vuex
Vue.use(Vuex)

//创建VueX对象
const store = new Vuex.Store({
	state: {   //全局变量定义处
		uerInfo: {},
		hasLogin: false,
		forcedLogin: false,//是否强制登录
	},
	mutations: {    //全局方法定义处
		login(state, user) {
			state.hasLogin = true;
			state.uerInfo = user;
			uni.setStorage({//将用户信息保存在本地 
				key: 'uerInfo',
				data: user
			});
		},
		logout(state) {
			state.hasLogin = false;
			state.uerInfo = {};
			uni.removeStorage({
				key: 'uerInfo'
			});
		}
	}
})

export default store

3、配置main.js入口文件

import Vue from 'vue'
import App from './App'
import store from './store'

Vue.config.productionTip = false
Vue.prototype.$store = store; //挂载在VUE实例上
App.mpType = 'app'

const app = new Vue({
	store,//store对象
	...App
})
app.$mount()

4.index.vue调用

<script>
	import{
		mapState, //先导入mapState方法
		mapMutations,
	} from 'vuex'
    export default {
	computed: {
		...mapState([
			'forcedLogin',
			'hasLogin',
			'user'])
	},
	methods:{
		...mapMutations(['login']),
	}

这边有个小坑是,因为我的首页用不到login方法,所以就没有在mothds中去添加

methods:{ …mapMutations([‘login’]), }

导致Index.vue在调用全局变量时取不到值。

<think> 嗯,用户现在想在uniapp使用vuex管理token并在其他页面使用,我需要根据提供的引用资料整理出一个清晰的解决方案。 首先看引用内容,引用2提到在store/index.js中初始化vuex,并创建包含用户信息的模块。引用3和4都强调了创建store目录和index.js文件的基本结构。引用5特别展示了如何通过commit修改token和通过dispatch异步获token,这对用户需求很关键。 用户的核心诉求有两个:一是如何正确存储token到vuex,二是如何在其他页面获使用这个token。需要分步骤说明。 关于存储部分,引用2和5提到在user模块里定义token状态和mutations,引用5的logIn action展示了异步保存token到state的完整流程,这个模式可以直接推荐给用户。这里要注意commit和dispatch的区别:commit是同步修改state,dispatch处理异步操作后提交mutation。 对于跨页面使用,引用4的mapState示例很重要,但需要调整为token的场景。引用5展示的store.state直接获方式也可以作为补充方案。考虑到uniapp的页面跳转机制,还要强调vuex状态在页面刷新会丢失的特性。 安全方面需要提醒用户避免直接将token存在vuex而不配合持久化存储。引用1提到vuex适合管理全局状态如用户登录态,正好印证token管理的适用性。 最后可以补充登录状态管理的最佳实践,比如结合本地存储做持久化。用户可能是uni-app初学者,示例代码要保留最基础的实现方式,模块化等高级用法作为可选方案。 检查引用标记:所有关键步骤都标注了对应的引用源,比如token存储对应引用2,获方式对应引用4和5。现在组织成初始化vuex、定义模块、使用token三部分应该能清晰解决用户问题。 </think> 在 UniApp使用 Vuex 管理 Token 并在其他页面使用,主要涉及 Vuex 的初始化、Token 存储逻辑封装和跨页面调用。以下是详细步骤和代码示例: --- ### 一、初始化 Vuex 并创建 Token 管理模块 **1. 创建 Vuex Store (文件:`/store/index.js`)** ```javascript import Vue from 'vue' import Vuex from 'vuex' import user from './modules/user' // 导入用户模块(含 Token 管理) Vue.use(Vuex) export default new Vuex.Store({ modules: { user // 注册用户模块 } }) ``` **2. 定义用户模块 (文件:`/store/modules/user.js`)** ```javascript const state = { token: '' // 存储 Token } const mutations = { // 同步更新 Token SET_TOKEN(state, token) { state.token = token; }, // 清空 Token(用于注销) CLEAR_TOKEN(state) { state.token = ''; } } const actions = { // 异步登录操作(示例) async login({ commit }, credentials) { const res = await uni.request({ url: '/api/login', method: 'POST', data: credentials }); if (res.success) { commit('SET_TOKEN', res.data.token); // 提交 mutation 存储 Token return true; } return false; }, // 注销操作 logout({ commit }) { commit('CLEAR_TOKEN'); uni.removeStorageSync('token'); // 可选:清除本地持久化 } } const getters = { isAuthenticated: state => !!state.token // 计算是否已认证 } export default { namespaced: true, state, mutations, actions, getters } ``` --- ### 二、在页面中使用 Token #### 场景 1:登录页存储 Token ```javascript // 登录页面代码 import { mapActions } from 'vuex'; export default { methods: { ...mapActions('user', ['login']), // 映射 login Action async submitLogin() { const success = await this.login({ username: 'admin', password: '123456' }); if (success) { uni.navigateTo({ url: '/pages/home/index' }); } } } } ``` #### 场景 2:其他页面获/验证 Token ```javascript // 任意页面(如个人中心页) import { mapState, mapGetters } from 'vuex'; export default { computed: { // 直接获 Token ...mapState('user', ['token']), // 使用 Getter 验证登录状态 ...mapGetters('user', ['isAuthenticated']) }, onLoad() { if (!this.isAuthenticated) { uni.redirectTo({ url: '/pages/login/index' }); // 未登录跳转 } console.log('当前 Token:', this.token); // 使用 Token } } ``` #### 场景 3:发起需认证的 API 请求 ```javascript // 在需认证的页面或工具函数中 import store from '@/store'; export function fetchUserData() { const token = store.state.user.token; // 获 Token return uni.request({ url: '/api/user/profile', header: { 'Authorization': `Bearer ${token}` } // 注入 Token }); } ``` --- ### 三、关键注意事项 1. **持久化补充** Vuex 状态刷新会丢失,建议在 `SET_TOKEN` 中同步存储到本地: ```javascript // 在 mutations 的 SET_TOKEN 内添加 uni.setStorageSync('token', token); ``` 并在初始化时从本地存储恢复: ```javascript // 在 user.js 的 state 初始化时 token: uni.getStorageSync('token') || '' ``` 2. **模块化优势** 使用 `namespaced: true` 避免命名冲突,通过 `user/` 前缀调用(如 `this.$store.dispatch('user/login')`)[^2][^4]。 3. **安全实践** - Token 应通过 HTTPS 传输 - 敏感操作(如支付)需后端二次验证 - 定期刷新 Token 机制 --- ### 常见问题解决 - **页面获 Token 为 `undefined`?** 检查是否在 `main.js` 挂载 Store: ```javascript // main.js import store from '@/store' const app = new Vue({ ...App, store }) app.$mount() ``` - **异步 Action 报错?** 确保使用 `async/await` 或 `Promise` 处理异步逻辑[^5]。 --- ### 相关问题 1. Vuex 如何与 UniApp 的本地存储配合实现 Token 持久化? 2. 如何在拦截器中自动注入 Vuex 管理的 Token? 3. Vuex 模块化有什么好处?如何避免命名冲突? 4. 如何监听 Vuex 中 Token 的变化并触发相应操作? > 实现参考: > - Token 存储结构 [^2][^4] > - 异步登录 Action [^5] > - 模块化配置 [^4][^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值