Taro: mobx observer在有些情况下会失效

Created on 3 Jun 2019  ·  6Comments  ·  Source: NervJS/taro

问题描述
[问题描述:站在其它人的角度尽可能清晰地、简洁地把问题描述清楚]

mobx observer在有些情况下会失效。比如:render的时候,直接获取某个对象的属性

复现步骤
[复现问题的步骤]

如果这么写,之后再修改img.thumbUrl,不会导致重新渲染:

  private renderImage(img: UploadImage) {
    return (
      <View key={`item-${img.id}`} className="item">
        <Image className="thumb" src={img.thumbUrl} />
      </View>
    )
  }

如果改成这样,之后再修改img.thumbUrl,就会导致重新渲染:

  private renderImage({ id, thumbUrl }: UploadImage) {
    return (
      <View key={`item-${id}`} className="item">
        <Image className="thumb" src={thumbUrl} />
      </View>
    )
  }

看了一下,编译之后的结果,后面那个是

    key: "_createImageData",
    value: function _createImageData(_$uid) {
      return function (_ref2) {
        var id = _ref2.id,
            thumbUrl = _ref2.thumbUrl;

        var anonymousState__temp5 = "item-" + id;
        return {
          anonymousState__temp5: anonymousState__temp5,
          thumbUrl: thumbUrl,
          IMAGE_DELETE: IMAGE_DELETE,
          id: id
        };
      };
    }

idthumbUrl是分别被传进去的,也就是说render的时候用到了它们。无效的那种,传进去的是img,也就是render的时候没用到thumbUrl。可能是这个原因

期望行为

mobx能正常工作

报错信息

系统信息

👽 Taro v1.3.0-beta.5

Taro CLI 1.3.0-beta.5 environment info:
System:
OS: macOS 10.14.5
Shell: 5.3 - /bin/zsh
Binaries:
Node: 11.10.1 - ~/.nvm/versions/node/v11.10.1/bin/node
Yarn: 1.13.0 - /usr/local/bin/yarn
npm: 6.9.0 - ~/.nvm/versions/node/v11.10.1/bin/npm
npmPackages:
@tarojs/async-await: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/components: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/mobx: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/mobx-h5: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/mobx-rn: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/plugin-babel: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/plugin-csso: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/plugin-less: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/plugin-uglifyjs: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/rn-runner: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/router: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/taro: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/taro-alipay: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/taro-h5: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/taro-swan: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/taro-tt: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/taro-weapp: 1.3.0-beta.5 => 1.3.0-beta.5
@tarojs/webpack-runner: 1.3.0-beta.5 => 1.3.0-beta.5
eslint-config-taro: 1.3.0-beta.5 => 1.3.0-beta.5
eslint-plugin-taro: 1.3.0-beta.5 => 1.3.0-beta.5
nervjs: ^1.4.0-beta.5 => 1.4.0-beta.5

  • 报错平台 [tt]

补充信息
[可选]
[根据你的调查研究,出现这个问题的原因可能在哪里?]

Taro很好,加油

Most helpful comment

@BrookShuihuaLee 你的分析是对的,目前的实现是监听 render 方法,如果该方法中没有对 observable 进行直接或间接引用,是不会触发重绘的。taro 中 mobx 的使用还是按照 taro 文档来吧,当然未来我会抽时间来逐渐抹平与 mobx-react 的差异。具体时间暂时不能确定(最近事情有点多 ^ _ ^)

All 6 comments

欢迎提交 Issue~

如果你提交的是 bug 报告,请务必遵循 Issue 模板的规范,尽量用简洁的语言描述你的问题,最好能提供一个稳定简单的复现。🙏🙏🙏

如果你的信息提供过于模糊或不足,或者已经其他 issue 已经存在相关内容,你的 issue 有可能会被关闭。

Good luck and happy coding~

这是个特性。你确实需要显示调用 Observable 的对象整体而不是对象成员。

由于众所周知的原因,最近 Google 访问有些困难,无奈无法给你提供文档参考

这是个特性。你确实需要显示调用 Observable 的对象整体而不是对象成员。

~由于众所周知的原因,最近 Google 访问有些困难,无奈无法给你提供文档参考~

这和原生的mobx表现不一致啊,而且会成为一个很难排查的bug。<A p={a.b} />const b = a.b; <A p={b} />的结果应该是一样的。

这是个特性。你确实需要显示调用 Observable 的对象整体而不是对象成员。
~由于众所周知的原因,最近 Google 访问有些困难,无奈无法给你提供文档参考~

这和原生的mobx表现不一致啊,而且会成为一个很难排查的bug。<A p={a.b} />const b = a.b; <A p={b} />的结果应该是一样的。

Taro 的 Mobx 目前由社区维护者 @nanjingboy 维护,具体表现差异可以问一下他。

这是个特性。你确实需要显示调用 Observable 的对象整体而不是对象成员。
~由于众所周知的原因,最近 Google 访问有些困难,无奈无法给你提供文档参考~

这和原生的mobx表现不一致啊,而且会成为一个很难排查的bug。<A p={a.b} />const b = a.b; <A p={b} />的结果应该是一样的。

Taro 的 Mobx 目前由社区维护者 @nanjingboy 维护,具体表现差异可以问一下他。

谢谢,@nanjingboy 有空的话,可以帮忙看看吗?

@BrookShuihuaLee 你的分析是对的,目前的实现是监听 render 方法,如果该方法中没有对 observable 进行直接或间接引用,是不会触发重绘的。taro 中 mobx 的使用还是按照 taro 文档来吧,当然未来我会抽时间来逐渐抹平与 mobx-react 的差异。具体时间暂时不能确定(最近事情有点多 ^ _ ^)

Was this page helpful?
0 / 5 - 0 ratings