Reactjs 将this.props.prop和nextrops.prop与mobx进行比较
有没有办法用mobx做这样的事情Reactjs 将this.props.prop和nextrops.prop与mobx进行比较,reactjs,mobx,Reactjs,Mobx,有没有办法用mobx做这样的事情 componentWillUpdate(nextProps) { if (this.props.prop !== nextProps.prop) { /* side effect, ex. router transition */ } } 根据我的经验,即使在componentWill-hooks中,this.props.prop始终等于nextrops.prop 这里的UPD是更具体的用例-简单登录场景: 贮藏 反应部分 因此,基本上,我只想
componentWillUpdate(nextProps) {
if (this.props.prop !== nextProps.prop) {
/* side effect, ex. router transition */
}
}
根据我的经验,即使在componentWill-hooks中,this.props.prop始终等于nextrops.prop
这里的UPD是更具体的用例-简单登录场景:
贮藏
反应部分
因此,基本上,我只想在99.9%的情况下,当查看器id从未定义切换到某个对象时,我能够做一些事情,这是因为代码中的其他部分道具直接发生了变化。这在react中是不允许的 典型场景包括:
var myObject = this.props.someObject; // myObject is a POINTER to props, not copy
myObject.attribute = newAttribute; // Now props are directly mutated
var myArray = this.props.someArray;
myArray.splice(a,b); // splice directly mutates array
要解决此问题,请在更新道具之前对道具对象进行适当的复制。在99.9%的情况下,发生这种情况是因为代码中的其他地方道具直接发生了变异。这在react中是不允许的 典型场景包括:
var myObject = this.props.someObject; // myObject is a POINTER to props, not copy
myObject.attribute = newAttribute; // Now props are directly mutated
var myArray = this.props.someArray;
myArray.splice(a,b); // splice directly mutates array
要解决这个问题,请在更新道具之前对道具对象进行适当的复制。事实上,问题发生了,因为我将一个mobx存储作为单个道具传递,以便调用它的方法,例如:this.props.store.update,所以即使存储中发生了更改,组件也会由mobx更新,nextProps仍然保留对该存储的相同引用
当我需要这种检查时,我最终将存储解构到组件的道具中。事实上,问题发生了,因为我将一个mobx存储作为单个道具传递给它,以便调用它的方法,如:this.props.store.update,所以即使存储中发生了变化,组件也会由mobx更新,nextProps仍然保留对该存储的相同引用
当我需要这种检查时,我最终将存储解构到组件的道具中。感谢您的更新,这澄清了很多问题。这在一定程度上取决于您想要做什么,但是如果您想要更改组件的呈现,那么使用mobx react包中的@observer来装饰组件就足够了。当存储更改时,它将自动重新渲染 如果要执行任何其他操作,可以在组件willmount中设置自动运行。像 但我不经常看到这种模式,因为在你的商店里有这种逻辑通常更干净。就我个人而言,我希望登录表单组件看起来像这样:
@observer class RequiresLogin extends Component {
render() {
if (this.props.viewerStore.id !== undefined) {
return this.props.children
} else {
return <LoginPage viewer={this.props.viewerStore}/>
}
}
}
@observer class MyTestPage extends Component {
render() {
return <RequiresLogin viewer={this.props.viewerStore}>
Secret Area!
</RequiresLogin>
}
}
@observer class LogInPage extends Component {
login = e => {
e.preventDefault();
this.props.viewer.login({
// tip: use React refs or the onChange handler to update local state:
email: e.target.elements['email'].value,
password: e.target.elements['password'].value,
});
}
render() {
if (this.props.viewer.id)
return null; // no need to show login form
return (
<div>
<h1>Log In</h1>
<form onSuccess={this.login}>
<input type="text" name="email" />
<input type="password" name="password" />
<input type="submit" />
</form>
{ this.props.viewer.error && (
<div>
<b>Error</b>: {this.props.viewer.error}
</div>
)}
</div>
);
}
}
谢谢你的更新,这澄清了很多问题。这在一定程度上取决于您想要做什么,但是如果您想要更改组件的呈现,那么使用mobx react包中的@observer来装饰组件就足够了。当存储更改时,它将自动重新渲染 如果要执行任何其他操作,可以在组件willmount中设置自动运行。像 但我不经常看到这种模式,因为在你的商店里有这种逻辑通常更干净。就我个人而言,我希望登录表单组件看起来像这样:
@observer class RequiresLogin extends Component {
render() {
if (this.props.viewerStore.id !== undefined) {
return this.props.children
} else {
return <LoginPage viewer={this.props.viewerStore}/>
}
}
}
@observer class MyTestPage extends Component {
render() {
return <RequiresLogin viewer={this.props.viewerStore}>
Secret Area!
</RequiresLogin>
}
}
@observer class LogInPage extends Component {
login = e => {
e.preventDefault();
this.props.viewer.login({
// tip: use React refs or the onChange handler to update local state:
email: e.target.elements['email'].value,
password: e.target.elements['password'].value,
});
}
render() {
if (this.props.viewer.id)
return null; // no need to show login form
return (
<div>
<h1>Log In</h1>
<form onSuccess={this.login}>
<input type="text" name="email" />
<input type="password" name="password" />
<input type="submit" />
</form>
{ this.props.viewer.error && (
<div>
<b>Error</b>: {this.props.viewer.error}
</div>
)}
</div>
);
}
}
您能否描述为什么必须更改路线,以及为什么必须由接收整个门店的组件负责更改路线?例如,我希望在接收特定商品的商店中发生这种情况。也许可以共享一些代码?您能否描述为什么必须更改路线,以及为什么必须由接收整个商店的组件负责更改路线?例如,我希望在接收特定商品的商店中发生这种情况。也许可以分享一些代码?谢谢你的回答!但是我如何访问componentWillMount中的下一步?@mweststrate这个答案是否仍然是最新的?这似乎是一个非常常见的用例。我正在RN中渲染一个平面列表,并希望在长度增加时滚动到底部。MobX迫使我跳出疯狂的圈圈,简单地比较prevProps和this.props。最干净的方法是什么?谢谢你的回答!但是我如何访问componentWillMount中的下一步?@mweststrate这个答案是否仍然是最新的?这似乎是一个非常常见的用例。我正在RN中渲染一个平面列表,并希望在长度增加时滚动到底部。MobX迫使我跳出疯狂的圈圈,简单地比较prevProps和this.props。最干净的方法是什么?
@observer class RequiresLogin extends Component {
render() {
if (this.props.viewerStore.id !== undefined) {
return this.props.children
} else {
return <LoginPage viewer={this.props.viewerStore}/>
}
}
}
@observer class MyTestPage extends Component {
render() {
return <RequiresLogin viewer={this.props.viewerStore}>
Secret Area!
</RequiresLogin>
}
}
@observer class LogInPage extends Component {
login = e => {
e.preventDefault();
this.props.viewer.login({
// tip: use React refs or the onChange handler to update local state:
email: e.target.elements['email'].value,
password: e.target.elements['password'].value,
});
}
render() {
if (this.props.viewer.id)
return null; // no need to show login form
return (
<div>
<h1>Log In</h1>
<form onSuccess={this.login}>
<input type="text" name="email" />
<input type="password" name="password" />
<input type="submit" />
</form>
{ this.props.viewer.error && (
<div>
<b>Error</b>: {this.props.viewer.error}
</div>
)}
</div>
);
}
}