コンポーネントがロードされたときにメソッドを呼び出そうとしていましたが、初期ページのロード時にデータをソートしました。マウントされたコンポーネントまたはマウントされているコンポーネントのみを更新できます。これは通常、アンマウントされたコンポーネントに対してsetState()を呼び出したことを意味します。
以下の例では、自分の状態を初期データに設定した後、即座にsort()メソッドを呼び出してデータを並べ替えます。
export default class Leaderboard extends React.Component {
constructor(){
super();
this.state = {
rows:
[{name: "Jonny", points: 124, total: 1234},
{name: "Bob", points: 321, total: 4321},
{name: "Sally", points: 234, total: 31234},
{name: "Katie", points: 613, total: 12333},
{name: "Cameron", points: 1232, total: 5231}]
};
this.sort("daily");
}
sort(args){
if (args === "daily") {
var sorted = this.state.rows.sort(function(a, b){
return a.points-b.points;
});
this.setState(sorted.reverse());
}
if (args === "total") {
var sorted = this.state.rows.sort(function(a, b){
return a.total-b.total;
});
this.setState(sorted.reverse());
}
}
render() {
const Rows = this.state.rows.map((obj, i) => <Row key={i} num={i} name={obj.name} points={obj.points} total={obj.total}/>);
return (
<div className="col-md-10 col-md-offset-1">
<table className="table table-hover">
<tbody>
<tr>
<th colSpan="4" className="text-center">Leaderboard</th>
</tr>
<tr>
<th> Number </th>
<th> Name </th>
<th onClick={() => this.sort("daily")}> Points </th>
<th onClick={() => this.sort("total")}> All time points </th>
</tr>
{Rows}
</tbody>
</table>
</div>
);
}
}
これは動作しますが、私は、コンソールにメッセージが出ています:
警告:SETSTATE(...を):専用でマウントや実装部品を更新することができます。これは、通常、アンマウントされたコンポーネントに対してsetState()を呼び出したことを意味します。これはノーオペレーションです。 Leaderboardコンポーネントのコードを確認してください。
この警告は無視しても過言ではありませんか?
ステートプロパティで 'sort()'を直接呼び出しても他の問題は発生しないのでしょうか? 'setState()'の呼び出しは修正されるべきです(オブジェクトの代わりに配列が渡されます) /警告(それが呼び出されている配列を 'sort()' _modifies_すると仮定すると)。 – robertklep
@robertklep良い点。私は最初の問題を見たときに私は見て停止した。私は自分の答えを編集しました。 – Jack