微信小程序全局数据共享

一、前言

在微信小程序开发中,随着项目规模的扩大,多个页面之间需要共享一些公共数据,例如:

  • 用户登录状态
  • 用户信息
  • 购物车数据
  • 配置信息
  • 主题设置等

如何高效地实现 跨页面的数据共享与管理,是提升小程序可维护性、降低耦合度的关键。

本文将带你全面掌握 微信小程序中实现全局数据共享的多种方式,包括:

✅ 使用 app.js 全局变量

✅ 使用 globalData 实现基础共享

✅ 使用自定义模块封装全局状态管理

✅ 使用本地缓存 wx.setStorageSync()

✅ 使用第三方状态管理方案(如 Redux 小程序适配)

✅ 实战案例:用户登录状态共享

并通过完整的代码示例帮助你快速上手并灵活应用。

二、什么是全局数据共享?

全局数据共享 是指在整个小程序生命周期内,多个页面和组件可以访问和修改一组共享的数据。它不同于单个页面的 data 数据,而是面向整个小程序的"全局变量"。

✅ 常见应用场景:

场景 示例
登录状态 判断是否已登录,控制页面跳转
用户信息 多页面展示用户名、头像等
购物车数据 多个商品页、购物车页同步更新
主题配置 深色/浅色模式切换
API 基础 URL 统一接口地址

三、使用 globalData 实现全局数据共享

这是最基础也是最常用的全局数据共享方式。

✅ 步骤1:在 app.js 中定义 globalData

javascript 复制代码
// app.js
App({
  globalData: {
    userInfo: null,
    token: '',
    theme: 'light'
  }
});

✅ 步骤2:在页面中读取或修改 globalData

javascript 复制代码
// pages/index/index.js
const app = getApp();

Page({
  onLoad() {
    // 读取全局数据
    console.log('当前主题:', app.globalData.theme);

    // 修改全局数据
    app.globalData.userInfo = { name: 'Qwen', avatar: 'https://example.com/avatar.jpg' };
  }
});

✅ 注意事项:

  • getApp() 获取的是小程序实例,必须在页面加载后调用。
  • 不建议频繁修改 globalData,应结合本地存储或状态管理优化性能。

四、封装全局状态管理模块(推荐)

为了提高可维护性和解耦,我们可以封装一个全局状态管理模块。

✅ 步骤1:创建 utils/globalState.js

javascript 复制代码
// utils/globalState.js
const app = getApp();

const GlobalState = {
  setUserInfo(userInfo) {
    app.globalData.userInfo = userInfo;
    wx.setStorageSync('userInfo', userInfo);
  },

  getUserInfo() {
    return app.globalData.userInfo || wx.getStorageSync('userInfo');
  },

  setToken(token) {
    app.globalData.token = token;
    wx.setStorageSync('token', token);
  },

  getToken() {
    return app.globalData.token || wx.getStorageSync('token');
  }
};

module.exports = GlobalState;

✅ 步骤2:在页面中使用

javascript 复制代码
// pages/userCenter/userCenter.js
const GlobalState = require('../../utils/globalState');

Page({
  onLoad() {
    const userInfo = GlobalState.getUserInfo();
    if (userInfo) {
      console.log('用户信息:', userInfo);
    } else {
      wx.navigateTo({ url: '/pages/login/login' });
    }
  }
});

五、使用本地缓存进行持久化共享

如果希望数据在小程序关闭后依然保留,可以使用本地缓存。

✅ 示例:保存和读取登录状态

javascript 复制代码
// 登录成功时
wx.setStorageSync('isLoggedIn', true);
wx.setStorageSync('token', 'abc123xyz');

// 页面检查是否登录
const isLoggedIn = wx.getStorageSync('isLoggedIn');
if (!isLoggedIn) {
  wx.showToast({ title: '请先登录' });
}

六、使用第三方状态管理库(进阶)

如果你的小程序项目较为复杂,建议引入类似 Redux 的状态管理模式。

✅ 推荐库:

  • Miniprogram-simplied-redux
  • Taro + Redux(适用于多端开发)

✅ 简单使用流程(以简化版为例):

bash 复制代码
npm install miniprogram-simplied-redux
javascript 复制代码
// store.js
import { createStore } from 'miniprogram-simplied-redux';

const initialState = {
  cartCount: 0
};

