親の<MessageBox />
要素があり、状態に格納されたmessages
のリストを含んでいます。 message
がmessages
の場合、message.subject
とmessage.body
の各フィールドを持つ内に<Message />
要素が作成されます。ユーザーはmessage.subject
とmessage.body
を編集できます。完了すると、message
オブジェクトはprops.updateHandler()
を通して<MessageBox />
に返され、親のメッセージ状態を維持します。ReactJS:親と子の間のデータ状態を維持します
私の現在のアプローチでは、MessageBox
の状態にメッセージデータを格納しており、render()
関数では、<Message />
要素を作成し、それぞれにコールバックを渡してデータの変更を送り返します。コールバックでは、<Message />
要素のそれぞれから更新されたデータがMessageBox
の状態に更新されます。この理由は、最近更新されたすべてのデータを1か所に保存するためです。上記の方法は、<Message />
のshouldComponentUpdate()
メソッドがオーバーロードされていない場合(無限再帰)に大混乱を引き起こします。
これにはより良いアプローチがありますか?私は、組み込みのメソッドをオーバーライドして全体を安定に保つために、たくさんのコードを書く必要があります。私がFlux/Reduxのために行くつもりはないので、これにはReact-onlyアプローチがありますか?
編集:混乱が多いので、最小限のコードを追加しています。
class Message extends React.Component {
constructor(props) {
this.state = {
subject: this.props.subject,
body: this.props.body,
type: this.props.type,
messageIndex: this.props.messageIndex
};
}
componentDidUpdate() {
this.props.updateHandler(messageIndex, {
subject: this.state.subject,
body: this.state.body,
type: this.state.type
});
}
render() {
return (
<div>
<input
type="text"
defaultValue={this.state.subject}
onBlur={e => this.setState({subject: e.target.value})} />
<input
type="text"
defaultValue={this.state.subject}
onBlur={e => this.setState({body: e.target.value})} />
<select
type="text"
value={this.state.subject}
onChange={e => this.setState({type: e.target.value})}>
<option>Type 1</option>
<option>Type 2</option>
</select>
</div>
)
}
}
class MessageBox extends React.Component {
constructor(props) {
this.state = {
messages: aListOfMessageObjects
}
}
updateHandler(message) {
// Message update happens here and returns a list updatedMessages
this.setState({
messages: updatedMessages
});
}
render() {
let _this = this;
var messagesDOM = this.state.messages.map((m) => {
return (
<Message
message={m}
updateHandler={_this.updateHandler.bind(_this)} />
);
})
return (
<div>
{messagesDOM}
</div>
);
}
}
親コンポーネントにmessage.subjectとmessage.bodyが必要な理由を記述しませんでした。あなたがそこにそれを必要としないならば、子コンポーネントにそれらを小道具として渡し、それらから子供の状態を作ることは完全に有効です。 – Maggie
"コールバックでは、 要素のそれぞれから更新されたデータがMessageBoxの状態に更新されます。このコールバックがトリガされると、このコールバックは、ユーザーがメッセージを編集した場合にのみトリガーされます。私はこのような再帰的なループを見ることができません。いくつかのコード実装を提供できますか?MessageBox&Messageの実装を誤解する可能性があります。 –
@Maggie 'message.body'と' message.subject'は 'message'の一部であり、AJAX経由でサーバに送り返されるか、他の' messages'とともにバルク挿入または更新されます。だからこそ私はすべての 'messages'データが1つの場所に必要です。 –