ownerInstance.callMethod 这块还是有点懵

来源:4-7 WXS 实现手指滑动监听切换标签(下)

爱吃鱼的羊

2023-04-19

ownerInstance.callMethod(“handleTouchMove”, { direction: direction });
这块是不是固定的写法
这写法是不是和自定义组件中
this.triggerEvent(“change”, { index });
相似的作用。
还想到一点,这个和vue 中的 this.$emit(‘change’, current) 好像都是实现相同的功能。
不知理解的对否,请老老师解答下。

写回答

2回答

沁尘

2023-04-19

function handleTouchend(event, ownerInstance) {
    // 省略一堆代码
    if (direction !== 0) {
        //    1.触发事件 2. 直接调用引用该 WXS 的页面或者组件的方法。
        ownerInstance.callMethod('handleTouchMove', { direction: direction })
    }
}

问题 1:ownerInstance.callMethod(“handleTouchMove”, { direction: direction });是不是固定写法?

答:这个行代码的组成是:

1. ownerInstance:当前 wxs 所在组件或页面的实例(后续简称ownerInstance

这里的ownerInstance本身是handleTouchend 函数的入参,这个参数名是可以随便写的,不叫ownerInstance换成a、b、c 也可以。包括函数名也可以随便写。这里关键知识点在于,当一个 wxs 里定义的函数在页面或者组件调用了之后,小程序框架会往这个函数的“第二个参数位置传递一个参数,这个参数就是“当前 wxs 所在组件或页面的实例”。为什么小程序要提供这种机制呢?就是为了能实现类似接下来的功能。

2. callMethod(‘组件或页面中已定义的函数名’,‘调用组件或页面中已定义的函数时,要传递的参数’)

callMethod这个函数,是挂载在ownerInstance上的,这是小程序框架帮我们实现的,目的是为了能够在 wxs 中直接去调用wxs 所在页面或者组件中已经定义的函数,这是为了丰富 wxs 的使用场景,能让wxs 能满足更多的开发场景需求,不然光是优化性能而已,不足以让开发者有足够动力去熟悉和使用wxs。这个函数是固定的调用方式了,至于给这个函数要传递的内容,就是根据实际情况来写的。

问题 2:这写法是不是和自定义组件中this.triggerEvent(“change”, { index });

答:很类似,但是通过前面的解释你会发现,其实也不一样。真正一样的点,是他们两者都是函数式编程思想的体现。

问题 3:这个和vue 中的 this.$emit(‘change’, current) 好像都是实现相同的功能。

答:this.triggerEvent(“change”, { index });和this.$emit(‘change’, current)  真的就是一回事。小程序本身就和 vue 非常的像。

1
4
沁尘
回复
爱吃鱼的羊
感谢同学助理老师还房贷
2023-04-20
共4条回复

沁尘

2023-04-19

稍晚些详细解释给你听,你理解的大致思路是正确的,细节上需要给你再解释解释。
0
0

《慕慕到家》家政小程序组件化进阶实战-优质项目

千锤百炼的实践分享,成就你独当一面

494 学习 · 306 问题

查看课程