子関数を呼び出すためにReact refを使用することを明確にしたいと考えています。いくつかのボタンがあるツールバーの親コンポーネントがあります。子コンポーネントでは、ライブラリのエクスポート機能にアクセスできます。親コンポーネントのボタンをクリックすると、このエクスポート関数が呼び出されます。React refsを使って子関数を呼び出すためのベストプラクティス
Parent.js [参照]
class Parent extends React.Component {
onExportClick =() => {
this.childRef.export();
}
render() {
return (
<div>
<button onClick={this.onExportClick} />Export</button>
<Child ref={(node) => this.childRef = node;} />
</div>
)
}
}
Child.js [参照]
class Child extends React.Component {
export() {
this.api.exportData();
}
render() {
<ExternalLibComponent
api={(api) => this.api = api}
/>
}
}
このソリューションは正常に動作し、:現在、私はこれを達成するために、参考文献に反応を使用していますこれがベストプラクティスである場合は、lotがdisagreementであることがわかりました。 Reactの公式docでは、「宣言的にできることは何でもrefを使うのは避けるべきです」と言います。同様の質問のdiscussion postでは、ReactチームのBen Alpertによると、 "refsは正確にこのユースケースのために設計されています"と述べていますが、通常は小道具を渡して宣言的に行うようにしてください。ここで
は私がref
せずに宣言的にこれを行うだろう方法は次のとおりです。
Parent.js [宣言型]
class Parent extends React.Component {
onExportClick =() => {
// Set to trigger props change in child
this.setState({
shouldExport: true,
});
// Toggle back to false to ensure child doesn't keep
// calling export on subsequent props changes
// ?? this doesn't seem right
this.setState({
shouldExport: false,
});
}
render() {
return (
<div>
<button onClick={this.onExportClick} />Export</button>
<Child shouldExport={this.state.shouldExport}/>
</div>
)
}
}
Child.js [宣言型]
class Child extends React.Component {
componentWillReceiveProps(nextProps) {
if (nextProps.shouldExport) {
this.export();
}
}
export() {
this.api.exportData();
}
render() {
<ExternalLibComponent
api={(api) => this.api = api}
/>
}
}
この問題の "エスケープハッチ"とみなされます。この宣言的なolutionはちょっとハックリかもしれませんが、refを使うよりもうまくいくわけではありません。私はこの問題を解決するためにrefsを使用し続けるべきですか?あるいは、私は幾分かぎのような宣言的なアプローチをとるべきですか?あなたが戻ってfalse
からshouldExport
を設定する必要はありません
ありがとう。答えは「それは依存している」ということが私には分かりました。白黒の状況ではありません。 – Alex