(4#)【已解决】微信小程序一个页面修改了全局变量,另一个页面却还是显示该变量的初始值

微信小程序踩坑记

问题描述:

做法:设想,在一个页面A的A.js中改变app.js中设置的某全局变量 theGlobalData 的值,然后在页面B的B.wxml上专门有一个{ {theGlobalData}}用来获取并显示该全局变量值的表达式。
目的:上述做法目的是当我们在A.js中对一个变量做了变化,希望另一个页面B.wxml能够实时呈现该变量被改变后的值。
遇到的困难:A.js中改变的这个全局变量在B.wxml中还是显示原来的初始值,并没有因A.js中的赋值而改变。
各类尝试和调整
1. 是不是没用到this.setData({ }),导致我data里的值没被重新刷新和覆盖?用了。
2. 是不是没用var app=getApp()?也用了。
3. 是不是没用正确的赋值语句,如app.globalData.theGlobalData=xxxx?用了。
4. 其他页面C.js、D.js、F.js中用console.log(app.globalData.theGlobalData)显示一下,发现该语句放onLoad()中也是在控制台输出初始值,但是!用在其他函数方法中却是已经改变后的值!!如放在某个标签的点击方法中,点击就会输出改变后的值。
5. 在B.js中也做了步骤4的尝试,发现效果一样。B、C、D、F页面都是一样的情况!

结论:全局变量的值确实在A.js中改变了,只不过切换去其他页面时,这些页面没有再进行渲染,页面不重新渲染就表现出页面没有刷新一样,所以表现出该全局变量并没有在wxml上呈现新值。

解决办法:

在需要呈现该全局变量值的B、C、D、F等.wxml页面都在生命周期函数onShow中写上this.setData({ …})代码,这样才能实现切换到B页面就保证渲染一次.wxml文件,onShow该函数表示一旦呈现该页面在用户眼中时要做些什么动作

<think>好的,用户想在微信小程序中创建一个全局变量。首先,我需要回忆微信小程序的框架和相关的API。微信小程序主要使用JavaScript进行逻辑处理,而全局变量的管理通常涉及到app.js这个文件。 用户可能对小程序的结构不太熟悉,所以需要先解释全局变量的概念和适用场景。全局变量在整个小程序的生命周期中都可以访问,适合存储一些需要跨页面共享的数据,比如用户登录状态、主题设置等。 接下来,要详细说明如何在app.js中定义全局变量。这里需要提到在App()函数中使用globalData对象来存储这些变量,并给出具体的代码示例。例如,在app.js中定义globalData对象,包含userInfo和theme等属性。 然后,用户可能想知道如何在其他页面或组件中获取修改这些全局变量。需要分步骤说明,首先如何获取小程序实例,然后访问globalData中的属性。同时,要提醒用户如果在多个地方修改全局变量,可能会存在数据不一致的问题,需要考虑状态管理或使用全局函数来统一修改。 此外,可能还需要提到一些注意事项,比如全局变量的生命周期,以及在小程序销毁时数据是否会丢失。还有,如果数据需要持久化存储,应该使用wx.setStorageSync等API将数据保存在本地缓存中。 用户可能有不同的使用场景,比如只是临时存储一些数据,或者需要长期保存。这时候需要区分全局变量和本地缓存的不同用途,确保用户根据需求选择合适的方法。 最后,检查是否有遗漏的步骤,比如是否需要引入其他模块,或者是否有更佳实践,比如使用Vuex或Redux等状态管理库。不过微信小程序本身可能不支持这些库,所以需要依赖原生的globalData方法。 总结下来,回答应该包括定义全局变量的方法、如何在不同页面访问和修改、注意事项以及补充建议,比如使用本地缓存。同时,保持语言简洁明了,结构清晰,方便用户按照步骤操作。</think>在微信小程序中创建全局变量,可以通过以下步骤实现: ━━━━━━━━━━━━━━ 一、核心实现方法 ━━━━━━━━━━━━━━ 1. 修改 app.js 文件 ```javascript // app.js App({ globalData: { userInfo: null, // 用户信息 themeColor: &#39;#1890ff&#39;, // 主题色 token: &#39;&#39;, // 登录凭证 systemInfo: {} // 系统信息 } }) ``` 2. 页面中访问全局变量 ```javascript // 任意页面.js const app = getApp() Page({ onLoad() { console.log(&#39;当前主题色:&#39;, app.globalData.themeColor) // 修改全局变量 app.globalData.userInfo = {nickName: &#39;小明&#39;} } }) ``` ━━━━━━━━━━━━━━ 二、最佳实践建议 ━━━━━━━━━━━━━━ 1. 类型安全(推荐TypeScript): ```typescript // global-data.d.ts declare type GlobalData = { version: string hasLogin: boolean deviceId: string } // app.ts App<GlobalData>({ globalData: { version: &#39;1.0.0&#39;, hasLogin: false, deviceId: &#39;&#39; } }) ``` 2. 封装访问方法(推荐): ```javascript // utils/global.js export function getGlobal(key) { return getApp().globalData[key] } export function setGlobal(key, value) { getApp().globalData[key] = value // 可扩展数据变更通知逻辑 } ``` ━━━━━━━━━━━━━━ 三、注意事项 ━━━━━━━━━━━━━━ 1. 生命周期特性: - 全局变量在冷启动时会重新初始化 - 热启动时保持原有状态 - 页面关闭不影响全局变量 2. 数据持久化: ```javascript // 启动时读取缓存 App({ globalData: { token: wx.getStorageSync(&#39;token&#39;) || &#39;&#39; } }) // 修改时同步存储 app.globalData.token = &#39;new_token&#39; wx.setStorageSync(&#39;token&#39;, &#39;new_token&#39;) ``` 3. 内存管理: - 避免存储大型数据(建议超过1MB的数据使用本地存储) - 及时清理不再使用的数据 ━━━━━━━━━━━━━━ 四、适用场景对比 ━━━━━━━━━━━━━━ | | 全局变量 | 本地存储 | 页面参数递 | |----------|-------------|-------------|-----------| | 数据时效 | 内存级别 | 持久化存储 | 临时递 | | 读写速度 | 最快 | 较慢 | 快 | | 存储上限 | 无明确限制 | 10MB | URL长度限制 | | 典型用途 | 运行时状态管理 | 用户偏好设置 | 页面间简单参 | 提示:对于需要响应式更新的数据,建议配合使用 `EventChannel` 或 `observers` 实现数据监听。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值