微信小程序:中途退出原页面,再次进入无法回到退出时的位置

news/2025/1/16 7:13:02/

相信很多小程序>微信小程序的开发者都会碰到这样的问题,那今天我们就来详细的看下如何解决

一、使用 scroll-view 组件保存滚动位置

  1. wxml 文件中,使用 scroll-view 组件包裹需要滚动的内容。
  2. data 中定义一个变量来存储 scroll-viewscroll-top 属性值。
  3. scroll-viewbindscroll 事件中,实时更新存储的 scroll-top 值。
  4. 当再次进入页面时,将存储的 scroll-top 值设置到 scroll-viewscroll-top 属性上。

二、使用页面栈保存页面信息

  1. onHideonUnload 生命周期函数中,将当前页面的滚动位置等信息存储到 getCurrentPages 获取的页面栈中。
  2. onShow 生命周期函数中,从页面栈中取出存储的信息,并恢复滚动位置等状态。

以下是一个使用 scroll-view 组件的具体实现示例:

wxml 文件

<scroll-view scroll-y="true" bindscroll="onScroll" scroll-top="{{scrollTop}}"><!-- 这里放置你的页面内容 --><view wx:for="{{list}}" wx:key="index">{{item}}</view>
</scroll-view>

js 文件

Page({data: {scrollTop: 0, // 存储 scroll-view 的 scroll-top 属性值list: [] // 假设这是页面中的列表数据},onLoad: function() {// 模拟生成一些列表数据let tempList = [];for (let i = 0; i < 100; i++) {tempList.push(`Item ${i}`);}this.setData({list: tempList});},onScroll: function(event) {// 当 scroll-view 滚动时,更新 scrollTop 的值this.setData({scrollTop: event.detail.scrollTop});},onHide: function() {// 页面隐藏时,可以将 scrollTop 的值存储到本地缓存或全局数据中// 这里仅存储在页面数据中,实际开发可根据需求存储在更合适的地方// 例如:wx.setStorageSync('pageScrollTop', this.data.scrollTop);},onShow: function() {// 页面显示时,将存储的 scrollTop 值取出并设置到 scroll-view 上// 例如:let storedScrollTop = wx.getStorageSync('pageScrollTop');// 这里仅从页面数据中取出,假设之前存储在页面数据中let storedScrollTop = this.data.scrollTop;if (storedScrollTop) {this.setData({scrollTop: storedScrollTop});}}
});

代码解释

  • wxml 部分
    • <scroll-view> 组件设置了 scroll-y="true" 表示允许垂直滚动,bindscroll="onScroll" 绑定了滚动事件,scroll-top="{{scrollTop}}" 用于设置和获取滚动条的垂直位置。
    • 内部的 <view wx:for="{{list}}" wx:key="index">{{item}}</view> 是一个简单的列表,用于演示滚动内容。
  • js 部分
    • onLoad 函数:模拟生成一个包含 100 个元素的列表数据,并更新到 data 中的 list 属性。
    • onScroll 函数:当 scroll-view 滚动时,会触发该函数,将滚动的 scrollTop 值更新到 data 中的 scrollTop 属性,实现实时存储滚动位置。
    • onHide 函数:当页面隐藏时,可将 scrollTop 值存储到更稳定的存储位置,如本地缓存 wx.setStorageSync,这里为简单起见,只是在页面数据中存储。
    • onShow 函数:当页面再次显示时,从存储位置(这里从页面数据中)取出存储的 scrollTop 值,并设置到 scroll-viewscroll-top 属性,以恢复滚动位置。

使用页面栈的方法如下:

js 文件

Page({data: {list: [] // 假设这是页面中的列表数据},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];// 将当前页面的 scrollTop 等信息存储在页面栈的当前页面数据中currentPage.scrollTop = wx.createSelectorQuery().select('.scroll-view').boundingClientRect((rect) => {currentPage.scrollTop = rect.top;}).exec();},onShow: function() {let pages = getCurrentPages();let currentPage = pages[pages.length - 1];if (currentPage.scrollTop) {wx.createSelectorQuery().select('.scroll-view').boundingClientRect((rect) => {rect.top = currentPage.scrollTop;this.setData({scrollTop: currentPage.scrollTop});}).exec();}}
});

代码解释

  • onLoad 函数:模拟生成列表数据并更新到 data 中。
  • onHide 函数:
    • 使用 getCurrentPages() 获取页面栈。
    • 获取当前页面,将滚动位置等信息存储在当前页面对象中。
    • 使用 wx.createSelectorQuery().select('.scroll-view').boundingClientRect() 来获取 scroll-view 的位置信息,这里假设 scroll-view 的类名为 scroll-view,可根据实际情况修改。
  • onShow 函数:
    • 再次获取页面栈和当前页面。
    • 如果之前存储了 scrollTop 值,使用 wx.createSelectorQuery() 来恢复 scroll-view 的位置。

你可以根据自己的需求选择使用 scroll-view 组件保存滚动位置的方法,或者使用页面栈存储页面信息的方法,也可以将两者结合使用,以达到更好的效果。在实际开发中,还可以考虑存储更多页面状态信息,如输入框的内容、复选框的选中状态等,以确保用户再次进入页面时能恢复到之前的状态。

请确保代码中的元素选择器和存储逻辑符合你的实际情况,对于 scroll-view 组件,要注意其 scroll-top 属性的使用和更新,对于页面栈方法,要注意页面栈的结构和信息存储的准确性。


http://www.ppmy.cn/news/1563540.html

相关文章

矩阵碰一碰发视频之视频剪辑功能开发全解析,支持OEM

在短视频风靡的当下&#xff0c;矩阵碰一碰发视频结合视频剪辑功能&#xff0c;为内容创作与传播带来了全新的活力。本文将深入探讨这一创新功能的源码搭建过程&#xff0c;助力开发者打造出功能强大且用户体验良好的视频处理系统。 一、技术选型 前端技术 框架&#xff1a;选…

ros2-6.4.4 两轮差速控制机器人(问题解决)

ros2-6.4.4 两轮差速控制机器人的问题-CSDN博客 上次遇到的问题&#xff0c;经过查看ros2 node list 之后&#xff0c;发现有多个 /robot_state_publisher 这是不正常的&#xff0c;应该是我看视频6.2 的没有及时关闭导致冲突了。 没有修改代码&#xff0c;单纯的重启就解决…

【Uniapp-Vue3】vite.config中安装插件unplugin-auto-import自动导入vue和uniapp

对着项目右键-->使用命令行窗口打开所在目录&#xff0c;就会弹出终端 在终端中输入如下命令&#xff0c;后回车。 npm install unplugin-auto-import 在项目目录下创建vite.config.js 在vite.config.js文件中输入如下代码&#xff1a; import { defineConfig } from vi…

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…

nolo sonic 2使用串流方式运行steamVR时报错301(VRApplicationError_IPCFailed)

1. 问题描述 最近换了一台新电脑&#xff0c;使用nolo sonic 2 VR眼镜&#xff0c;尝试和自己的笔记本通过串流方式连接steamVR。无奈连接后就开始报错&#xff1a; 点开“更多信息”后&#xff0c;提示&#xff1a; 2. 解决过程 一开始认为是电脑内安装的软件冲突的问题…

c++领域展开第十二幕——类和对象(STL简介——简单了解STL)超详细!!!!

文章目录 前言STL简介什么是STLSTL的版本STL的六大组件STL的重要性如何学习STL 总结 前言 上篇博客我们了解了初阶的模版函数&#xff0c;以及有关的一些使用方法。 今天我们来了解了解STL库的有关知识 跟我一起上车吧 STL简介 什么是STL STL&#xff1a;是C标准库的重要组成…

数仓建模(六)从ODS到DWD、DWS、ADS

在数据仓库建设中&#xff0c;ODS、DWD、DWS、ADS是大家经常接触的术语&#xff0c;它们代表了数据流转的不同阶段。这些术语虽然专业&#xff0c;但其背后的含义却相对直观。通过深入理解这些概念&#xff0c;大家可以更高效地设计和优化数据仓库架构。本文将以通俗语言解析这…

数据分析如何正确使用ChatGPT进行辅助?

目录 1.数据介绍 2.特征工程 3.EDA分析 4.数据相关性分析 5.分析总结 一篇优秀的学术论文&#xff0c;肯定有新颖、适当的论证视角&#xff0c;选择恰当的研究方法&#xff0c;搭建逻辑严密、平衡的论证框架&#xff0c;把有力的数据分析紧密结合起来&#xff0c;这样一篇…