[解決済み] componentWillReceivePropsライフサイクルメソッドはいつ使用するのですか?
質問
私はReact/Reduxの初心者ですが、状態について問題があります。
TrajectContainer.jsx
class TrajectContainer extends React.Component {
constructor(props) {
super(props);
this.state = {
trajects: props.trajects,
onClick: props.onClick
};
}
componentWillReceiveProps(nextProps) {
console.log('componentWillReceiveProps', nextProps);
this.setState(nextProps);
}
render() {
// When the componentWillReceiveProps is not present, the this.state will hold the old state
console.log('rerender', this.state);
return (<div className="col-md-6">
<h2>Trajects</h2>
<button className="btn btn-primary" onClick={this.state.onClick}>Add new Traject</button>
{this.state.trajects.map(traject => <Traject traject={traject} key={traject.name}/>)}
</div>)
}
}
const mapStateToProps = function (store) {
console.log('mapToStateProps', store);
return {
trajects: store.trajects
};
};
const mapDispatchToProps = function (dispatch, ownProps) {
return {
onClick: function () {
dispatch(addTraject());
}
}
};
export default connect(mapStateToProps, mapDispatchToProps)(TrajectContainer);
リデューサが新しい状態を返すと、コンポーネントは新しいデータで再レンダリングされます。
しかし:componentWillReceiveProps関数を削除すると、render()関数が古い状態を持ちます。
mapStateToPropsで受信したデータを確認したところ、こちらは新しいNew Stateでした。 ですから、レンダー関数が新しいデータを受信するために、なぜcomponentWillReceiveProps関数が必要なのか理解できません。
私は何か間違っているのでしょうか?
解決方法は?
componentWillReceiveProps
は、新しいプロップス値でステートの値を更新したい場合に必要です。このメソッドは、プロップス値に何らかの変更が発生するたびに呼び出されます。
<ブロッククオート
あなたの場合、なぜこのcomponentWillReceivePropsメソッドが必要なのでしょうか?
propsの値をstate変数に格納し、このように使用しているからです。
this.state.KeyName
そのために必要なのが
componentWillReceiveProps
ライフサイクルメソッドで状態の値を新しいpropsの値で更新すると、コンポーネントのpropsの値だけが更新されることになりますが
自動的に状態が更新されることはありません。
. もし、状態を更新しないのであれば
this.state
は常に初期データを持ちます。
componentWillReceiveProps
は、propsの値をstateに保存せず、直接使用する場合は不要です。
this.props.keyName
これでreactはrenderメソッド内で常に更新されたpropsの値を使用し、propsに変更があった場合は新しいpropsでコンポーネントを再レンダリングするようになりました。
の通りです。 DOC :
componentWillReceiveProps()は、マウントされたコンポーネントが起動する前に呼び出されます。 は新しいプロップを受け取ります。に対応して状態を更新する必要がある場合、その状態を更新します。 プロップの変更(例えば、リセットする)を行うには、this.props のthis.setState()で状態遷移を行います。 このメソッド
Reactは、初期プロップでcomponentWillReceivePropsを呼び出すことはありません。 マウントを行います。このメソッドを呼び出すのは、コンポーネントのプロップの一部がマウントされる可能性がある場合のみです。 が更新されます。
提案します。
propsの値をstateに格納せず、直接
this.props
を作成し、uiコンポーネントを作成します。
関連
-
[解決済み】<Router>の外側で<Link>を使用してはならない
-
[解決済み】コンポーネントの定義に表示名がない react/display-name
-
[解決済み] Apolloクライアントでログアウトした後、ストアをリセットする
-
[解決済み] error 'document' is not defined : eslint / React
-
[解決済み] sh: react-scripts: npm start の実行後にコマンドが見つからない。
-
[解決済み] React + TypeScript のエラーです。この呼び出しにマッチするオーバーロードがありません
-
[解決済み] ReactjsのEsLintの "react / jsx-props-no-spreading "エラーを無効化する。
-
[解決済み] AxiosにCORSの問題が発生
-
[解決済み] componentWillReceivePropsライフサイクルメソッドはいつ使用するのですか?
-
[解決済み] Reactのrender()にFont Awesomeのアイコンを入れる方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SVGサークル内の画像にボーダーを追加する方法
-
[解決済み] MUI Boxは何のためのコンポーネントですか?
-
[解決済み] Angular 2の*ngForのReactでの同等品
-
[解決済み] ReactjsのEsLintの "react / jsx-props-no-spreading "エラーを無効化する。
-
[解決済み] React JSでは、状態を直接変異させない、setState() react/no-direct-mutation-stateを使用する。
-
[解決済み] は、gatsby-imageで動作する良いreactのカルーセルコンポーネントはありますか?[って聞かれます。]
-
[解決済み] Error: yarn start - エラー コマンド "start" が見つかりません。
-
[解決済み] componentWillReceivePropsライフサイクルメソッドはいつ使用するのですか?
-
[解決済み] 拡張子.tsと.tsxの違いは何ですか?どちらもreactのタイプスクリプトファイルの拡張子として使用されます。では、どこで使うべきなのでしょうか?
-
[解決済み] create-react-appビルドスクリプトを実行する際に、ビルド.env変数を設定するには?