在一个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>
);
}
这种方法被认为是反模式的吗?
1条答案
按热度按时间pexxcrt21#
正如您在评论中提到的,您的目标是减少选项卡组件的显示时间。因此,您的解决方案不是反模式的,但也不是非常不言自明的。你可以使用Redux Toolkit Prefetch来实现与你的解决方案相同的目标,并且对于其他开发人员来说更容易理解。