【发布时间】:2020-10-17 03:07:54
【问题描述】:
在运行 graphql 查询后,我试图将一些数据传递到我的 FlatList 组件中。如果我使用const DATA对数据进行硬编码,它可以工作。但是,如果我定义两种情况(成功查询和不成功查询)并使用let DATA,则变量不会正确传递到 FlatList 中,并且它们在 FlatList 组件中始终未定义。
我该如何解决这个问题? 我怎样才能确保DATA 仅在查询运行后传递到FlatList?
例如,像这样的硬编码数据有效:
const DATA = [
{
id: '1',
imageUrl: defaultUrl,
name: 'Friend',
vehicles: [],
rating: 1,
numberOfFriends: 3,
}
];
但这不是(尽管查询工作正常):
let DATA;
const { data, error } = useGetMyProfileQuery({
onCompleted: () => {
console.log('frineds', data.me.friends)
DATA = data.me.friends.map(
(item: {
firstName: string;
id: number;
rating: number;
vehicles: Array<Vehicle>;
friends: Array<User>;
}) => ({
id: item.id,
imageUrl: defaultUrl,
name: item.firstName,
rating: item.rating,
//vehicles: item.vehicles,
vehicles: [],
numberOfFriends: item.friends.length,
}),
);
},
onError: ()=> {
DATA = [
{
id: '1',
imageUrl: defaultUrl,
name: 'Friend',
vehicles: [],
rating: 1,
numberOfFriends: 3,
}
}
});
平面列表:
<FlatList
showsHorizontalScrollIndicator={false}
data={DATA}
horizontal={true}
//scrollEnabled
renderItem={({ item }) => (
<WhitelistItem
title={item.name}
face={item.imageUrl}
firstName={item.name}
rating={item.rating}
numberOfFriends={item.numberOfFriends}
vehicles={item.vehicles}
/>
)}
keyExtractor={(item) => item.id}
/>
编辑:
我知道 setStates,但这能保证每次查询重新运行时,数据都会更新吗?还是我必须使用 useEffect 等?过去我用useStates的时候,数据经常不会自动更新,老是给老数据,所以找了个替代方法
【问题讨论】:
-
在这种情况下,您应该使用钩子,因为这是更新组件以呈现新传入数据的唯一方法,还有强制更新组件的选项,但该选项不可靠
标签: javascript reactjs typescript react-native react-native-flatlist