ここでレンガの壁に当たったので、次の2つのバージョンのコードが異なる動作をする理由を完全に理解できません。最初のバージョンで動的なレンダリングコンポーネントに反応する(オブジェクト割り当てと関数の戻り)
私はthis.childComponent = (<ChildComp />)
を初期化していたときに、その小道具は私が(setState()
経由)Parent
の状態を変更したときに更新していないようです。これは、setState()
が実際に呼び出され、Parent
の状態が更新されても発生します。
2番目のバージョンでは、実際にコンポーネント(this.childComponent =() => {return (<ChildComp />)}
)を返す関数を初期化すると、すべてが魅力的に機能し、小道具が更新されます。 私は2番目のバージョンを使用しています(動作しています)が、なぜこれが動作し、最初のバージョンが動作しないのかを理解したいと思います。
1.
class Parent extends React.Component {
constructor() {
this.state = {
value: 1
}
this.childComponent = (
<Child value={this.state.value}
setValue={() => this.setValue()}/>
)
}
setValue() {
this.setState({value: 2})
}
render() {
return ({this.childComponent})
}
}
2.は(this.childComponent
がある:私は親コンポーネントの次の2つのバージョンを持っている
class Child extends React.Component {
render() {
return (
<button onClick=(this.props.setValue())>
{this.props.value}
</button>
)
}
}
:ここ
は、子コンポーネントです今はreact要素を返す関数)class Parent extends React.Component {
constructor() {
this.state = {
value: 1
}
this.childComponent =() => {
return (
<Child value={this.state.value}
setValue={() => this.setValue()}/>
)
}
}
setValue() {
this.setState({value: 2})
}
render() {
return ({this.childComponent()})
}
}
私の問題を分かりやすくするためにコードを単純化しようとしました。
は
this.childComponent = (
<Child value={this.state.value}
setValue={() => this.setValue()}/>
)
は一度だけ実行され、現在、静的な値である、コンストラクタで定義されていたので、あなたが最初のケースでリターンを持っていない、事前に
最初の(壊れた)バージョンでは、子コンポーネントは静的に定義され、再度変更されることはありません。 – pscl
あなたが最初のケース '(レンダリングに復帰していない){ リターン{} this.childComponent }'働くことは、そうでない子コンポーネントは、静的 –
がそれを手に入れた説明のためのおかげで –