收藏
回答

关于页面栈的一些问题?以及airbnb小程序日期选择器实现逻辑的讨论

框架类型 问题类型 终端类型 微信版本 基础库版本
小程序 需求 工具 6.5.3 2.0.0
//页面a跳转到页面b后
let pages = getCurrentPages();
let page = pages[pages.length - 2];//获取页面a
//在页面b改变页面a中data的值
page.setData({
    productId:1
})

流程:a-b-a

a-b是跳转   b-a的时候是返回

问题是这样的,偶然在airbnb的小程序里看到他们自定义的日期选择器,选完时间后返回,返回的页面能拿到日期选择器页面选择的时间,所以有了上面这串代码,不知道这么使用会不会出问题,

还有另外几个思路,可以把选择器的时间弄成全局的储存,或者存在storage里面,在页面a,onshow的时候解析,无疑是可以实现这个功能的,但是我想知道以上的代码会不会有问题,文档上写着不要改变页面栈,这样应该算是改了吧?


回答关注问题邀请回答
收藏

3 个回答

  • 杨泉
    杨泉
    2019-01-28

    直接page setdata的方式不是不行,实在是有点丑陋


    我们的思路是自己实现broadcast center

    需要的页面注册一下通知接受

    在业务逻辑点send broadcast

    2019-01-28
    有用
    回复
  • 卢霄霄
    卢霄霄
    2019-01-28

    个人理解是不能修改是指修改页面栈的顺序,或者往里面插入之类的吧

    我有很多地方也只直接page.setData的。。哈哈哈哈。。挂了再说吧

    2019-01-28
    有用
    回复 4
    • 黎😄
      黎😄
      2019-01-28

      一开始我是用storage标记好,然后在onShow那里改~~后来,用了page.setData后,一发不可收拾,谁用谁知道,真的舒服~~哈哈哈哈。。挂了再说吧

      2019-01-28
      回复
    • 叫我狗蛋爸爸🐶 คิดถึง
      叫我狗蛋爸爸🐶 คิดถึง
      2019-01-28

      6666

      2019-01-28
      回复
    • 叫我狗蛋爸爸🐶 คิดถึง
      叫我狗蛋爸爸🐶 คิดถึง
      2019-01-28回复黎😄

      我也想用呀,所以过来问哈哈哈哈哈哈哈

      2019-01-28
      回复
    • 卢霄霄
      卢霄霄
      2019-01-28回复黎😄

      哈哈哈哈 我也停不下来。。有些数据很多页面有相关性的,直接在把页面实例和相关变量或回调方法传给了 app.js里的数组。。然后修改的时候一个方法改完

      2019-01-28
      回复
  • 叫我狗蛋爸爸🐶 คิดถึง
    叫我狗蛋爸爸🐶 คิดถึง
    2019-01-28

    求各位大佬指点

    2019-01-28
    有用
    回复 2
    • 杨泉
      杨泉
      2019-01-28
      const notificationCenter = {
        notificationCenter: {},
       
        // 向通知中心注册一个监听者。
        // name: 监听的通知名称
        // observer: 监听者
        // action: 监听者收通知时调用的方法名,
        // func: 监听者收到通知时调用的函数,
        // action func 2选1
        register: function(name, observer, func) {
          if (!name || !observer) return
          if (!func) return
       
          console.log('注册通知:', name, observer)
       
          var center = this.notificationCenter
          var objects = center[name]
          if (!objects) {
            objects = []
          }
          this.remove(name, observer)
          objects.push({
            observer: observer,
            func: func
          })
          center[name] = objects
        },
       
       
        // 从通知中心移除一个监听者
        remove: function(name, observer) {
          if (!name || !observer) return
       
          console.log('移除通知:', name, observer)
       
          var center = this.notificationCenter
          var objects = center[name]
          if (!objects) {
            return
          }
       
          var idx
          var object
          for (idx = 0; idx < objects.length; idx++) {
            var obj = objects[idx]
            if (obj.observer == observer) {
              object = obj
              break
            }
          }
          if (object) {
            objects.splice(idx, 1)
          }
          center[name] = objects
        },
        // 通过通知中心发出通知
        // name: 通知名称
        // notification: 通知内容
        post: function(name, data) {
          const notification = {}
          notification.data = data
       
          if (!name) return
       
          console.log('发送通知:', name, data)
       
          var objects = this.notificationCenter[name]
          if (!objects || objects.length == 0) {
            return
          }
          notification.name = name
          objects.forEach(function(object) {
            if (object.observer) {
              var func
              if (object.action) {
                func = object.observer[object.action]
              }
              if (!func) {
                func = object.func
              }
              if (func) {
                notification.observer = object.observer
                func(notification)
              }
            }
          })
          console.log('完成向 ', objects.length, ' 个监听者发出通知:', name)
        }
      }
       
      export default notificationCenter


      记得register的监听者要在合适的时机remove掉,譬如页面onUnload


      记得给赞

      2019-01-28
      1
      回复
    • 叫我狗蛋爸爸🐶 คิดถึง
      叫我狗蛋爸爸🐶 คิดถึง
      2019-01-28回复杨泉

      我看看呀多谢大佬

      2019-01-28
      回复
登录 后发表内容