for循环创建TouchableOpacity对象时,点击时怎么判断具体点击了哪一个。



  • for (var i=0; i<Datas.length; i++) {
    // 取出单独的数据
    var data = Datas[i];
    itemArr.push(
    <TouchableOpacity key={i} onPress={()=>{this.itemClick()}} >
    <View style={styles.innerViewStyle} >
    <Image source={{uri:data.iconName}} style={{width:40, height:30, marginBottom:3}} />
    <Text style={{color:'gray'}} >{data.title}</Text>
    </View>
    </TouchableOpacity>
    );
    }

    调用this.itemClick方法时,传递过去的 i 值都是同样的值,有什么方法可以区分一下么



  • @陈阿票 说:

    传递过去的 i 值都是同样的值

    这个请看js闭包相关的知识,可以这样:

    onPress={ ()=>{ let index = i; this.itemClick(index); } }
    


  • @wosuopu 说:

    { let index = i; this.itemClick(index); }

    这个方法行不通,比如我数组里面有四个值,i从0到累加3,创建了四个TouchableOpacity。最后调用onPress方法所传递过去的值都是4.


  • administrators

    @陈阿票 直接

    <View>
    { Datas.map((data, index) => 
    <TouchableOpacity key={index} onPress={()=>{this.itemClick(index)}} >
    <View style={styles.innerViewStyle} >
    <Image source={{uri:data.iconName}} style={{width:40, height:30, marginBottom:3}} />
    <Text style={{color:'gray'}} >{data.title}</Text>
    </View>
    </TouchableOpacity>
    }
    </View>
    


  • 此回复已被删除!


  • @sunnylqm 谢谢了,我昨天换了这个方法就好了。这个应该和RN的版本有关。或者说map语法是ES6语法。而for循环是ES5语法。


  • administrators

    @陈阿票 跟rn版本无关,
    for (var i=0; i<Datas.length; i++) {
    这个改成
    for (let i=0; i<Datas.length; i++) {
    也可以



  • @sunnylqm 恩恩,改成let的确可以。不过是什么原因还真是费解。按理说let是声明为常量。那 i 还怎么累加保证循环继续呢?


  • administrators

    @陈阿票 const才是常量,let和var的作用域有所区别。



  • @sunnylqm 好吧,在swift里面,let是用来声明常量的,var是声明变量的。iOS程序员的惯性思维。



  • @陈阿票 说:

    this.itemClick

    this.itemClick.bind(this, index) 写法可能更方便一点。



  • @coyer 说:

    this.itemClick.bind(this, index)

    我看还是this.itemClick(index) 更方面一些吧,毕竟少写不少代码



  • @陈阿票 你测试一下吧。let理论上是可以的,你说的问题应该是var才会出现的。

    直接

    for (let i = 0; i < data.length; i++){
    

    是可以的,但是var就不行了。

    当然用map更好。



  • @tdzl2003 恩恩,对的。


登录后回复