-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mobx getDerivedStateFromProps 不执行 包括 componentWillReceiveProps #4176
Comments
欢迎提交 Issue~ 如果你提交的是 bug 报告,请务必遵循 Issue 模板的规范,尽量用简洁的语言描述你的问题,最好能提供一个稳定简单的复现。🙏🙏🙏 如果你的信息提供过于模糊或不足,或者已经其他 issue 已经存在相关内容,你的 issue 有可能会被关闭。 Good luck and happy coding~ |
阅读了taro-mobx-common 的源码
以及 mobx-common 中的实现 https://github.com/NervJS/taro/blob/4d950d0919/packages/taro-mobx-common/src/observer.js#L17-L27 可以看出 当存在static getDerivedStateFromProps时 不会触发 taro-mobx-common 的 componentWillMount 于是我看了下redux 之前也遇到了同样的问题的issue #3929 发现是把周期事件从 componentWillMount 变成 _constructor
结果是 getDerivedStateFromProps componentWillReact 触发了两遍 我想知道接下来taro 团队怎么解决这个问题。 |
按照上面的问题,我的暂时解决是 验证之后 getDerivedStateFromProps 会触发 但是 componentWillReceiveProps 还是不会触发 export function observer (component) {
if (isUsingStaticRendering()) {
return component
}
if (component.isMobxInjector === true) {
console.warn(
"Mobx observer: You are trying to use 'observer' on a component that already has 'inject'. Please apply 'observer' before applying 'inject'"
)
}
const target = component.prototype
const originConstructor = target._constructor
const originComponentWillReact = target.componentWillReact
target._constructor = function (...args) {
const initialName = this.displayName || this.name
this._reaction = new Reaction(`${initialName}_${Date.now()}`, () => {
this.forceUpdate()
originComponentWillReact && originComponentWillReact.call(this)
})
originConstructor && originConstructor.call(this,...args)
} |
看了下taro-weapp 的源码 能否在 this.forceUpdate() 调用前 设置 this._unsafeCallUpdate = true 不知道这样有什么误解,对于_unsafeCallUpdate 不是很清楚这里主要的作用是为了防止什么 |
这里还缺少一个环境判断,,应该只是在小程序中才会有这样的机制 |
function hasNewLifecycle(component) {
var getDerivedStateFromProps = component.constructor.getDerivedStateFromProps,
getSnapshotBeforeUpdate = component.getSnapshotBeforeUpdate;
return isFunction(getDerivedStateFromProps) || isFunction(getSnapshotBeforeUpdate);
} 看了一下源码,当有 target.componentWillMount = function () {
var _this = this;
var initialName = this.displayName || this.name;
this._reaction = new mobx.Reaction("".concat(initialName, "_").concat(Date.now()), function () {
_this.forceUpdate();
originComponentWillReact && originComponentWillReact.call(_this);
});
originComponentWillMount && originComponentWillMount.call(this);
}; 而在@tarojs/mobx-common中,mobx进行React初始化是在 |
@cloudZQY
|
所以这是对于mobx的一个bug,可能需要把这段代码挪到contructor里面去。但是不知道会有什么其他副作用 |
在小程序中回触发两次contructor 会导致 两次触发依赖收集 |
@hnsylitao 已提 PR:#4366 另外:
|
Hello~ 您的问题楼上已经提供了解决方案,如果没有更多的问题这个 issue 将在 15 天后被自动关闭。 如果您在这 15 天中更新更多信息自动关闭的流程会自动取消,如有其他问题也可以发起新的 Issue。 Good luck and happy coding~ |
@nanjingboy 另外你说的这个 componentWillReceiveProps 和我说的 static getDerivedStateFromProps 还是taro 的一个规则问题。 但是你说的componentWillReceiveProps 没有在render 中被 监听 可以通过以下的策略来调整。 |
@hnsylitao 是有办法触发 |
这个问题发现了一个副作用,如果mobx 中的值没有在 render 中使用 |
@hnsylitao 我们监听的就是 render 方法,如没有在 render 中使用,便不会触发重绘,这是基本规则,不是问题 |
问题描述
taro init 初始project
模板是mobx
为什么 加了 getDerivedStateFromProps之后 props 不会重新更新了
复现步骤
[复现问题的步骤]
期望行为
[这里请用简洁清晰的语言描述你期望的行为]
报错信息
[这里请贴上你的完整报错截图或文字]
系统信息
Taro CLI 1.3.4 environment info:
System:
OS: Windows 10
Binaries:
Node: 10.15.3 - D:\Application\Development\nodejs\node.EXE
Yarn: 1.16.0 - D:\Application\Development\npm\yarn.CMD
npm: 6.4.1 - D:\Application\Development\nodejs\npm.CMD
The text was updated successfully, but these errors were encountered: