immutableに扱わないと内容の壊れてしまうstateさん
こんにちは。最近ようやく配列的なstateを管理してアプリケーションを作るようになった者です。
配列の一部の内容をtextInputのvalueとして管理する方法を学んだばかりです。
immutableに管理できるimmutability-helperを使用しています。
さて、ある程度の処理であれば上述のように処理はできるのですが。。。
map()内でのstateの処理を考えなければならない時、どのように処理させたら良いのでしょうか?
僕は凡人ですので、人間的にこうだったらいいなという記述をして、処理が行えずに困ってしまいました。
var addDetection = [ [0,0], [0,1] ] addDetection.map( key => { var keyWhatDay = key[0] var keyWhatTime = key[1] var newSchedule = update(this.state.schedule, { [keyWhatDay] : { [keyWhatTime] : { STATUS : { $set: true }, ID : { $set: ID } } } }) console.log('new aaa/' ) console.dir(newSchedule) this.setState({schedule:newSchedule}) } )
都合上コードのmapの中身は二つの配列のみで、描き崩せそうなものとしていますが、本来、変動するものなので、mapやforEachなどの、中身総当たり方式で処理をしてもらわないと困ります。
あまりにもうまく動かないので、console.logなどでのデバックを行いました。
map内のnewScheduleについては、それぞれaddDetectionの二つの配列ごとに、それぞれ00と01の位置に書き込めることはわかりましたが、
分離しています。
immutableに書こうとしたのに、分離するなんて困ってしまいます。
どのようなconsole.logの結果かというと、
00の時は 00 が true 01がfalse
01の時は 00 が false 01がtrue
となっており、これをそれぞれsetStateしようとして、失敗して、
このmapの外側でのconsole.dir(this.state.schedule)
の表示が 00 false 01 false となってしまうようです。(この位置だけでの話ではなく、renderでもこの処理にて表示させるところがあるので、falseなのは間違い無いと思います。(多分))
このような処理の時に、どのようにうまく記述するのでしょうか?
解決しました。
addDetectionFunc = ( addDetection, subjectID ) => { const self = this return new Promise(function(resolve) { addDetection.forEach(key => { var keyWhatDay = key[0] var keyWhatTime = key[1] self.setState(prevState => { const newSchedule = update(prevState.preSchedule, { [keyWhatDay] : { [keyWhatTime] : { STATUS : { $set : true }, ID : { $set : subjectID } } } }) return {preSchedule: newSchedule} }) }) resolve() }) }
このように一旦prescheduleにsetStateして、promise thenのなかでもう一度本命にsetStateすると言う回りくどい形にはなりましたが、これが一番immutableにかけていると思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/14 14:47
2018/03/16 06:39
2018/03/16 10:01
2018/03/19 04:57