通过地图渲染而不是 for 循环
Render via map instead of for loop
我目前正在使用此函数在 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
进行测试,所以它工作正常,但实际上,我想要 View
中包含的所有 item
,样式为 [=15] =].目前,每个项目都会有一个单独的 <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
,因为这就是数组中每个对象传递给函数的内容。
有关此的更多信息,请查看 this part of the React docs。
如果您希望所有内容都包含在样式为 friends 的视图中,代码应该是这样的。
您应该将视图中的地图作为 JS 代码并从项目变量访问属性。
const showUsers = React.useCallback(
(data: UsersLazyQueryHookResult, numberOfUsers: Number) => {
if (data) {
return (
<View style={styles.friends}>
{
data.users.nodes.map(item => {
const userName = item.firstName
.concat(' ')
.concat(item.lastName);
return (<View style={styles.item}>
<Text style={styles.userName}>{userName}</Text>
<View style={styles.addButtonContainer}>
<Button
rounded
onPress={() => {
addFriend(Number(item.id));
setIsSubmitted(false);
setUserData(null);
}}>
<Icon name="plus" size={moderateScale(20)} color="black" />
</Button>
</View>
</View>);
})
}
</View>
);
}
},
[createUserRelationMutation, userData, numberOfUsers],
);
我目前正在使用此函数在 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
进行测试,所以它工作正常,但实际上,我想要 View
中包含的所有 item
,样式为 [=15] =].目前,每个项目都会有一个单独的 <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
,因为这就是数组中每个对象传递给函数的内容。
有关此的更多信息,请查看 this part of the React docs。
如果您希望所有内容都包含在样式为 friends 的视图中,代码应该是这样的。
您应该将视图中的地图作为 JS 代码并从项目变量访问属性。
const showUsers = React.useCallback(
(data: UsersLazyQueryHookResult, numberOfUsers: Number) => {
if (data) {
return (
<View style={styles.friends}>
{
data.users.nodes.map(item => {
const userName = item.firstName
.concat(' ')
.concat(item.lastName);
return (<View style={styles.item}>
<Text style={styles.userName}>{userName}</Text>
<View style={styles.addButtonContainer}>
<Button
rounded
onPress={() => {
addFriend(Number(item.id));
setIsSubmitted(false);
setUserData(null);
}}>
<Icon name="plus" size={moderateScale(20)} color="black" />
</Button>
</View>
</View>);
})
}
</View>
);
}
},
[createUserRelationMutation, userData, numberOfUsers],
);