javascript - 通过地图而不是 for 循环渲染
问题描述
我目前正在使用此函数在 graphql 查询后呈现一些元素并显示结果:
const showUsers = React.useCallback(
(data: UsersLazyQueryHookResult, numberOfUsers: Number) => {
if (data) {
for (var i = 0; i < numberOfUsers; i++) {
const userName = data.users.nodes[i].firstName
.concat(' ')
.concat(data.users.nodes[i].lastName);
return (
<View style={styles.friends}>
<View style={styles.item}>
<Text style={styles.userName}>{userName}</Text>
<View style={styles.addButtonContainer}>
<Button
rounded
onPress={() => {
addFriend(Number(data.users.nodes[i].id));
setIsSubmitted(false);
setUserData(null);
}}>
<Icon name="plus" size={moderateScale(20)} color="black" />
</Button>
</View>
</View>
</View>
);
}
}
},
[createUserRelationMutation, userData, numberOfUsers],
);
我读过使用 for 循环不是一个好主意。因此,我试图切换到地图,但我无法。我不知道如何在const userName
使用地图时使用变量。
目前,我只能用它进行测试,numberOfUsers = 1
所以它工作正常,但实际上,我希望其中item
包含的所有View
内容都设置为friends
. 目前,每个项目都会有一个单独<View style={styles.friends}>
的项目。但是,我想将所有项目映射到一个<View style={styles.friends}>
解决方案
Map 将一个函数作为其参数,这意味着您可以在传递给 map 的函数内部的 for 循环中使用相同的代码,如下所示:
data.users.map((user) => {
const userName = user.firstName
.concat(' ')
.concat(user.lastName);
return (
<View style={styles.friends}>
<View style={styles.item}>
<Text style={styles.userName}>{userName}</Text>
<View style={styles.addButtonContainer}>
<Button
rounded
onPress={() => {
addFriend(Number(user.id));
setIsSubmitted(false);
setUserData(null);
}}>
<Icon name="plus" size={moderateScale(20)} color="black" />
</Button>
</View>
</View>
</View>
);
}
只需替换 的所有实例,data.users.nodes[i]
因为user
这就是数组中每个对象传递给函数的方式。
有关这方面的更多信息,请查看React 文档的这一部分。
推荐阅读
- rundeck - 作业条件报告以前的作业“从不运行”
- unity3d - Unity2D 没有正确检查条件
- mongodb - Docker中的SpringBoot未连接到Mongo并引发异常
- amazon-web-services - Amazon Elastic Container Service 中的无法拉取容器错误
- mysql - MySql关于状态的触发函数
- swift - 删除所有注释(MyPointAnnotations),其中 type != something
- windows - Windows终端可点击的网址?
- visual-studio-code - VSCode状态栏一半隐藏在任务栏下方
- django - 如何在 AllAuth 社交帐户注册上进行自定义重定向
- reactjs - 视图之间几乎重复的状态