反应本机状态值随机变化

时间:2017-07-12 23:55:15

标签: javascript reactjs react-native native

第一个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)
}

1 个答案:

答案 0 :(得分:0)

您正在使用数组克隆dataSource,克隆将使用对tempArray的引用进行克隆,因此每当您对tempArray进行更改时,这些更改都会反映在{{1}中}}。您必须在代码中执行以下操作:

dataSource

我们对dataSource: this.state.dataSource.cloneWithRows([...tempArray])所做的是,我们正在传递[...tempArray]的副本,该副本与tempArray无关,您在tempArray中所做的任何更改都将没有反映在tempArray

PS

  • 在Javascript字符串中,使用值(新副本)分配数字,而将数组,对象,日期指定为引用(指向同一对象)。
  • dataSource是ES6中引入的Spread运算符。您可以在Spread Operator
  • 了解有关它的更多信息