问题描述
[问题描述:站在其它人的角度尽可能清晰地、简洁地把问题描述清楚]
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
};
};
}
id和thumbUrl是分别被传进去的,也就是说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
补充信息
[可选]
[根据你的调查研究,出现这个问题的原因可能在哪里?]
Taro很好,加油
欢迎提交 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 的差异。具体时间暂时不能确定(最近事情有点多 ^ _ ^)
Most helpful comment
@BrookShuihuaLee 你的分析是对的,目前的实现是监听 render 方法,如果该方法中没有对 observable 进行直接或间接引用,是不会触发重绘的。taro 中 mobx 的使用还是按照 taro 文档来吧,当然未来我会抽时间来逐渐抹平与 mobx-react 的差异。具体时间暂时不能确定(最近事情有点多 ^ _ ^)