私は問題に遭遇して、助けを求めています。 私はmapRanks
という機能を持っています。 componentWillMount
で呼び出され、基本的にsetState
の要素はmap
の文字列を使用しています。 1つの配列でうまく動作しますが、複数の異なる配列で複数回実行する必要があります。リアクションセット状態が古い状態を取り除く
前の状態はすべて最後のものを除いてarray[0]
になります。
それを見てみてください:私の状態は、このようになります
export const mapRanks = (options, ranks, count, element) => {
component = options.component; // this component
group = options.group; // can be 'mapFirst', 'mapSecond', ...
let col = count;
let j = count;
let k = count;
const map = ranks.map((rank, i) => {
if (i === col) {
col = col + j--;
if (j === 0) {
j = k--;
}
return [element(i, group, rank), <div key={ i } className="clearfix"></div>];
}
return [element(i, group, rank)];
});
const newState = update(component.state, { maps: { [group]: { $set: map } } });
component.setState(newState);
setTimeout(() => { console.log(component.state.maps); }, 7000);
};
:また
constructor() {
super();
this.state = {
maps: {
mapFirst: [],
mapSecond: [],
mapThird: [],
mapFourth: [],
},
};
}
、私はそれが関係ないと思うが、私は思ったんだけど...あなたを行います上記のsetTimeout
〜console.log
を参照してください。状態がarray[0]
を返すのでsetTimeout
を使用しなければならなかったが、setTimeout
を使用すると、要素の配列全体が返されます。何故ですか?
EDIT:問題が見つかりました。
componentWillMount() {
mapRanks(
{ component: this, state: 'mapFirst' }, ranksFirst, 9, element
);
mapRanks(
{ component: this, state: 'mapSecond' }, ranksSecond, 8, element
);
}
私は二mapRanks
、mapFirst[0]
とmapSecond[165]
を持って返すの両方(2)console.log
を追加 ..私はまだ理由を理解していません。
第二編集:私は、私は二mapRanks
関数呼び出しのためのsetTimeout
を追加して、今それが動作
それを修正しますが...。私はより良い解決策が必要です。助けてください。
あなたは、あなたが呼ばれてきたSETSTATE後に実行されるコールバック関数ですSETSTATEの2番目のパラメータを渡すことができSETSTATE後に何かをログコンソールにしたい場合は、SETSTATEは、非同期に行われるためのsetTimeoutを使用していた、その後、それにコンソールログ。 –
ああ私はsetStateが非同期であることを知らなかった。それはそれを説明する。私はあなたのコメントのおかげでそれを修正しました。 – cocacrave