微信小程序在使用页面栈保存页面信息时,如何避免数据丢失?

微信小程序在使用页面栈保存页面信息时避免数据丢失的方法:

一、使用全局变量存储关键数据

  1. 定义一个全局变量,例如在 app.js 中,用于存储页面的重要信息。
  2. 在页面的 onHideonUnload 生命周期中,将需要保存的数据存储到该全局变量。
  3. 在页面的 onShow 生命周期中,从全局变量中读取数据并恢复页面状态。

二、使用本地存储(Local Storage)

  1. 在页面的 onHideonUnload 生命周期中,使用 wx.setStorageSyncwx.setStorage 将重要数据存储到本地存储。
  2. 在页面的 onShow 生命周期中,使用 wx.getStorageSyncwx.getStorage 从本地存储中读取数据并恢复页面状态。

三、使用页面栈的 data 属性进行临时存储

  1. 在页面的 onHideonUnload 生命周期中,将重要数据存储到页面栈的 data 属性中。
  2. 在页面的 onShow 生命周期中,从页面栈的 data 属性中读取数据并恢复页面状态。

以下是具体的实现示例:

一、使用全局变量存储关键数据

app.js

javascript 复制代码
App({
  globalData: {
    pageData: {}
  }
});

页面的 js 文件

javascript 复制代码
const app = getApp();

Page({
  data: {
    list: [],
    inputValue: ''
  },

  onLoad: function() {
    // 模拟生成一些列表数据
    let tempList = [];
    for (let i = 0; i < 100; i++) {
      tempList.push(`Item ${i}`);
    }
    this.setData({
      list: tempList
    });
  },

  onHide: function() {
    // 存储数据到全局变量
    let pages = getCurrentPages();
    let currentPage = pages[pages.length - 1];
    app.globalData.pageData[currentPage.route] = {
      inputValue: this.data.inputValue,
      list: this.data.list
    };
  },

  onShow: function() {
    // 从全局变量中读取数据
    let pageData = app.globalData.pageData[this.route];
    if (pageData) {
      this.setData({
        inputValue: pageData.inputValue,
        list: pageData.list
      });
    }
  },

  onInput: function(event) {
    this.setData({
      inputValue: event.detail.value
    });
  }
});

代码解释

  • app.js
    • 定义了一个 globalData 对象,其中 pageData 用于存储各个页面的数据。
  • 页面的 js 文件
    • onLoad:模拟生成列表数据并更新到 data 中。
    • onHide:将当前页面的输入框值 inputValue 和列表数据 list 存储到 app.js 的全局变量中,使用 currentPage.route 作为存储的键,确保每个页面的数据存储在不同的位置。
    • onShow:从 app.js 的全局变量中根据当前页面的路由读取数据,并更新到当前页面的 data 中。
    • onInput:更新输入框的值到 data 中。

二、使用本地存储(Local Storage)

页面的 js 文件

javascript 复制代码
Page({
  data: {
    list: [],
    inputValue: ''
  },

  onLoad: function() {
    // 模拟生成一些列表数据
    let tempList = [];
    for (let i = 0; i < 100; i++) {
      tempList.push(`Item ${i}`);
    }
    this.setData({
      list: tempList
    });
  },

  onHide: function() {
    // 存储数据到本地存储
    wx.setStorageSync(this.route, {
      inputValue: this.data.inputValue,
      list: this.data.list
    });
  },

  onShow: function() {
    // 从本地存储中读取数据
    let pageData = wx.getStorageSync(this.route);
    if (pageData) {
      this.setData({
        inputValue: pageData.inputValue,
        list: pageData.list
      });
    }
  },

  onInput: function(event) {
    this.setData({
      inputValue: event.detail.value
    });
  }
});

代码解释

  • onLoad:模拟生成列表数据并更新到 data 中。
  • onHide:使用 wx.setStorageSync 将当前页面的输入框值 inputValue 和列表数据 list 存储到本地存储,以当前页面的路由作为存储的键。
  • onShow:使用 wx.getStorageSync 从本地存储中根据当前页面的路由读取数据,并更新到当前页面的 data 中。
  • onInput:更新输入框的值到 data 中。

三、使用页面栈的 data 属性进行临时存储

页面的 js 文件

javascript 复制代码
Page({
  data: {
    list: [],
    inputValue: ''
  },

  onLoad: function() {
    // 模拟生成一些列表数据
    let tempList = [];
    for (let i = 0; i < 100; i++) {
      tempList.push(`Item ${i}`);
    }
    this.setData({
      list: tempList
    });
  },

  onHide: function() {
    // 存储数据到页面栈的 data 属性
    let pages = getCurrentPages();
    let currentPage = pages[pages.length - 1];
    currentPage.data.savedData = {
      inputValue: this.data.inputValue,
      list: this.data.list
    };
  },

  onShow: function() {
    // 从页面栈的 data 属性中读取数据
    let pages = getCurrentPages();
    let currentPage = pages[pages.length - 1];
    let savedData = currentPage.data.savedData;
    if (savedData) {
      this.setData({
        inputValue: savedData.inputValue,
        list: savedData.list
      });
    }
  },

  onInput: function(event) {
    this.setData({
      inputValue: event.detail.value
    });
  }
});

代码解释

  • onLoad:模拟生成列表数据并更新到 data 中。
  • onHide:将当前页面的输入框值 inputValue 和列表数据 list 存储到页面栈当前页的 data 属性中的 savedData 对象中。
  • onShow:从页面栈当前页的 data 属性中读取 savedData,并更新到当前页面的 data 中。
  • onInput:更新输入框的值到 data 中。

注意事项

  • 全局变量方法:
    • 适合存储一些全局通用的数据,但如果存储的数据过多,可能会占用较多内存,并且在小程序关闭后数据会丢失。
    • 对于一些轻量级的数据和状态,这种方式较为方便。
  • 本地存储方法:
    • 数据存储在本地,即使小程序关闭后也能保存,但存储的数据大小有限制(一般不超过 10MB)。
    • 适合存储需要长期保存的数据,但读取和写入速度相对较慢。
  • 页面栈 data 属性方法:
    • 适合临时存储,仅在页面栈存在时有效,小程序关闭后会丢失数据。
    • 适合存储页面切换时的临时状态数据。

你可以根据不同的需求选择合适的存储方式,以确保在使用页面栈保存页面信息时避免数据丢失。同时,在存储和读取数据时要注意数据的结构和键的设置,确保数据的一致性和准确性。

相关推荐
菜鸟una12 分钟前
【taro3 + vue3 + webpack4】在微信小程序中的请求封装及使用
前端·vue.js·微信小程序·小程序·typescript·taro
换日线°11 小时前
微信小程序单双周选择排序有效果图
微信小程序
HumoChen9914 小时前
GZip+Base64压缩字符串在ios上解压报错问题解决(安卓、PC模拟器正常)
android·小程序·uniapp·base64·gzip
qq_124987075315 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计
小新11017 小时前
微信小程序学习之底部导航栏
微信小程序·导航栏
小新11017 小时前
微信小程序 密码框改为text后不可见,需要点击一下
微信小程序·小程序·notepad++
Maitians18 小时前
微信小程序 自定义图片分享-绘制数据图片以及信息文字
微信小程序·小程序
Mr.app1 天前
uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
微信小程序·uni-app
老李不敲代码1 天前
榕壹云搭子系统技术解析:基于Spring Boot+MySQL+UniApp的同城社交平台开发实践
spring boot·mysql·微信小程序·uni-app·软件需求