每次进入屏幕时重新获取数据

refetch data every time you enter the screen

我有一个屏幕,其中我 运行 一个查询,然后根据其结果,我通过 UserList 组件呈现一些项目。使用 UserList 组件中的一个按钮,我 运行 一个突变(删除一个项目)。在这种情况下,因为组件是链接在一起的。我传递了 deleteContact 函数并在其中使用了 refetch() 。因此,当我删除用户时,ui 会自动更新并删除已删除的用户。

但是,我有另一个 AddContact 的组件,它并没有真正链接到 Whitelist 组件(导航除外)。因此,当我添加用户并返回到 Whitelist 屏幕时,ui 没有更新。未呈现新用户。每次重新访问 Whitelist 屏幕时,有什么方法可以调用 refetch() 吗?

export const Whitelist: React.FunctionComponent = (props) => {

  // useEffect(() => {
  //   refetch()
  // }, []);

  const [deleteUserRelationMutation] = useDeleteUserRelationMutation({
    onCompleted: (index: number) => {
      refetch();
      Alert.alert('Contact Deleted');
    },
    onError: _onDeleteUserRelationError
  });

  const onDeleteContact = (relationId: number) => {
    deleteUserRelationMutation({
      variables: { id: relationId}
  })
  };

  const { loading, error, data, refetch } = useUsersQuery({
    variables: {
      where: { id: 1 },
    },
  });

  return (
    <SafeAreaView style={{ flex: 1 }}>
      <Container style={{ flex: 1, alignItems: 'center' }}>
<Item style={styles.addToWhitelist}>
          <Icon name="add" onPress={() => navigation.navigate('AddContact')} />
          <Text >Add contact</Text>
        </Item>
        <ContactList data={data} onDeleteContact={onDeleteContact}></ContactList>
      </Container>
    </SafeAreaView>
  );
};
export const ContactList: React.FunctionComponent<UserProps> = ({ data, onDeleteContact }) => {

  if (!data) return null;
  return (
    <View style={styles.users}>
    {data.users.nodes[0].userRelations.map(
      (item: { relatedUser: RelatedUser, type: RelationType, id: number}) => {
        const userName = item.relatedUser.firstName.concat(' ').concat(item.relatedUser.lastName);
        return (
          <View style={styles.item} key={item.id}>
              <View style={styles.nameNumber}>
            <Text style={styles.userName}>{userName}</Text>
            </View>
            <View style={styles.deleteButtonContainer}>
              <Button
                onPress={() => onDeleteContact(item.id)}
                >
              </Button>
            </View>
          </View>
        );
      },
    )}
  </View>
  );
};

我尝试在 useEffect 中调用 refetch。当我从主页转到 whitelist 屏幕时它起作用了。但是,当我转到 add contact 屏幕、添加联系人然后导航回 whitelist.

时,它不起作用

也试过在白名单中使用这个:

useFocusEffect(
  React.useCallback(() => {
    console.log('refetching data');
    refetch();
  }, [])
);

每次我 return 到屏幕时,它都会给我 console.log('refetching data');,但是 ui 没有更新,所以我猜它实际上并没有重新获取。

您可以将挂钩 useUsersQuery 中的 fetchPolicy 设置为 cache-and-networknetwork-only,以便在访问该页面时更新用户列表页面。

cache-and-network

如果设置fetchPolicycache-and-network,apollo会先显示缓存数据,并在后台进行网络调用更新缓存。收到响应后,它将更新缓存,缓存又将重新呈现调用挂钩的组件。当组件重新渲染时,用户列表将被更新。

优点:未显示装载程序。给人一种“快速网站”的印象。

缺点:在更新缓存之前,可能会显示过时的数据(持续时间取决于查询解析的速度)。

这对于您不希望数据经常更改的页面很有用。如果adding/deleting用户不是经常操作,可以使用这个选项。

network-only

如果将fetchPolicy设置为network-only,apollo将始终进行网络调用以获取数据。它永远不会将数据存储在其缓存中。

优点:保证显示最新数据。

缺点:需要在进行网络调用时显示加载程序。给人一种“网站速度慢”的印象。

如果 adding/deleting 用户是您应用程序中的频繁操作,这是一个更好的选择,因为它确保始终显示最新数据。

您可以在官方文档中阅读有关获取策略的更多信息 https://www.apollographql.com/docs/react/api/react-apollo/#optionsfetchpolicy