Как передать реквизиты компоненту внутри навигатора React Navigation?

Я пытаюсь передать реквизиты компоненту, который был обернут через вызов create...Navigator, т.е.

// Search.js
const Navigator = createMaterialTopTabNavigator({
    Wines,
    Stores,
    Vineyards,
    Restaurants
});

// Somewhere in render()...
<Navigator />

Я пытаюсь понять, как передать параметры компонентам Wines / Stores / и т. д. Из компонента Search (см. Выше). У меня есть читать документы, и, по-видимому, это можно легко сделать с помощью navigation.navigate, передав объект, но я не уверен, как это сделать с помощью этого конкретного метода. Может кто-нибудь помочь?

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

bennygenel 20.05.2018 10:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
19
1
19 810
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш пример немного расплывчат, поэтому я пытаюсь объяснить как можно больше.

Есть 2 разных способа передать свойства на экраны (кроме реализации redux).

1) действие navigate

Вы можете передать параметры на экран с возможностью навигации, передав аргумент params на экран.

navigation.navigate({routeName, params, action, key}) OR navigation.navigate(routeName, params, action)

routeName - A destination routeName that has been registered somewhere in the app's router

params - Params to merge into the destination route

action - (advanced) The sub-action to run in the child router, if the screen is a navigator. See Actions Doc for a full list of supported actions.

key - Optional identifier of what route to navigate to. Navigate back to this route, if it already exists

Образец

this.props.navigate('Profile', { name: 'Brent' })

2) screenProps

Вы можете передать глобальный параметр навигации, который может быть доступен на каждом экране для этой навигации.

screenProps - Pass down extra options to child screens

Образец

const SomeStack = createStackNavigator({
  // config
});

<SomeStack
  screenProps = {/* this prop will get passed to the screen components as this.props.screenProps */}
/>

Я создал небольшой образец приложения, которого, как я предполагаю, вы пытаетесь достичь.

const Tab = ({name, searchValue}) => (
  <View style = {styles.tabContainer}>
    <Text>{name}</Text>
    <Text>{`Searching: ${searchValue || '...'}`}</Text>
  </View>
);

const Wines = (props) => (<Tab name = "Wines Page" searchValue = {props.screenProps.searchValue} />);
const Stores = (props) => (<Tab name = "Stores Page" searchValue = {props.screenProps.searchValue} />);
const Vineyards = (props) => (<Tab name = "Vineyards Page" searchValue = {props.screenProps.searchValue} />);
const Restaurants = (props) => (<Tab name = "Restaurants Page" searchValue = {props.screenProps.searchValue} />);

const Navigator = createMaterialTopTabNavigator({
    Wines,
    Stores,
    Vineyards,
    Restaurants
});

export default class App extends Component {
  state = {
    text: ''
  }
  changeText = (text) => {
    this.setState({text})
  }
  clearText = () => {
    this.setState({text: ''})
  }
  render() {
    return (
      <View style = {styles.container}>
        <SearchBar
          lightTheme
          value = {this.state.text}
          onChangeText = {this.changeText}
          onClearText = {this.clearText}
          placeholder='Type Here...' />
        <Navigator screenProps = {{searchValue: this.state.text}} />
      </View>
    );
  }
}

Альтернативой является использование Redux для обхода ужасной архитектуры React-навигации. Или используйте Wix React-native-navigation, которая намного лучше, имеет passProps.

Oliver Dixon 02.10.2018 12:38

screenProps был удален в реакции-навигации 5 github.com/react-navigation/rfcs/pull/5

Hylle 16.10.2019 15:06

На основе это вы можете передавать свойства на экраны также следующим образом:

return (
    <NavigationContainer>
      <Tab.Navigator>
            <Tab.Screen name = "Home">
                {(props) => <HomeScreen  {...props} text = {homeText} />}
            </Tab.Screen>
           <Tab.Screen name = "Settings" component = {SettingsScreen} />
      </Tab.Navigator>
    </NavigationContainer>
  );

Отличие от следующего метода из документации

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

это:

            <Tab.Screen name = "Home">
                {(props) => <HomeScreen  {...props} text = {homeText} />}
            </Tab.Screen>

В аналогичном случае у меня это отлично сработало.

точный ответ

Yusuf 23.10.2020 12:41

Другие вопросы по теме