[解決済み] Reactの子コンポーネントが親の状態を変更した後に更新されない
質問
私は、様々な子コンポーネントにデータを入力するための素晴らしいApiWrapperコンポーネントを作ろうとしています。私が読んだすべてのものから、これは動作するはずです。 https://jsfiddle.net/vinniejames/m1mesp6z/1/
class ApiWrapper extends React.Component {
constructor(props) {
super(props);
this.state = {
response: {
"title": 'nothing fetched yet'
}
};
}
componentDidMount() {
this._makeApiCall(this.props.endpoint);
}
_makeApiCall(endpoint) {
fetch(endpoint).then(function(response) {
this.setState({
response: response
});
}.bind(this))
}
render() {
return <Child data = {
this.state.response
}
/>;
}
}
class Child extends React.Component {
constructor(props) {
super(props);
this.state = {
data: props.data
};
}
render() {
console.log(this.state.data, 'new data');
return ( < span > {
this.state.data.title
} < /span>);
};
}
var element = < ApiWrapper endpoint = "https://jsonplaceholder.typicode.com/posts/1" / > ;
ReactDOM.render(
element,
document.getElementById('container')
);
しかし、なぜか親の状態が変わっても子コンポーネントは更新されないようです。
何か見落としているのでしょうか?
どのように解決するのですか?
あなたのコードには2つの問題があります。
子コンポーネントの初期状態がpropsから設定されています。
this.state = {
data: props.data
};
引用元 SOの回答 :
<ブロッククオート
初期状態をコンポーネントに渡すのは
prop
はアンチパターンです。
というのは
getInitialState
(この例ではコンストラクタ) メソッドが呼び出されるのは、コンポーネントがレンダリングされる最初の時だけだからです。
メソッドが呼び出されるだけだからです。それ以上呼ばれることはありません。つまり、もしあなたがその
コンポーネントを再レンダリングすると
異なる
として値を渡すと
prop
のような異なる値を指定した場合、コンポーネント
はそれに応じて反応しません。
コンポーネントは最初にレンダリングされたときの状態を保持するからです。これは非常にエラーになりやすいのです。
ですから、もしそのような状況を避けられないのであれば、理想的な解決策はメソッド
componentWillReceiveProps
を使用して新しいプロップをリッスンすることです。
以下のコードを子コンポーネントに追加すると、子コンポーネントの再描画に関する問題が解決されます。
componentWillReceiveProps(nextProps) {
this.setState({ data: nextProps.data });
}
2つ目の問題は
fetch
.
_makeApiCall(endpoint) {
fetch(endpoint)
.then((response) => response.json()) // ----> you missed this part
.then((response) => this.setState({ response }));
}
そして、これが動くフィドルです。 https://jsfiddle.net/o8b04mLy/
関連
-
[解決済み】React Propsが定義されていません。
-
[解決済み] jest: テストスイートの実行に失敗しました。予期しないトークンのインポート
-
[解決済み] Webpack のコンパイルに失敗した
-
[解決済み] Uncaught (in promise) Error: リクエストに失敗、ステータスコード404
-
[解決済み] React QueryとReduxの主な違いは何ですか?
-
[解決済み] Reactでグローバル変数を宣言する方法とは?
-
[解決済み] setStateを呼び出さずにReactコンポーネントを強制的に再レンダリングすることは可能ですか?
-
[解決済み] 親メソッドから子メソッドを呼び出す
-
[解決済み] Reactコンポーネント外でのクリックを検出する
-
[解決済み] Reactのstateとpropsの違いとは?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React - 式は1つの親要素を持つ必要がありますか?
-
[解決済み】Typescript react - モジュール ''react-materialize'' の宣言ファイルが見つかりませんでした。'path/to/module-name.js' は暗黙のうちに any 型を持ちます。
-
[解決済み] error 'document' is not defined : eslint / React
-
[解決済み] MUI Boxは何のためのコンポーネントですか?
-
[解決済み] Webpack + Babelです。プリセット "es2015 "がディレクトリに相対して見つからなかった
-
[解決済み] リアクトです。<tr>は<td>の子として表示できません。コメント > td > tr を参照してください。
-
[解決済み] react nativeで関数だらけのヘルパーファイルを作成する方法は?
-
[解決済み] React TypeScriptで作業しているときに、Jestが予期しないトークンに遭遇した
-
[解決済み] Static HTML elements with event handlers require a role." を修正するにはどうすればよいですか?
-
[解決済み] Reactプロジェクトに.envファイルを追加する