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")
	}
	
})
  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
UniappVue3中使用Vuex可能会有一些困惑,因为目前Uniapp还不支持pinia,所以只能使用Vuex使用Vuex的方法如下所示: 1. 首先,你需要在main.js中导入App和Store: ```javascript import App from './App' import Store from './store' ``` 2. 然后,在main.js中创建应用程序并使用Vuex: ```javascript import { createSSRApp } from 'vue' export function createApp() { const app = createSSRApp(App) app.use(Store) return { app } } ``` 3. 接下来,你可以在组件中使用Vuex。在组件中使用Vuex的一种常见方式是使用mapState和mapActions,它们可以帮助你简化代码并直接访问Vuex中的状态和操作。例如: ```javascript import { mapState, mapActions } from 'vuex' export default { computed: { ...mapState(['count']) }, methods: { ...mapActions(['increment']) } } ``` 在这个例子中,通过mapState将Vuex中的count状态映射到组件的计算属性中,并通过mapActions将Vuex中的increment操作映射到组件的方法中。 总结起来,要在UniappVue3中使用Vuex,你需要在main.js中导入App和Store,并使用createSSRApp创建应用程序并使用Vuex。然后,在组件中可以使用mapState和mapActions来访问Vuex中的状态和操作。请注意,目前还没有使用pinia的替代方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Uniappvue3下使用vuex](https://blog.csdn.net/Marlene_Jiang/article/details/122821318)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值