收藏
回答

是否可以在Page配置中添加单例模式

问题模块 API/组件名称 终端类型 微信版本 基础库版本
API和组件 wx.navigateTo 工具 6.6.1 1.9.1

提一个需求:


wx.navigateTo 快速点击会多次加载同一页面,

是否可以在Page配置中添加 单例模式的配置。


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

7 个回答

  • 永恒君
    永恒君
    2018-01-23

    微信自家的公众号也是这样的,我觉得其实是不太好解决。

    因为新建一个 WebView,并非是复用同一个对象,没法用单例模式呀。


    日常开发中为了解决这个问题,我多半使用的是变量加回调来阻止。

    并非限制在新建对象上,而是对事件触发本身做了规定。事件内函数不运行完,不能点下一次。

    其实这个方案是不太妙的,希望能看到更好的办法。

    2018-01-23
    赞同
    回复
  • Bookjade
    Bookjade
    2018-01-23

    谢谢你,用变量阻止解决了。

    2018-01-23
    赞同
    回复
  • 永恒君
    永恒君
    2018-01-23

    还想到另外一种,俗称节流,也就是固定间隔时间,1s 内只能点一次这种,其实也不妙。

    2018-01-23
    赞同
    回复
  • Bookjade
    Bookjade
    2018-01-23

    var isTouch=false;

    Page({

        ......

        onShow: function () {

            isTouch=false;

         },


        event...:function(e){

            if(isTouch) return;

            isTouch = true;

            ......

        }

    })


    //我是这样做的,总觉得代码怪怪的



    2018-01-23
    赞同
    回复
  • 永恒君
    永恒君
    2018-01-23

    我会这样写,应该属于代理模式,我不太懂算法。

    // fn 不运行完,再次调用 once 也没用
    function once(fn) {
      var state = false;
      return function() {
        if (state) return;
        state = true;
        fn && fn.apply(this, arguments);
        state = false;
      }
    }
     
    Page({
      click: function(e) {
        once(() => {
          console.log(this, e)
        })()
      },
    })

    其实判断 fn 的结束应该是写在 fn 的回调里的,但那样的话就越改越复杂了,除非可以用 await 写法。

    2018-01-23
    赞同
    回复
  • Bookjade
    Bookjade
    2018-01-23

    优雅,学习了

    2018-01-23
    赞同
    回复
  • 永恒君
    永恒君
    2018-01-23

    唔...写错了,第二次运行 once 时 state 是新的。

    修改:Page 里得去掉那层 function。惭愧惭愧

    2018-01-23
    赞同
    回复