第一个console.log(this.state.dataSource)的数据blob给了我
[ { date: '2017-07-13',
images:
[ { image: 'assets-library://asset/asset.JPG?id=8855847A-7157-4D04-8E71-43746BED3E2E&ext=JPG',
selected: false } ],
key: 0 }]
第二个console.log(this.state.dataSource)为我提供了数据blob:
[ { date: '2017-07-13',
images:
[ { image: 'assets-library://asset/asset.JPG?id=8855847A-7157-4D04-8E71-43746BED3E2E&ext=JPG',
selected: true } ],
key: 0 }]
正如你所看到的,我从来没有在这个函数中使用setState来改变this.state.dataSource的值,怎么会以某种方式,我的函数也影响this.state.dataSource的值?由于这条线
,似乎直接操纵了该状态值tempImages[index].selected = !tempImages[index].selected
_
setSelected(date,index,value){
console.log(this.state.dataSource)
let tempArray = data
let tempImages = []
for(var i in tempArray){
if(tempArray[i].date == date){
tempImages = tempArray[i].images
}
}
console.log(tempImages)
tempImages[index].selected = !tempImages[index].selected
console.log(tempImages)
console.log(this.state.dataSource)
}
编辑:
sortPhotos(value){
let tempArray = []
for(var i in value){
let found = false
for(var e in tempArray){
if(tempArray[e].date == moment(value[i].node.timestamp*1000).format('YYYY-MM-DD')){
found = e
}
}
if(!found){
tempArray.push({
date: moment(value[i].node.timestamp*1000).format('YYYY-MM-DD'),
images: [{image: value[i].node.image.uri, selected: false}],
key: tempArray.length
})
}else{
let images = tempArray[found].images
images.push({
image: value[i].node.image.uri,
selected: false
})
tempArray[found].images = images
}
}
this.setState({
dataSource: this.state.dataSource.cloneWithRows(tempArray),
dataSourceClean: tempArray,
loaded: true
})
}
setSelected(date,index,value){
let tempArray = this.state.dataSourceClean
let tempImages = []
for(var i in tempArray){
if(tempArray[i].date == date){
tempImages = tempArray[i].images
}
}
tempImages[index].selected = !tempImages[index].selected
console.log(this.state.dataSource)
}
答案 0 :(得分:0)
您正在使用数组克隆dataSource
,克隆将使用对tempArray
的引用进行克隆,因此每当您对tempArray
进行更改时,这些更改都会反映在{{1}中}}。您必须在代码中执行以下操作:
dataSource
我们对dataSource: this.state.dataSource.cloneWithRows([...tempArray])
所做的是,我们正在传递[...tempArray]
的副本,该副本与tempArray
无关,您在tempArray
中所做的任何更改都将没有反映在tempArray
。
PS
dataSource
是ES6中引入的Spread运算符。您可以在Spread Operator