componentDidMount
とsetState
を使用してカスタムコンポーネントを更新するのはかなり新しいことですが、これは推奨される方法です。React:componentDidMount + setStateはコンポーネントを再レンダリングしません
import React from 'react';
import {MyComponent} from 'my_component';
import axios from 'axios';
export default class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
data: []
};
}
GetData() {
return axios.get('http://localhost:5000/<route>');
}
componentDidMount() {
this.GetData().then(
(resp) => {
this.setState(
{data: resp.data}
)
}
)
}
render() {
return (
<MyComponent data={this.state.data} />
);
}
}
がちょうどrender()
下にconsole.log(this.state.data)
を行うthis.state.data
が実際に(どのようなAPIが返すへ[]
から)更新されますないことを示しています。下記の実施例(データを取得するためにaxios
API呼び出しを含んでいます)。しかし、MyComponent
がcomponentDidMount
によって新たにレンダリングされないという問題があります。 Facebookの反応文書から:
このメソッドの状態を設定すると、再レンダリングがトリガーされます。一度だけ呼び出さ
MyComponent
のコンストラクタ(this.props.data = []
)とコンポーネントが再び描画されません。
これはここの場合ではないようです。私はなぜ誰かがこれが何であるか、そして解決策が完了したかどうかを解決する方法か別の方法があるのかを説明することができれば素晴らしいだろう。
UPDATE
Iは、(...
によって示されるように、マイナスいくつかの無関係な機能)MyComponent
ためのコードを追加しました。 console.log(data_array)
は、空の配列を出力します。
import React from 'react';
class DataWrapper {
constructor(data) {
this._data = data;
}
getSize() {
return this._data.length;
}
...
}
export class MyComponent extends React.Component {
constructor(props) {
super(props);
this._dataWrapper = new DataWrapper(this.props.data);
this.state = {
data_array: this._dataWrapper,
};
}
render() {
var {data_array} = this.state;
console.log(data_array);
return (
...
);
}
}
「MyComponent」のコードを表示できますか?コンテナコンポーネントで何をしているのかは正しく見えますが、子コンポーネント内では何か変わっているかもしれません。 –
コンストラクタを複数回呼び出す必要はありません。 Reactはすでにオブジェクトを作成していますが、再度それを行う必要はありません。 'componentWillReceiveProps'で何かをログアウトすると、正常に動作していることがわかります。 MyComponentが 'this.props.data'に何かをレンダリングすると、それが更新されます。 –
さて、なぜコンストラクタを再度呼び出す必要がありますか?レンダリングにconsole.logを入れてレンダリングが2回であることを確認してください。 – Conan