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.
-
@陈阿票 直接
<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>
-
This post is deleted!
-
@sunnylqm 谢谢了,我昨天换了这个方法就好了。这个应该和RN的版本有关。或者说map语法是ES6语法。而for循环是ES5语法。
-
@陈阿票 跟rn版本无关,
for (var i=0; i<Datas.length; i++) {
这个改成
for (let i=0; i<Datas.length; i++) {
也可以
-
@sunnylqm 恩恩,改成let的确可以。不过是什么原因还真是费解。按理说let是声明为常量。那 i 还怎么累加保证循环继续呢?
-
@陈阿票 const才是常量,let和var的作用域有所区别。
-
@sunnylqm 好吧,在swift里面,let是用来声明常量的,var是声明变量的。iOS程序员的惯性思维。
-
-
-
@陈阿票 你测试一下吧。let理论上是可以的,你说的问题应该是var才会出现的。
直接
for (let i = 0; i < data.length; i++){
是可以的,但是var就不行了。
当然用map更好。
-
@tdzl2003 恩恩,对的。