Отправка реквизита компоненту @react-navigation/drawer

Я пытаюсь отправить поддержку компоненту внутри Drawer.Screen. Я использую @react-navigation/drawer. Наконец-то я отправляю реквизиты в контейнер навигации, но не могу отправить реквизиты в component = {homeStackScreen} в Drawer.Screen. Как я могу отправить реквизиты в класс homeStackScreen. И это не написано в документации. нужна помощь пожалуйста.

const Drawer = createDrawerNavigator();

<NavigationContainer>
            <Drawer.Navigator initialRouteName = "Home">
                {props.leftMenu.map((x,index) =>                 
                <Drawer.Screen name = {x.name} key = {index} component = {homeStackScreen} />
                )}
            </Drawer.Navigator>
</NavigationContainer>

🤔 А знаете ли вы, что...
JavaScript можно использовать для манипуляции DOM (Document Object Model), что позволяет изменять содержимое и структуру веб-страницы.


4
5 777
4

Ответы:

Решено

Вот как вы можете легко передать свойства компонентам из Drawer.Screen, заменив простой компонент из component = {} и заменив его анонимной функцией, которая вернет наш компонент туда, куда нам нужно перейти.

Обычно мы объявляем экран следующим образом:

<Drawer.Screen name = "Home" component = {HomeScreen}/>

чтобы передать свойства компоненту, мы просто сделаем следующую модификацию с помощью анонимной функции и передаем свойства.

Так:

<Drawer.Screen name = "Home" component = {() => <HomeScreen data = {"your_data"}/>}/>

Простой пример:


    return (
        <NavigationContainer>
            <Drawer.Navigator initialRouteName = "Home">
                <Drawer.Screen name = "Home" component = {() => <HomeScreen data = {"your_data"}/>}/>
                <Drawer.Screen name = "Notifications" component = {NotificationsScreen} />
            </Drawer.Navigator>
        </NavigationContainer>
    );

}}

//.............

function HomeScreen({data}) {
    return (
            <View>
            <Text>{data}</Text>
            </View>
    );
}

В вашем случае это должно выглядеть примерно так, как показано ниже:

const Drawer = createDrawerNavigator();

<NavigationContainer>
            <Drawer.Navigator initialRouteName = "Home">
                {props.leftMenu.map((x,index) =>                 
                <Drawer.Screen name = {x.name} key = {index} component = {() => <homeStackScreen data = {x}/>} />
                )}
            </Drawer.Navigator>
</NavigationContainer>

Аналогичный вопрос для большего: Передача массива состояний из класса в функцию с помощью чистого реагирования


В Drawer.Screen есть реквизит с именем initialParams, указанный в документах навигации React 5.x, для передачи реквизита компоненту. Если вы переходите на новый экран, переданные параметры неглубоко объединяются с исходными параметрами.

Проверьте здесь: https://reactnavigation.org/docs/5.x/screen#initialparams

Используйте это так:

<Drawer.Screen name = "Home" component = {HomeScreen} initialParams = {{data:"your props"}}/>

Я использую этот aproche для передачи реквизита «шрифт»:

в App.js

 <NavigationContainer>
    <Drawer.Navigator>
      <Drawer.Screen
        name = "Home"
        component = {HomeScreen}
        initialParams = {{ font: TajawalFontFamily }}
      />
    </Drawer.Navigator>
  </NavigationContainer>

В HomeScreen.js

export default function HomeScreen({ route }) {
const font = route.params.font;
...

Принятый ответ правильный, но он приведет к следующему предупреждению: передача встроенной функции приведет к потере состояния компонента при повторном рендеринге. Это был бы лучший способ передать свойства компоненту:

<Drawer.Screen
    name = {'Home'}
>
    {(props) => (
        <HomeScreen
            yourProps = {"yourProps"}
        />
    )}
</Drawer.Screen>