小程序
小游戏
企业微信
微信支付
扫描小程序码分享
小程序项目,返回到列表页如何做到不刷新页面但能更新数据?
小程序项目结构如下:
进入小程序,首先到“项目列表”页面,项目列表页面有创建项目,修改项目,删除项目功能,每个项目list有挂该项目下的方案总数,点击该项目list进入“方案列表”页面,方案列表有创建方案,方案编辑,删除方案功能,每个方案list挂有该方案的计算状态及计算结果信息,点击该方案list进入“方案编辑”页面,方案编辑页面有方案计算,方案保存等按钮。
请教一下各位开发大大们是怎么处理这种情况的?
5 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
同问,我的是列表页有三级分类,一级下面有二级分类,二级分类下面有三级分类。如果说点开某一个三级分类下面第3页的某一商品进入商品详情页,在商品详情页进行了加购物车处理,那么他在返回列表页的时候,又不想让他重新加载数据回到默认的一级分类下第一个二级分类下的第一个三级分类,只想让他停留在当前位置,又想让商品的加购数量增加。我想到一个办法就是把列表数据存在本地,在详情页操作的时候再把本地的对应的字段手动更改掉。可是这样又会造成分类列表数据不能响应更新,如果此时有人在后台删除增加了数据,小程序这边不会被更新。这到底是应该怎么处理更好呐
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
可以用通知广播
比如有投票选手列表页面,显示每个选手的得票数,在onLoad的时候监听VOTE_ACTIVITY_ADD事件
Event.listen(Event.VOTE_ACTIVITY_ADD, this.addGainVotes.bind(this), this)
进入到选手详情页之后如果给该选手点赞就发送事件
Event.emit(Event.VOTE_ACTIVITY_ADD, playerId)
这样列表页就可以调用addGainVotes方法给那个选手加一票而不用再重新获取列表数据,返回时看到的就是更新的数据了
我先看看,谢谢!
我是这么做的,列表页有个isShowPage,默认是false,当获取到列表数据后改成true,获取列表数据前对isShowPage做判断,如果是false,有加载框,否则不显示加载框。从列表页到详情页使用的是navigateTo,所以在返回到列表页后重新获取列表数据,就可以做到无感知的刷新页面。
不仅仅是加载框的问题,还有分页,比如方案列表我刷到第4页的其中一个方案点进去编辑,然后返回方案列表。
我这边调分页的时候需要加载框,所以在下拉里面把isShowPage改成了false。如果currentPage == 1时,直接把接口返回的数组赋值给列表数据,否则使用列表数据concat接口返回的数组。描述可能没有那么好。。。。
嗯嗯,明白,谢谢!
客气了。互相帮助吧、
如你所说,想要在不刷新此页面的情况下更改数据,那么就要在上一个页面操作此页面的数据,当返回时页面已经渲染完毕,这样就达到了你的效果
加入此页面渲染的列表为goods,那么在上一个或多个页面可以
let pages = getCurrentPages();
let goods = pages[pages.length - 2].data.goods;//其中数字1代表当前页面,每加1则是页面栈下一层
/*
此处为对数据的操作,如:let newGoods = goods.slice(0,1);
*/
pages[pages.length - 2].setData({
goods:newGoods
})
这样就实现了
这个方法是可以实现,但是有更好的办法吗?因为我的项目是这样的:
进入小程序,首先到“项目列表”页面,项目列表页面有创建项目功能,每个项目list有挂该项目下的方案总数,点击该项目list进入“方案列表”页面,方案列表有创建方案功能,每个方案list挂有该方案的计算状态及计算结果信息,点击该方案list进入“方案编辑”页面,方案编辑页面有方案计算,方案保存等按钮。
我的意思是,每一个操作都会影响list页面的状态,这样一直对看不见的页面setData好像也不是很合适,而且小程序的页面栈不是有规定不能超过多少个的吗,如果超过被自动删掉,那就会报错了,实现起来也不是很严谨。
微信小程序是数据驱动,数组的增删会影响页面的渲染结果,此页面已经加载,那么页面已经渲染完毕,现需要此页面数组改变,而页面不刷新,也就是想页面改变的情况下,而页面不刷新,则本身就是矛盾的!此页面已经渲染完毕,如果不重新渲染,就不可能实现页面改变。再者你想存储一个全局的变量来做这个事情,关键的问题在于,全局变量是可以被各个页面引用,但是更改全局变量并不能触发页面重新渲染,也就是说,只能通过数据改变影响页面重新渲染,只是我们换个思路,不在当前页面更改数据,好像这是惟一的方法。看你的情况而言,你的页面栈中最多也就3个页面,而微信官方说明的是最多5个,完全够了,只要注意页面的顺序和关系,并不是问题
不是的,从项目列表可以直接跳转到创建项目,创建项目后可以直接跳转到创建方案,再跳转到计算结果。前面还有一个登录页和启动页。就算我登录页和启动页redirect,那么如果计算结果的时候失败了呢,如果等计算结果成功后再修改方案列表的状态,那方案下标要从方案列表带入方案编辑页再带入计算结果页这样?还是每次根据方案code循环方案列表数据找到该计算结果的方案信息,然后setData这样?
其实我提问之前也知道只有这个办法可行。但是很不愿意这样做,觉得一个好好的项目被整的很别扭。
难道你的项目也是这样的吗?返回列表都是不刷新更新数据的?
onShow
onshow不就是刷新吗?我是要:
谁说的onshow就是刷新。onshow是钩子函数,你可以再里面重新获取数据,这样就达到你所说的不刷新页面,同时更新了数据。
我说的刷新并不是调用onPullDownRefresh或者refresh方法(如果有的话)才叫刷新,而是感官上给人的感觉刷新了就是刷新。
像你说的重新获取数据,不就跟我onload里调用的获取数据接口一样吗?那这样处理给人的感觉就是刷新了,所以我简称了刷新。我现在就是这样处理,产品说要无刷新更新数据。
比如我将list刷到了第四页,然后去到下一个页面后返回,此时第四页的其中一个数据状态改变了,就要做相应的更新操作。
我明白可能你的意思是这样的,比如我从一个方案点进去编辑页,然后记住点击的是第几个方案,onshow的时候调用接口重新获取数据,然后只是对之前记住的那个方案信息setData,是这样吧?
但是如果我是创建方案呢?
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
同问,我的是列表页有三级分类,一级下面有二级分类,二级分类下面有三级分类。如果说点开某一个三级分类下面第3页的某一商品进入商品详情页,在商品详情页进行了加购物车处理,那么他在返回列表页的时候,又不想让他重新加载数据回到默认的一级分类下第一个二级分类下的第一个三级分类,只想让他停留在当前位置,又想让商品的加购数量增加。我想到一个办法就是把列表数据存在本地,在详情页操作的时候再把本地的对应的字段手动更改掉。可是这样又会造成分类列表数据不能响应更新,如果此时有人在后台删除增加了数据,小程序这边不会被更新。这到底是应该怎么处理更好呐
可以用通知广播
比如有投票选手列表页面,显示每个选手的得票数,在onLoad的时候监听VOTE_ACTIVITY_ADD事件
Event.listen(Event.VOTE_ACTIVITY_ADD, this.addGainVotes.bind(this), this)
进入到选手详情页之后如果给该选手点赞就发送事件
Event.emit(Event.VOTE_ACTIVITY_ADD, playerId)
这样列表页就可以调用addGainVotes方法给那个选手加一票而不用再重新获取列表数据,返回时看到的就是更新的数据了
我先看看,谢谢!
我是这么做的,列表页有个isShowPage,默认是false,当获取到列表数据后改成true,获取列表数据前对isShowPage做判断,如果是false,有加载框,否则不显示加载框。从列表页到详情页使用的是navigateTo,所以在返回到列表页后重新获取列表数据,就可以做到无感知的刷新页面。
不仅仅是加载框的问题,还有分页,比如方案列表我刷到第4页的其中一个方案点进去编辑,然后返回方案列表。
我这边调分页的时候需要加载框,所以在下拉里面把isShowPage改成了false。如果currentPage == 1时,直接把接口返回的数组赋值给列表数据,否则使用列表数据concat接口返回的数组。描述可能没有那么好。。。。
嗯嗯,明白,谢谢!
客气了。互相帮助吧、
如你所说,想要在不刷新此页面的情况下更改数据,那么就要在上一个页面操作此页面的数据,当返回时页面已经渲染完毕,这样就达到了你的效果
加入此页面渲染的列表为goods,那么在上一个或多个页面可以
let pages = getCurrentPages();
let goods = pages[pages.length - 2].data.goods;//其中数字1代表当前页面,每加1则是页面栈下一层
/*
此处为对数据的操作,如:let newGoods = goods.slice(0,1);
*/
pages[pages.length - 2].setData({
goods:newGoods
})
这样就实现了
这个方法是可以实现,但是有更好的办法吗?因为我的项目是这样的:
进入小程序,首先到“项目列表”页面,项目列表页面有创建项目功能,每个项目list有挂该项目下的方案总数,点击该项目list进入“方案列表”页面,方案列表有创建方案功能,每个方案list挂有该方案的计算状态及计算结果信息,点击该方案list进入“方案编辑”页面,方案编辑页面有方案计算,方案保存等按钮。
我的意思是,每一个操作都会影响list页面的状态,这样一直对看不见的页面setData好像也不是很合适,而且小程序的页面栈不是有规定不能超过多少个的吗,如果超过被自动删掉,那就会报错了,实现起来也不是很严谨。
微信小程序是数据驱动,数组的增删会影响页面的渲染结果,此页面已经加载,那么页面已经渲染完毕,现需要此页面数组改变,而页面不刷新,也就是想页面改变的情况下,而页面不刷新,则本身就是矛盾的!此页面已经渲染完毕,如果不重新渲染,就不可能实现页面改变。再者你想存储一个全局的变量来做这个事情,关键的问题在于,全局变量是可以被各个页面引用,但是更改全局变量并不能触发页面重新渲染,也就是说,只能通过数据改变影响页面重新渲染,只是我们换个思路,不在当前页面更改数据,好像这是惟一的方法。看你的情况而言,你的页面栈中最多也就3个页面,而微信官方说明的是最多5个,完全够了,只要注意页面的顺序和关系,并不是问题
不是的,从项目列表可以直接跳转到创建项目,创建项目后可以直接跳转到创建方案,再跳转到计算结果。前面还有一个登录页和启动页。就算我登录页和启动页redirect,那么如果计算结果的时候失败了呢,如果等计算结果成功后再修改方案列表的状态,那方案下标要从方案列表带入方案编辑页再带入计算结果页这样?还是每次根据方案code循环方案列表数据找到该计算结果的方案信息,然后setData这样?
其实我提问之前也知道只有这个办法可行。但是很不愿意这样做,觉得一个好好的项目被整的很别扭。
难道你的项目也是这样的吗?返回列表都是不刷新更新数据的?
onShow
onshow不就是刷新吗?我是要:
小程序项目,返回到列表页如何做到不刷新页面但能更新数据?
谁说的onshow就是刷新。onshow是钩子函数,你可以再里面重新获取数据,这样就达到你所说的不刷新页面,同时更新了数据。
我说的刷新并不是调用onPullDownRefresh或者refresh方法(如果有的话)才叫刷新,而是感官上给人的感觉刷新了就是刷新。
像你说的重新获取数据,不就跟我onload里调用的获取数据接口一样吗?那这样处理给人的感觉就是刷新了,所以我简称了刷新。我现在就是这样处理,产品说要无刷新更新数据。
比如我将list刷到了第四页,然后去到下一个页面后返回,此时第四页的其中一个数据状态改变了,就要做相应的更新操作。
我明白可能你的意思是这样的,比如我从一个方案点进去编辑页,然后记住点击的是第几个方案,onshow的时候调用接口重新获取数据,然后只是对之前记住的那个方案信息setData,是这样吧?
但是如果我是创建方案呢?