Uniapp在vue3下使用vuex

Uniapp在vue3下使用vuex

前言

这里不介绍uniapp和vue3,只针对想要使用vuex,但目前因为使用的是uniapp和vue3,不知如何使用vuex滴同学。这篇文章也是我的开发笔记。

认识VUEX

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。简而言之就是用来存数据,可以有效减少使用组件传参困扰的头痛。
基本元素:store(里面存数据),mutation(里面修改数据),action(里面异步调用mutation来修改数据),getter(获取数据)
VUEX

引用VUEX

uniapp已经集成了vuex,所以我们只需要直接引用即可。
首先在根目录创建***store***文件夹,里面创建***index.js***
***index.js***的基本格式如下:

import {
	createStore
} from "vuex";

export default createStore({
	state: {
		type: 'wx',
		name: 'xxx',
		uid: "27777"
	},
	mutations: {
		// 定义mutations,用于修改状态(同步)
		updateUid(state, payload) {
			state.uid = payload
		}
	},
	actions: {
		// 定义actions,用于修改状态(异步)
		// 2秒后更新状态
		updateUid(context, payload) {
			setTimeout(() => {
				context.commit('updateUid', payload)
			}, 2000)
		}
	},
	getters: {
		// 定义一个getters
		formatUid(state) {
			return state.uid + ' Tom'
		}
	},
	modules: {}
});

在main.js添加相关代码

import App from './App'
import Store from './store'

// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {
  const app = createSSRApp(App)
  app.use(Store)
  return {
    app
  }
}
// #endif

MUTATIONS和ACTIONS的区别

事实上,如今可以直接使用pinia,不需要用什么vuex。但是据了解,uniapp还不支持pinia,所以只能使用vuex(pinia将mutations和actions合并了)。
Mutation 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。

Mutations

1、通过提交commit改变数据
2、只是一个单纯的函数
3、不要使用异步操作,异步操作会导致变量不能追踪

state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 变更状态
      state.count++
    }
  }

想调用一个mutations的function,需要调用 store.commit 方法。

import {
		useStore
	} from 'vuex'
const store = useStore()
store.commit('increment')

mutation必须是同步的修改state中的状态, 但是实际中, 异步的修改还是有很多场景的, 这种情况就需要action了.

Actions

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态。
  • 会默认将自身封装为一个Promise。
  • Action 可以包含任意异步操作。

也就是说, 在action中进行异步的操作, 当有结果后, 再根据结果提交相应的mutation.
让我们来注册一个简单的action:

state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。
实践中,我们会经常用到 ES2015 的 参数解构 来简化代码(特别是我们需要调用 commit 很多次的时候):

actions: {
  increment ({ commit }) {
    commit('increment')
  }
}

当我们想要调用actions的时候,使用

import {
		useStore
	} from 'vuex'
const store = useStore()
store.dispatch('increment')

MUTATIONS和ACTIONS的结合使用

这里直接举个存取user数据的例子,并结合request。


state先定义一个uid变量

uid:"2233"

mutation中定义改变uid的mutation

changeUid(state,new_uid){
	state.uid=new_uid
}

定义action请求数据

actions: {
	apiGetUid(context){
		uni.request({
		    url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。
		    data: {
		        text: 'uni.request'
		    },
		    header: {
		        'custom-header': 'hello' //自定义请求头信息
		    },
		    success: (res) => {
		        console.log(res.data)
		        context.commit("changeUid", res.data.uid)
		    }
		});
	}
}

然后我们在合适的地方调用就行啦

import {
		onLoad
	} from '@dcloudio/uni-app'
import {
		useStore
	} from 'vuex'
const store = useStore()
onLoad(()=>{
	if(store.state.uid==="2233"){
		store.dispatch("apiGetUid")
	}
	
})
UniApp使用Vue3编写Vuex,首先你需要安装`vue-router`, `vuex` 和 `vue-i18n` (如果需要国际化)等依赖。以下是基本的步骤: 1. **设置项目结构**: - 创建一个`store`文件夹用于存放Vuex的状态管理代码。 - 在`store`文件夹下创建`index.js`作为入口文件,这里将导入并配置Vuex实例。 ```javascript // store/index.js import Vue from 'uni-app' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ // 其他配置项... }) ``` 2. **创建模块**: - 根据应用需求,可以创建多个模块如`state`, `mutations`, `actions`, `getters`等。 - 比如创建一个简单的用户模块: ```javascript // store/modules/user.js export const state = { user: {} } export const mutations = { setUser(state, newUser) { state.user = newUser } } export const actions = { updateUser({ commit }, newUser) { return new Promise((resolve, reject) => { // 异步操作,例如从API获取数据 // resolve(newUser) // 或者在完成之后调用commit setTimeout(() => { commit('setUser', newUser) resolve() }, 1000) }) } } // getters 可以用于计算属性 export const getters = { getUser: state => state.user } ``` 3. **引用模块**: - 在需要使用Vuex的地方,通过`mapState`, `mapMutations`, `mapActions`, `mapGetters`将状态、 mutation、 action 和 getter 注入到组件中。 ```javascript // components/User.vue import { mapState, mapMutations } from 'vuex' export default { computed: { ...mapState(['getUser']) // 获取 user 状态 }, methods: { ...mapMutations(['updateUser']) // 调用 update 用户的方法 }, async handleUpdate() { await this.updateUser({ name: 'New User' }) // 异步更新 } } ``` 4. **使用`store.dispatch`和`store.commit`**: - 如果需要在非组件上下文中触发action,可以直接使用`store.dispatch`。 - 对于修改状态的操作,应该始终使用`store.commit`,因为它会在全局记录队列中记录变更。 记得在`main.js`或项目的入口处,把`store`对象暴露出来供其他地方使用
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值