function reducer(state = initialState, action) {
  switch (action.type) {
    case 'ADD_TO_CART':
      return { ...state, cartCount: state.cartCount + 1 };
    default:
      return state;
  }
}

const store = createStore(reducer);
export default store;
javascript 复制代码
// 页面中使用
import store from '../../store';

Page({
  addToCart() {
    store.dispatch({ type: 'ADD_TO_CART' });
    console.log('当前购物车数量:', store.getState().cartCount);
  }
});

七、实战案例:用户登录状态共享

✅ 功能描述:

  • 登录页设置全局状态
  • 首页判断是否登录
  • 用户中心页显示用户信息

✅ 登录页逻辑(login.js)

javascript 复制代码
const GlobalState = require('../../utils/globalState');

Page({
  data: {
    username: '',
    password: ''
  },
  onInputUsername(e) {
    this.setData({ username: e.detail.value });
  },
  onInputPassword(e) {
    this.setData({ password: e.detail.value });
  },
  onSubmit() {
    // 模拟登录成功
    const userInfo = { name: this.data.username, avatar: 'https://example.com/avatar.jpg' };
    GlobalState.setUserInfo(userInfo);
    GlobalState.setToken('mock-token-123');

    wx.navigateBack(); // 返回上一页
  }
});

✅ 首页逻辑(index.js)

javascript 复制代码
const GlobalState = require('../../utils/globalState');

Page({
  onLoad() {
    const userInfo = GlobalState.getUserInfo();
    if (!userInfo) {
      wx.navigateTo({ url: '/pages/login/login' });
    } else {
      console.log('欢迎回来:', userInfo.name);
    }
  }
});

✅ 用户中心页(userCenter.js)

javascript 复制代码
const GlobalState = require('../../utils/globalState');

Page({
  data: {
    userInfo: {}
  },
  onLoad() {
    const userInfo = GlobalState.getUserInfo();
    this.setData({ userInfo });
  }
});

八、常见问题与解决方案

问题 原因 解决方法
getApp() 报错 页面未加载完成 onLoad 后调用
数据未更新 未触发 setData 页面中需手动更新 UI
缓存数据丢失 未正确使用 wx.setStorageSync 保存到本地并恢复
多人协作冲突 全局变量命名混乱 使用统一命名空间
状态不一致 多页面异步操作导致 使用事件通知或监听机制

九、总结对比表:全局数据共享方式一览

方法 是否持久 是否支持多页面 是否适合大型项目 推荐指数
globalData ✅(中小型) ⭐⭐⭐⭐
本地缓存 ⭐⭐⭐⭐
自定义模块封装 ✅✅✅ ⭐⭐⭐⭐⭐
第三方状态管理 ✅✅✅✅ ⭐⭐⭐⭐⭐
事件总线通信 ⭐⭐

十、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
2501_9160074715 分钟前
深入理解 iOS 文件管理体系,从沙盒结构到多工具协同的工程化文件管理实践
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张15 分钟前
iOS 性能检测工具深度解析 多工具协同下的全维度性能检测体系建设
android·ios·小程序·https·uni-app·iphone·webview
说私域25 分钟前
天猫卖家运营突围:基于开源AI智能名片链动2+1模式S2B2C商城小程序的转型路径研究
人工智能·小程序·开源
00后程序员张29 分钟前
Fiddler调试工具全面解析 HTTPHTTPS抓包、代理设置与接口测试实战教程
前端·测试工具·ios·小程序·fiddler·uni-app·webview
Alex8132038 分钟前
scheme跳转小程序 打不开知道指定页
小程序
2501_9159184141 分钟前
uniapp iOS 打包和上架流程,一次跨端项目的工程化交付记录
android·ios·小程序·https·uni-app·iphone·webview
2501_916008891 小时前
HTTPS 双向认证抓包指南,TLS 握手分析、mTLS 排查方法与多工具协同方案
android·网络协议·http·小程序·https·uni-app·iphone
游戏开发爱好者81 小时前
如何解决浏览器HTTPS不安全连接警告及SSL证书问题
安全·ios·小程序·https·uni-app·iphone·ssl
2501_916008891 小时前
App 上架服务行业的实际工作流程与工具选择 从人工代办到跨平台自动化的转变
android·运维·ios·小程序·uni-app·自动化·iphone
说私域1 小时前
基于开源AI大模型AI智能名片S2B2C商城小程序的爆品力构建:兴趣电商生态下的能力解构与实践路径
人工智能·小程序·开源