使用useEffect

时间:2020-07-01 10:34:08

标签: javascript reactjs typescript react-native react-hooks

我运行graphql查询,并使用结果呈现一些项目。这很好。现在,在另一个屏幕上,我使用apollos refetch选项运行另一个变异,这样,只要运行该变异,第一个查询就会在使用它的任何地方重新获取数据。 refetching部分工作正常,我已经在其他屏幕上对其进行了测试。

但是,由于我正在做一些映射并使用setStates,所以尽管我获得了新数据,但它不会传递给FlatList,因此FlatList不会得到更新。在我未进行映射的另一个屏幕上,我只是将data传递到FlatList中,它可以正常工作,但是在这里却不能。

那我该如何解决呢?我尝试使用useEffect,但不知道在其中写什么。

export const WhitelistBar: React.FC = () => {
  const [friendList, setFriendList] = useState<Friend[]>();
  const [originatorId, setOriginatorId] = useState<number>();

  useEffect(() => {
    //setFriendList(DATA);
    //console.log('friendlist', friendList);
  }, [useGetMyProfileQuery]);
  
  const _onCompleted = (data) => {
    console.log('running', data);
    let DATA = data.me.friends.nodes.map(
      (item: {
        id: number;
        firstName: string;
        rating: number;
        vehicles: Vehicle[];
        friends: UserConnection;
      }) => ({
        id: item.id,
        imageUrl: defaultUrl,
        name: item.firstName,
        rating: item.rating,
        vehicles: item.vehicles,
        numberOfFriends: item.friends.totalCount,      
      }),
    );
    setFriendList(DATA);
    console.log('daattaaa', DATA);
    setOriginatorId(data.me.id)
  };

  const _onError = () => {
    let DATA = [
      {
        id: 1,
        imageUrl: defaultUrl,
        name: 'Friend',
      },
      {
        id: 2,
        imageUrl: defaultUrl,
        name: 'Friend',
      },
      {
        id: 3,
        imageUrl: defaultUrl,
        name: 'Friend',
      },
    ];
    setFriendList(DATA);
    setOriginatorId(0);
  };

  const { data } = useGetMyProfileQuery({
    onCompleted: _onCompleted,
    onError: _onError,
  });

  return (
    <View style={scaledStyles.container}>
      <View style={scaledStyles.whiteListBarTitle}>
        <Text style={scaledStyles.whiteListBarText}>Meine Freunde</Text>
      </View>
      <View style={{ flexDirection: 'row' }}>
        <FlatList
          showsHorizontalScrollIndicator={false}
          data={friendList}
          horizontal={true}
          renderItem={({ item }) => (
            <WhitelistItem
              title={item.name}
              face={item.imageUrl}
              numberOfFriends={item.numberOfFriends}
              vehicles={item.vehicles}
            />
          )}
          keyExtractor={(item) => item.id.toString()}
        />
      </View>
    </View>
  );
};

1 个答案:

答案 0 :(得分:0)

您是否有理由在每个渲染器上调用useGetMyProfileQuery函数?

据我所知,您希望像下面这样将函数调用移到useEffect中:

useEffect(() => {
    useGetMyProfileQuery({onCompleted: _onCompleted, onError: _onError});
}, [])

这将在组件安装时运行一次useGetMyProfileQuery,类似于componentDidMount的工作原理!

不确定那是不是你要找的!