使用反应导航时存在类型问题,当使用Stack.Navigation或Stack.Group来自createNativeStackNavigator
该问题表示JSX.element消息末尾的类型不匹配更具体: Type '{}' is not assignable to type 'ReactNode'
整个消息:
'Stack.Navigator' cannot be used as a JSX component.
Its element type 'ReactElement<any, any> | Component<Omit<DefaultRouterOptions<string> & { id?: string | undefined; children: ReactNode; screenListeners?: Partial<...> | ... 1 more ... | undefined; screenOptions?: NativeStackNavigationOptions | ... 1 more ... | undefined; defaultScreenOptions?: NativeStackNavigationOptions | ... 1 mo...' is not a valid JSX element.
Type 'Component<Omit<DefaultRouterOptions<string> & { id?: string | undefined; children: …Run Code Online (Sandbox Code Playgroud) typescript react-native react-navigation expo react-navigation-v6
导航类型定义如下,当我从 例如 导航AOne到时BTwo,控制台id:99 日志props.route.params显示正确的信息。但props.route.params.id抛出类型错误
类型错误:未定义不是对象(正在评估“props.route.params.id”)
// navigation related imports in all components
import {BottomTabScreenProps} from '@react-navigation/bottom-tabs';
import {CompositeScreenProps, NavigatorScreenParams} from '@react-navigation/core';
import {StackScreenProps} from '@react-navigation/stack';
// type defenitions
export type StackOneParams = {
AOne:undefined,
BOne: undefined,
// some other screens
};
export type StackTwoParams = {
ATwo: undefined;
BTwo:{id:number};
// some other screens
};
export type TabParams = {
StackOne: NavigatorScreenParams<StackOneParams>;
StackTwo: NavigatorScreenParams<StackTwoParams>;
// ... some other stacks each represent a …Run Code Online (Sandbox Code Playgroud) react-native react-navigation react-navigation-stack react-navigation-bottom-tab react-navigation-v6
我有一个关于模态堆栈内的卡片堆栈的问题,如附图所示。
所以,只是重复我想做的事情。我有一个打开绿色模式的screen选项。presentation: 'modal'
在那个绿色模式中,我有一个按钮应该调用一个导航调用,该调用应该显示screen带有选项的蓝色presentation: 'card'以及返回到绿屏的能力。
我已经用WIX的 React-native-navigation 库做了类似的事情,但我不知道是否可以用 React-navigation 来完成。
任何帮助深表感谢。
干杯
我正在尝试将旧的 React navigation v4 迁移到 v6(超过 100 条路线)。但我面临着如何找到最佳结构来分割单独文件/组件中的屏幕组。
我已经尝试过这样做,以移出模态:
const ModalGroup = () => (
<Stack.Group screenOptions={{ presentation: "modal" }}>
<Stack.Screen name="ModalA" component={ModalAScreen} />
<Stack.Screen name="ModalB" component={ModalBScreen} />
</Stack.Group>
);
export const RootNavigator = () => (
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<ModalGroup />
</Stack.Navigator>
);
Run Code Online (Sandbox Code Playgroud)
但在运行时不允许出现此错误:
错误:导航器只能包含“Screen”、“Group”或“React.Fragment”作为其直接子级(找到“ModalGroup”)。要在导航器中渲染此组件,请将其在 'component' 属性中传递给 'Screen'。
但这是有效的(但对我来说看起来很难看):
export const RootNavigator = () => (
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
{ModalGroup()}
</Stack.Navigator>
);
Run Code Online (Sandbox Code Playgroud)
那么,在单独的文件中构建/组织屏幕组以避免创建包含所有配置和导入的巨大根导航器的最佳方法是什么?
我有一个屏幕,可以调用 api 来获取一些数据,然后显示
我看到的一个问题是,当我离开屏幕(我使用的是react-navigation 6.x)然后返回时,它useEffect()不会被调用
从我到目前为止所读到的内容来看,这取决于userId不改变的价值(我想我需要围绕这个问题做更多阅读useEffect()才能更好地理解,也许有人会帮助解决这个问题)
import React, {useState, useEffect, useContext} from 'react';
import AppContext from '../../components/AppContext.js';
export const CreateNewEvent = () => {
const globalContext = useContext(AppContext);
const userId = globalContext.userInfo.id;
useEffect(() => {
const body = JSON.stringify({userId});
fetch(eventTypesUrl, {
method: 'POST',
headers: {'Content-Type': 'application/json', Accept: 'application/json'},
body: body,
})
.then(response => response.json())
.then(json => setEventTypeData(json))
.catch(error => console.error(error))
.finally(() => setLoading(false));
}, [userId]);
}
Run Code Online (Sandbox Code Playgroud)
所以在我的场景中,我位于屏幕 1(在这里我可以创建一个事件,该事件发出请求以获取所有事件类型并将它们加载到选择菜单中)
当我导航到屏幕 2(以创建事件类型)然后返回屏幕 1 时,useEffect()不会调用挂钩,导致无法看到我刚刚创建的事件类型(希望这是有意义的)。还请注意,任何先前在屏幕 …
我对 React-navigation v6 的模式呈现有疑问,无法呈现其中包含 ScrollView 的模式。实际上,如果我启用手势向下滑动模态,如果内部有 ScrollView 并且我只能在标题上向下滑动,则它不起作用。
我需要当到达 ScrollView 的顶部时,必须开始关闭动画手势。这是预期的行为:
这是 RootNavigation 中使用的代码:
<RootStack.Group screenOptions={{ presentation: 'modal', cardOverlayEnabled: true, ...TransitionPresets.ModalPresentationIOS }}>
<RootStack.Screen
component={ModalPage}
name="ModalPage"
options={ModalPageNavOptions}
/>
</RootStack.Group>
Run Code Online (Sandbox Code Playgroud)
这是ModalPage.js的渲染
<ScrollView nestedScrollEnabled>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
<Text>TEST TEXT</Text>
</ScrollView>
Run Code Online (Sandbox Code Playgroud)
PS:我正在使用expo
react-native react-native-navigation react-navigation react-navigation-v6
在react-navigation v6的升级指南中:
它指出你可以使用
declare global {
namespace ReactNavigation {
interface RootParamList extends RootStackParamList {}
}
}
Run Code Online (Sandbox Code Playgroud)
在代码中的某处为所有钩子等全局设置 RootParamList。
但是,当我尝试包含代码片段并设置我的参数列表时,我得到的只是
Duplicate identifier 'RootParamList'.ts(2300)
types.d.ts(5, 19): 'RootParamList' was also declared here
Run Code Online (Sandbox Code Playgroud)
显然,该类型已经声明,我正在尝试覆盖它,但这似乎不可能。
有什么想法如何覆盖而不导致类型错误?
如何在react-navigation 6...中的特定屏幕中隐藏选项卡栏而不更改导航结构,因为它是此处文档中唯一可用的选项
我将应用程序更新为 React Navigation 6。在所有屏幕中,我自定义了headerBackImage,并添加了一些headerRight文本。在React Navigation 5中,如果headerTitle太长,它会被直接截断,并在标题末尾添加...,如下所示:
但在 React navigation 6 中,这个功能看起来发生了变化。我添加了一些背景颜色来向您展示标题的剪切:
我看到了这个主题:React Native Navigation Header title too long, 最终溢出,但也许 V6 中添加了新的 props。
这是我的屏幕:
<ProfileStack.Screen
options={({ navigation }: ScreenProps) => ({
headerTitle: 'My header title is not truncated why ?',
headerTitleStyle: {
backgroundColor: EColors.rouge,
},
headerBackImage: () => (
<BackButton />
),
headerTitleAlign: 'center',
headerBackTitle: ' ',
headerRight: () => (
<Text
onPress={() => navigation.navigate('toOtherScreen')}
style={{ marginRight: 20, backgroundColor: EColors.vert }}
>
Infos …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个看起来像这样的屏幕。有两个菜单,一个是由createDrawerNavigatorreact-navigation(左上角)创建的汉堡菜单。另一个菜单是由创建的底部按钮createBottomTabNavigator。
是的,有两个菜单并不是一个好的用户界面选择,但这是我公司的选择。此外,这些菜单至少共享一个条目(主页)。
这个 stackoverflow非常接近期待的结果,但我不知道如何显示汉堡菜单,而不是像帖子那样显示简单的视图。
我尝试了多种层次结构,但没有成功地实现目标。
所以我没有主意,决定自己完成底部菜单。它似乎运行良好,但某些路线未定义,因此我无法导航到它们(例如屏幕上的购物车和搜索)
看来反应导航使用其组件来定义路线。
如何将路线添加到导航系统以便能够导航到它们?
我试过 :
指定一个初始状态<NavigationContainer>但它似乎不起作用。
创建了一个自定义路由器来覆盖该方法,但之后getInitialState我不知道如何使用我的自定义路由器!
任何帮助将不胜感激
编辑:
导航代码
// src/menu/burger/drawer.js
import { createDrawerNavigator } from '@react-navigation/drawer';
import { useTranslation } from 'react-i18next';
import Ionicons from '@expo/vector-icons/Ionicons';
import React from 'react';
import Account from '../../pages/account';
import Brands from '../../pages/brands';
import Cart from '../../pages/cart';
import Homepage from '../../pages/homepage';
import {
ACCOUNT,
BRANDS,
CART,
HOMEPAGE,
} from '../../pages/pageIdentifiers';
const Drawer = …Run Code Online (Sandbox Code Playgroud) react-native ×7
expo ×1
javascript ×1
navigation ×1
react-navigation-bottom-tab ×1
typescript ×1