redux 使用RTK查询挂钩预取数据

ifsvaxew  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(131)

在一个react native项目中,我使用React Navigation中的Bottom Tab Navigation。
在导航堆栈的文件中,我直接调用RTK查询钩子,而不使用它的任何返回值,如data,isLoading,isUnitialized等。这样做的原因是,我可以预取数据需要在2卸载屏幕,事件和收藏夹,请参阅下面的代码。

// MainNavigator.tsx
export default function MainNavigator() {
  // Pre-Fetch Events
  useGetLatestEventsQuery();

  return (
    <Tabs.Navigator
      initialRouteName="Tickets"
      tabBar={(props) => (
        <BottomTabBar
        />
      )}

    {/* Events */}
      <Tabs.Screen
        name="Events"
        component={EventsNavigator}
      />

     {/* Tickets */}
     <Tabs.Screen name="Tickets" component={TicketsNavigator} />

    {/* Favorites */}
    <Tabs.Screen name="Favorites" component={FavoritesNavigator} />

...

在门票屏幕中,我使用正确的钩子来获取门票,因为它将是导航上的第一个屏幕,所以没有必要提前获取门票数据。因此,在事件和收藏夹屏幕上,我基本上再次使用useGetLatestEventsQuery钩子,但我首先跳过了查询,这样我就可以使用refetch方法在刷新屏幕时再次强制查询。

export default function Events() {
  const events = useSelector((state: RootState) => state.event.events);

  const [skipQuery, setSkipQuery] = useState(true);
  const { isFetching, refetch, isUninitialized } = useGetLatestEventsQuery(
    undefined,
    { skip: skipQuery }
  );

  const handleRefresh = () => {
    isUninitialized ? setSkipQuery(true) : refetch();
  };

  return (
    <Layout
      refreshing={isFetching}
      onRefresh={handleRefresh}
      emptyScreen={events?.length === 0}
      loading={events === null || isFetching}
    >
      <EventsCarousel events={events ?? []} />
    </Layout>
  );
}

这种方法被认为是反模式的吗?

pexxcrt2

pexxcrt21#

正如您在评论中提到的,您的目标是减少选项卡组件的显示时间。因此,您的解决方案不是反模式的,但也不是非常不言自明的。你可以使用Redux Toolkit Prefetch来实现与你的解决方案相同的目标,并且对于其他开发人员来说更容易理解。

相关问题