收藏
回答

小程序项目,返回到列表页如何做到不刷新页面但能更新数据

小程序项目,返回到列表页如何做到不刷新页面但能更新数据?

小程序项目结构如下:

进入小程序,首先到“项目列表”页面,项目列表页面有创建项目,修改项目,删除项目功能,每个项目list有挂该项目下的方案总数,点击该项目list进入“方案列表”页面,方案列表有创建方案,方案编辑,删除方案功能,每个方案list挂有该方案的计算状态及计算结果信息,点击该方案list进入“方案编辑”页面,方案编辑页面有方案计算,方案保存等按钮。

请教一下各位开发大大们是怎么处理这种情况的?

最后一次编辑于  2018-09-11  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

4 个回答

  • sun
    sun
    2018-09-11

    onShow

    2018-09-11
    赞同
    回复 3
    • 雨文彗心smile
      雨文彗心smile
      2018-09-11

      onshow不就是刷新吗?我是要:

      小程序项目,返回到列表页如何做到不刷新页面但能更新数据?


      2018-09-11
      回复
    • 冰扬
      冰扬
      2018-09-13回复雨文彗心smile

      谁说的onshow就是刷新。onshow是钩子函数,你可以再里面重新获取数据,这样就达到你所说的不刷新页面,同时更新了数据。

      2018-09-13
      回复
    • 雨文彗心smile
      雨文彗心smile
      2018-09-13回复冰扬

      我说的刷新并不是调用onPullDownRefresh或者refresh方法(如果有的话)才叫刷新,而是感官上给人的感觉刷新了就是刷新。

      像你说的重新获取数据,不就跟我onload里调用的获取数据接口一样吗?那这样处理给人的感觉就是刷新了,所以我简称了刷新。我现在就是这样处理,产品说要无刷新更新数据。

      比如我将list刷到了第四页,然后去到下一个页面后返回,此时第四页的其中一个数据状态改变了,就要做相应的更新操作。

      我明白可能你的意思是这样的,比如我从一个方案点进去编辑页,然后记住点击的是第几个方案,onshow的时候调用接口重新获取数据,然后只是对之前记住的那个方案信息setData,是这样吧?

      但是如果我是创建方案呢?

      2018-09-13
      回复
  • 三世羽翾
    三世羽翾
    2018-09-11

    如你所说,想要在不刷新此页面的情况下更改数据,那么就要在上一个页面操作此页面的数据,当返回时页面已经渲染完毕,这样就达到了你的效果

    加入此页面渲染的列表为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

    })

    这样就实现了

    2018-09-11
    赞同
    回复 3
    • 雨文彗心smile
      雨文彗心smile
      2018-09-11

      这个方法是可以实现,但是有更好的办法吗?因为我的项目是这样的:

      进入小程序,首先到“项目列表”页面,项目列表页面有创建项目功能,每个项目list有挂该项目下的方案总数,点击该项目list进入“方案列表”页面,方案列表有创建方案功能,每个方案list挂有该方案的计算状态及计算结果信息,点击该方案list进入“方案编辑”页面,方案编辑页面有方案计算,方案保存等按钮。

      我的意思是,每一个操作都会影响list页面的状态,这样一直对看不见的页面setData好像也不是很合适,而且小程序的页面栈不是有规定不能超过多少个的吗,如果超过被自动删掉,那就会报错了,实现起来也不是很严谨。

      2018-09-11
      回复
    • 三世羽翾
      三世羽翾
      2018-09-11回复雨文彗心smile

      微信小程序是数据驱动,数组的增删会影响页面的渲染结果,此页面已经加载,那么页面已经渲染完毕,现需要此页面数组改变,而页面不刷新,也就是想页面改变的情况下,而页面不刷新,则本身就是矛盾的!此页面已经渲染完毕,如果不重新渲染,就不可能实现页面改变。再者你想存储一个全局的变量来做这个事情,关键的问题在于,全局变量是可以被各个页面引用,但是更改全局变量并不能触发页面重新渲染,也就是说,只能通过数据改变影响页面重新渲染,只是我们换个思路,不在当前页面更改数据,好像这是惟一的方法。看你的情况而言,你的页面栈中最多也就3个页面,而微信官方说明的是最多5个,完全够了,只要注意页面的顺序和关系,并不是问题

      2018-09-11
      回复
    • 雨文彗心smile
      雨文彗心smile
      2018-09-11回复三世羽翾

      不是的,从项目列表可以直接跳转到创建项目,创建项目后可以直接跳转到创建方案,再跳转到计算结果。前面还有一个登录页和启动页。就算我登录页和启动页redirect,那么如果计算结果的时候失败了呢,如果等计算结果成功后再修改方案列表的状态,那方案下标要从方案列表带入方案编辑页再带入计算结果页这样?还是每次根据方案code循环方案列表数据找到该计算结果的方案信息,然后setData这样?

      其实我提问之前也知道只有这个办法可行。但是很不愿意这样做,觉得一个好好的项目被整的很别扭。

      难道你的项目也是这样的吗?返回列表都是不刷新更新数据的?

      2018-09-11
      回复
  • 东东
    东东
    2018-09-12

    我是这么做的,列表页有个isShowPage,默认是false,当获取到列表数据后改成true,获取列表数据前对isShowPage做判断,如果是false,有加载框,否则不显示加载框。从列表页到详情页使用的是navigateTo,所以在返回到列表页后重新获取列表数据,就可以做到无感知的刷新页面。

    2018-09-12
    赞同
    回复 4
    • 雨文彗心smile
      雨文彗心smile
      2018-09-12

      不仅仅是加载框的问题,还有分页,比如方案列表我刷到第4页的其中一个方案点进去编辑,然后返回方案列表。

      2018-09-12
      回复
    • 东东
      东东
      2018-09-12

      我这边调分页的时候需要加载框,所以在下拉里面把isShowPage改成了false。如果currentPage == 1时,直接把接口返回的数组赋值给列表数据,否则使用列表数据concat接口返回的数组。描述可能没有那么好。。。。

      2018-09-12
      回复
    • 雨文彗心smile
      雨文彗心smile
      2018-09-13回复东东

      嗯嗯,明白,谢谢!

      2018-09-13
      回复
    • 东东
      东东
      2018-09-13回复雨文彗心smile

      客气了。互相帮助吧、

      2018-09-13
      回复
  • d x
    d x
    2018-09-13

    可以用通知广播

    比如有投票选手列表页面,显示每个选手的得票数,在onLoad的时候监听VOTE_ACTIVITY_ADD事件

    Event.listen(Event.VOTE_ACTIVITY_ADD, this.addGainVotes.bind(this), this)

    进入到选手详情页之后如果给该选手点赞就发送事件

    Event.emit(Event.VOTE_ACTIVITY_ADD, playerId)

    这样列表页就可以调用addGainVotes方法给那个选手加一票而不用再重新获取列表数据,返回时看到的就是更新的数据了


    2018-09-13
    赞同
    回复 1
    • 雨文彗心smile
      雨文彗心smile
      2018-09-13

      我先看看,谢谢!

      2018-09-13
      回复