重开此帖。 严重bug, 用class定义的事件在运行的时候提示找不到
发布于 7 年前 作者 xiaping 18189 次浏览 来自 问答

刚才举的例子不够清晰,那我再举一个吧

wxml

<view bindtap="tapTab"></view>

js

class Home {
  tapTab() {
    console.log("tab");
  }
  onPullDownRefresh() {
    console.log("refresh");
  }
  onReachBottom() {
    console.log("bottom");
  }
  onLoad() {
    console.log("onLoad");
  }
}
 
Page(new Home());

请官方人员先不要急着标记为已解决。

按照上一个帖子里哥们说的意思事件不能定义到原型里https://developers.weixin.qq.com/blogdetail?action=get_post_info&lang=zh_CN&token=512271115&docid=a5d216e91ba2550a23ad87b3044ef841)

,好  那为什么onLoad会执行呢,请给我一个解释

6 回复

这只是个示例。。。

<view bindtap="tapTab"></view>

你这个标签里面什么都没有,怎么可能找得到?

好吧,也许是我提问的方式有问题(先道个歉)。 不能说是严重bug 我不知道你们怎么实现的但是从开发者角度俩说,希望能解决这个问题。

这个 回答 是正确的

但是为什么onload 或者 onshow 能执行呢?

因为 onload onshow 是小程序框架 “明白” 的方法,那么在相应的生命周期中就会去调用这个方法,而别的又不能枚举到,框架又不知道,自然是找不到的了

从官方的角度来说,也很欢迎开发者热情反映问题,这样大家都能从中汲取到知识,学习成长。

这里的话是这样的:

当实例化Page的时候,传入一个对象作为参数。

  1. 先检查该对象的key有没有预先定义的保留字

  2. 用一个预先存在的方法名列表(eg:onLoad,onShow等等)检查其中有无关于页面lifeCycle的方法

  3. 使用for in迭代取对象中的自定义方法

回到你的问题:

  1. class定义的原型方法的propertyIsEnumerable为false,无法使用任何迭代接口遍历到

  2. 至于onLoad这种有关页面lifeCycle的方法,是直接使用object[key]的方式去调用,自然就能调用到

最后,请注意社区管理规定有提到,注意不要使用不文明的语言对他人进行负面评价

以上。

回到顶部