uniapp全局状态管理实现方案

Uniapp 全局状态管理实现方案

在 Uniapp 中实现全局状态管理有以下几种常用方法:

1. Vuex 状态管理(推荐)

Vuex 是 Vue 的官方状态管理库,适用于复杂应用的状态管理。

安装与配置

  1. 在项目中安装 Vuex:
bash 复制代码
npm install vuex --save
  1. 创建 store 目录结构:

    ├── store
    │ ├── index.js # 主入口文件
    │ ├── modules # 模块目录
    │ │ ├── user.js # 用户模块
    │ │ └── cart.js # 购物车模块

  2. 主入口文件示例 (store/index.js):

javascript 复制代码
import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'
import cart from './modules/cart'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    user,
    cart
  }
})

export default store
  1. main.js 中引入:
javascript 复制代码
import store from './store'

const app = new Vue({
  store,
  ...App
})

使用示例

javascript 复制代码
// 在组件中使用
export default {
  computed: {
    // 获取状态
    username() {
      return this.$store.state.user.username
    }
  },
  methods: {
    // 提交 mutation
    updateUsername() {
      this.$store.commit('user/SET_USERNAME', 'newName')
    },
    // 分发 action
    fetchUserInfo() {
      this.$store.dispatch('user/fetchUserInfo')
    }
  }
}

2. 全局变量和事件总线

对于小型应用,可以使用简单的全局变量和事件总线:

全局变量

main.js 中定义:

javascript 复制代码
Vue.prototype.$globalData = {
  userInfo: null,
  token: ''
}

组件中使用:

javascript 复制代码
this.$globalData.userInfo = {name: 'John'}

事件总线

main.js 中创建:

javascript 复制代码
Vue.prototype.$eventBus = new Vue()

组件中使用:

javascript 复制代码
// 发送事件
this.$eventBus.$emit('user-login', userInfo)

// 接收事件
this.$eventBus.$on('user-login', (userInfo) => {
  console.log(userInfo)
})

3. Uniapp 自带的 globalData

App.vue 中定义:

javascript 复制代码
export default {
  globalData: {
    userInfo: null
  },
  onLaunch() {
    // 初始化
  }
}

任何页面获取和修改:

javascript 复制代码
// 获取
const app = getApp()
console.log(app.globalData.userInfo)

// 设置
app.globalData.userInfo = {name: 'John'}

4. Pinia(Vuex 的替代方案)

Pinia 是新一代的 Vue 状态管理库,更轻量且易于使用。

安装与配置

  1. 安装:
bash 复制代码
npm install pinia @pinia/nuxt
  1. main.js 中:
javascript 复制代码
import { createPinia } from 'pinia'

const pinia = createPinia()
const app = new Vue({
  pinia,
  ...App
})
  1. 创建 store (stores/user.js):
javascript 复制代码
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({
    name: 'John',
    age: 30
  }),
  actions: {
    updateName(newName) {
      this.name = newName
    }
  }
})
  1. 组件中使用:
javascript 复制代码
import { useUserStore } from '@/stores/user'

export default {
  setup() {
    const userStore = useUserStore()
    
    return {
      userStore
    }
  }
}

选择建议

  • 小型应用:使用 globalData 或事件总线
  • 中型应用:使用 Vuex
  • 新项目或喜欢新特性:考虑 Pinia

每种方案都有其适用场景,根据项目复杂度选择最合适的方案。

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师1 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学1 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端