收藏
回答

Skyline:在组件内使用runOnJS调用方法时this指向异常

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug runOnJS 微信iOS客户端 8.0.50 3.5.2

在项目中想创建一个用于控制范围的流畅的双向slider组件,于是想利用horizontal-drag-gesture-handler手势组件来实现并封装成组件。在手势触发的'worklet'函数的最后使用wx.worklet.runOnJS来调用对应的方法修改数据。

    onMaxDrag(e) {
      "worklet";
      const { deltaX } = e;
      const deltaN =
        (deltaX / this._lineWidth.value) * (this._max.value - this._min.value);
      this._curMax.value += deltaN;
      if (this._curMax.value > this._max.value)
        this._curMax.value = this._max.value;
      if (this._curMax.value < this._curMin.value)
        this._curMax.value = this._curMin.value;


      runOnJS(this.setMaxNum)(this._curMax.value);
    },
    setMaxNum(val) {
      console.log("--- 组件中 setMaxNum 中的this ---", this);
      this.setData({ curMaxNum: val });
    },


直接写在页面中能够得到预期结果,但是封装成组件却不能

实际场景如下图中,上方拖动条是在100-10000中选取范围(组件内),拖动两端小球UI能正常流畅变化,但是底部数值并未跟随变化。下方大球为写在页面中,拖动后能实时显示拖动距离。

通过对比之后发现,写在页面中this指向正常,但写在组件this指向变为{},导致无法进行数据修改的操作。

请问是runOnJS等等相关的worklet方法只能在页面中直接使用么?还是说我的使用方法存在问题?请大佬们解答一下


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

1 个回答

  • Eric Huang
    Eric Huang
    08-09

    需要 bind(this) 一下

    runOnJS(this.setMaxNum.bind(this))(this._curMax.value);


    08-09
    有用
    回复 1
    • 🍳。
      🍳。
      08-10
      好的,感谢
      08-10
      回复
登录 后发表内容