【uniapp】(6) uniapp中使用vuex

  • uniapp内置了vuex,不需要通过npm重新安装,直接引用即可

1、创建 Vuex Store

(1)在uniapp项目根目录下创建 store/index.js

javascript 复制代码
import Vue from 'vue' 
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
	//存放状态
	state: {
		'userName': 'admin',
		'userAge': '20',
	}
	// modules: { },
})

export default store

(2)main.js中去配置store,并挂载到vue实例中

javascript 复制代码
import App from './App'

// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'

//引入uviewUI 组件库
// import uView from '@/uni_modules/uview-ui'
// Vue.use(uView)

import store from "./store"//vuex(1) - 引入store

import uView from "uview-ui";
Vue.use(uView);

Vue.config.productionTip = false
Vue.prototype.store = store //vuex(2)--全局挂载store, 使用方法 this.$store.xxx

App.mpType = 'app'
const app = new Vue({
  ...App,
  store, //vuex(3)-- 挂载到vue实例中
})
app.$mount()
// #endif

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

2、uniapp页面中vuex的调用

javascript 复制代码
'方法1、使用vuex中的 mapState 辅助函数获取 (推荐使用)'
import {mapState} from 'vuex' //方法3、通过引入 mapState 辅助函数获取store中值

//方法3:mapState 获取store中数据
 computed: {
      ...mapState({
        //从state中拿到数据,箭头函数更简便
        username: state => state.userName,
        userage: state => state.userAge,
      }),
},

/*==========================其他调用方式================================*/

'方法2、目标页面直接引入store/index.js文件调用'

import store from "@/store/index.js"
 computed:{
      username(){
        return store.state.userName //方法1、直接引用store--获取数据
      },
  },

'方法3、通过main.js中全局挂载的store获取'

 computed:{
      userage(){
        return this.$store.state.userAge //方法2、通过main.js的挂载使用 => this.$store
      }
},
html 复制代码
<template>
	<view class="content">
		<image class="logo" src="/static/logo.png"></image>
		
		<view>
			<view>姓名:{{username}}</view>
			<view>年龄:{{userage}}</view>
		</view>
	</view>
</template>

<script>
	import { mapState } from "vuex"//(1)通过引入mapState辅助函数获取store中值
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		onLoad() {

		},
		computed:{
			...mapState({
				username:state => state.userName,
				userage:state =>  state.userAge
			})
		},
		methods: {

		}
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.logo {
		height: 200rpx;
		width: 200rpx;
		margin-top: 200rpx;
		margin-left: auto;
		margin-right: auto;
		margin-bottom: 50rpx;
	}

	.text-area {
		display: flex;
		justify-content: center;
	}

	.title {
		font-size: 36rpx;
		color: #8f8f94;
	}
</style>

3、获取设备基本信息并保存到vuex中

(1)store/index.js 添加设备信息元素,并添加同步异步修改方法

javascript 复制代码
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex) //注册并使用vuex

// vuex 主要包括 5大模块 state、mutations、actions、 getters、modules 

//Vuex.Store 构造器选项 
const store = new Vuex.Store({
	//存放状态
	state: {
		'userName': 'admin',
		'userAge': '20',
		systemInfo: '', //存储设备信息
		statusBarHeight: 0, //设备顶部状态栏信息
	},
	//获取数据
	getters: {},

	//执行同步操作方法
	mutations: {
		//设置设备信息
		SET_SYSTEM_INFO(state, data) {
			console.warn('--vuex--> setSystemInfo--', state, data)
			state.systemInfo = data ? data : ''
		},
		//设置顶部导航栏高度
		SET_STATUS_BAR_HEIGHT(state, data) {
			console.warn('---vuex--> setStatusBarHeight--', state, data)
			state.setStatusBarHeight = data || 0
		},
	},
	//提交 mutations (执行异步操作方法)
	actions: {
		SET_SYSTEM_INFO_ASYNC(context, value) {
			context.commit('SET_SYSTEM_INFO', value)
		},
		SET_STATUS_BAR_HEIGHT_ASYNC(context, value) {
			context.commit('SET_STATUS_BAR_HEIGHT', value)
		},
	},

	//细分模块 
	modules: {}
})
//默认导出
export default store

(2)App.vue中获取设备基础信息,并存储到vuex中

javascript 复制代码
<script>
	import store from './store' //(1)引入store 
	export default {
		onLaunch: function() {
			console.log('App Launch')
			uni.getSystemInfo({
				success: function(res) {
					console.warn('---获取设备信息 getSystemInfo---', res)
					console.log('状态栏高度:', res.statusBarHeight) //手机状态栏高度
					console.log('系统名称:', res.osName) //系统名称
					console.log('手机型号:', res.model); // 手机型号
					console.log('设备像素比:', res.pixelRatio); // 设备像素比
					console.log('屏幕宽度:', res.screenWidth); // 屏幕宽度
					console.log('屏幕高度:', res.screenHeight); // 屏幕高度
					console.log('可使用窗口宽度:', res.windowWidth); // 可使用窗口宽度
					console.log('可使用窗口高度:', res.windowHeight); // 可使用窗口高度
					console.log('微信设置的语言:', res.language); // 微信设置的语言
					console.log('微信版本号:', res.version); // 微信版本号
					//(2)设备信息存储到vuex中
					store.dispatch('SET_SYSTEM_INFO_ASYNC', res)
					store.dispatch('SET_STATUS_BAR_HEIGHT_ASYNC', res.statusBarHeight)
				},
			})
		},
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		}
	}
</script>

<style lang="scss">
	/*每个页面公共css */
	/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
	// @import "@/uni_modules/uview-ui/index.scss"; 

	@import "uview-ui/index.scss";
</style>

(3)效果展示

(4)拓展知识

javascript 复制代码
// 调用方式需要加上模块路径 -- 调用mutations方法
this.$store.commit('system/setSystemInfoAsync')  // ✓ 正确
// 或
...mapMutations('system', ['setSystemInfoAsync'])

// 页面调用 action方法
this.$store.dispatch('setSystemInfoAsync')
相关推荐
MY_TEUCK18 小时前
【AI开发】从0到1写一个uni-app Vue3 小程序开发的Skill:用法、流程与踩坑复盘
人工智能·uni-app
雪芽蓝域zzs18 小时前
uni-app x uts类转换
uni-app
游戏开发爱好者819 小时前
深入理解iOSTime Profiler:提升iOS应用性能的关键工具
android·ios·小程序·https·uni-app·iphone·webview
gskyi19 小时前
UniApp Vue3 数据透传终极指南
javascript·vue.js·uni-app
gskyi19 小时前
uni-app 高阶实战:onLoad与getCurrentPages深度技巧
前端·javascript·vue.js·uni-app
阿奇__1 天前
uniapp支付宝 H5 开发踩坑,hash模式下取参要规范!
开发语言·uni-app
云起SAAS2 天前
小智笔记APP源码 | 8大广告联盟聚合(穿山甲/优量汇/快手/百度) | 应用市场过审极速版 | uni-app全栈商用项目
笔记·uni-app·广告联盟·笔记app
蹦哒2 天前
UniApp 原生插件开发完整指南
uni-app
a_Ichuan2 天前
在HBuilderX创建的uniapp项目中使用unocss
前端·uni-app
web前端神器2 天前
记录uniapp小程序的报错
小程序·uni-app·apache