私はReactにかなり新しいです。子コンポーネントが互いに通信するためのきれいな方法を理解しようとしています。Reactの子コンポーネントは、きれいで保守しやすい方法で互いに通信する必要がありますか?
単純なコンポーネントでは、子にデータを渡すために小道具を使用し、子コンポーネントが親コンポーネントにデータを戻すためのコールバックを使用できることはわかっています。
親コンポーネントに複数の子コンポーネントがある場合、子コンポーネント間の通信は少し混乱します。お互いにコミュニケーションするために、同じレベルの子どもたちのコンポーネントのために何をすべきかわかりません。
私の場合、私はおそらくstates
を使うことができると決めました。だから私は親コンポーネントにstate
の値を持ち、それを子供の小道具に渡します。同様に、親コンポーネント内のコールバックハンドラ(childrenコンポーネントから呼び出される)は、状態値をReactのバインディングを介してある子供から別の子に渡すように状態を設定するのに役立ちます。
//Inside Parent Component
constructor() {
//initialise state for the child components
this.setState({testList: []});
}
render() {
return (
<div>
<ChildA onSomething={this.onSomethingHandler} testList={this.state.testList} />
<ChildB onSomethingElse={this.onSomethingElseHandler} testList={this.state.testList} />
</div>
);
}
onSomethingHandler(evt):void {
if(blah.blah.blah) this.setState({testList: this.state.testList.splice().push(evt.value)};
}
onSomethingElseHandler(evt):void {
//Some other complex biz logic...
if(blah.blah.blah) this.setState({testList: this.state.testList.splice().push(somethingOtherStuffDueToLogic)};
}
//Inside ChildA Component
export IChildAProps {
onSomething: (evt)=>void
}
render() {
//Do some logic from the value in testList property
if(this.state.testList == blah blah)...
return (
<button onClick={this.props.onSomething({id:321, value:"wassup! I'm ChildA."})}>ChildA</button>
)
}
//Inside ChildB Component
export IChildBProps {
onSomethingElse: (evt)=>void
}
render() {
//Do some logic from the value in testList property
if(this.state.testList == blah blah)...
return (
<button onClick={this.props.onSomething({id:123, value:"yo! I'm ChildB."})}>ChildB</button>
)
}
を、私は疑問に思い始めている場合は、親コンポーネントで、すなわちonSomethingHandler()
とonSomethingElseHandler()
その2ハンドラメソッド、内のロジック、子コンポーネント自体の内部に実際に存在するはずですか?私はこれを考えました。なぜなら、それらのロジックは、子コンポーネントが自分の目的に役立てるために自分で処理しなければならないもののように見えるからです。親コンポーネントはそれらのためにそれを行うべきではありません、またはちょうど乱雑に成長するかもしれません。しかし、私は彼らのコミュニケーションをどのように扱っているかのために選択肢がありません。これとは別に、私は単にコミュニケーションできるように新しい状態を作成しました。
これまでのところ、これはまだ比較的管理しやすいです。しかし、私自身の実験では、同じ(あるいは時々異なる)レベルの他の子コンポーネントを介して通信する必要がある、別の子コンポーネント内に子コンポーネントがネストされている段階に達しています。コミュニケーションのための州を使用することはまた私に多くの州を持っていることを意味し、それは私には良いアイデアのようには見えません。そして、親コンポーネントは、コンポーネントツリーの上下にあるすべてのデータの伝播を管理するために、数多くの面倒なコールバックハンドラメソッドで終了しました。
状況は、私が高々そうのようなものとして、それを説明することができるように厄介です:
そして、あなたは上の図で見ることができ、ChildB
はちょうど間にその情報を渡すことを助けるためにさらに別の状態を持つことになりました子コンポーネントです。
私はReactについて知っておくべきことが何か不足していると確信しています。私が親コンポーネントで持っているコールバックは、ちょうどデータ伝播を処理するのにはあまりにも多すぎるようです。どのように私は本当にきれいで維持しやすい方法で子どもたちのコンポーネントのコミュニケーションを整理する必要がありますか?
私が正しくあなたを理解していれば、あなたは親から共有リソース( 'testList')を渡していますすべての子供に。私は管理と制御/同期が難しく、何らかの理由でこの 'testList'のインスタンスが親で変更された場合にも何が起こるのでしょうか?シンプルなケースで説明したままにするだけで何が問題になりますか? childAで何かが発生した場合、コールバックを使用して親に通知します。次に、parentBはchildBがそれを知る必要があるかどうかを判断し、そうであればchildBに新しいpropsを渡してその情報を渡します。 –
しかし、 'ChildB'の中にある' ChildB_1'もその情報を必要としますか?その情報をさらに伝播しますか?この場合、 'testList'は共有リソースのようです。しかし、私は 'this.state.panelOpen = 'true/false''、' this.state.currentMode = 0/1/2'などのような他の状態を持っていると思います。どういうわけか、これらの情報をさまざまなレベルの子供のコンポーネントに渡す必要があります。そのため、私は面倒なコールバックで狂ってしまいます。 – Carven
私は何かが恋しくない限り、簡単です。 parentからchildBへ情報を渡すときには、 'Parent.render'メソッドでそれを行い、childBの小道具が「ダーティ」なので、新しい小道具でchildBのレンダリングを呼び出します。 'childB.render'メソッドが呼び出されると、この新しい情報を持つ新しい小道具で' childB_1.render'メソッドを呼び出します。これは、共有リソースを使って簡単に行うことができる方法のように思えるかもしれませんが、他のコンポーネントの状態について心配する必要がないので、事実を単純化します。 –