React Native: как передавать реквизиты в React Navigation

#javascript #reactjs #react-native #react-navigation

#javascript #reactjs #react-native #react-навигация

Вопрос:

В моем приложении React Native я использую react-navigation и у меня есть компонент класса, использующий react-native-webview :

 <WebView source={{ uri: this.props.url }} />
  

Это реализовано в StackNavigator следующим образом:

 <Stack.Navigator>
  <Stack.Screen name="Viewer" component={WebViewScreen} />
</Stack.Navigator>
  

Как я могу использовать контекст React для передачи url реквизита WebViewScreen компоненту?

Просматривая документы react-navigation, в нем упоминается альтернатива:

 <Stack.Screen name="Home">
  {props => <HomeScreen {...props} extraData={someData} />}
</Stack.Screen>
  

но с оговорками, поэтому я хотел бы попробовать использовать контекст. В идеале, я мог бы нажать на стек и указать WebViewScreen на любой URL:

 this.props.navigation.push('Viewer', {
    route: 'https://www.example.com'
})
  

Ответ №1:

Если вас интересует только изменение значения при навигации к экрану, на котором находится ваш Webview, вы можете просто получить доступ к данным, которые вы передали при навигации, через route prop:

 const route = this.props.route.params?.route ?? 'default url';

<WebView source={{ uri: route }} />
  

Источник:https://reactnavigation.org/docs/upgrading-from-4.x/#no-more-getparam

Комментарии:

1. Спасибо, это работает отлично! Это не использует контекст, но на самом деле, вероятно, это правильный путь.

Ответ №2:

Добавьте поставщика и получите значение в вашем компоненте.

 const MyContext = React.createContext();

<MyContext.Provider value={{url: '/somethig'}}>
  <Stack.Navigator>
    <Stack.Screen name="Viewer" component={WebViewScreen} />
  </Stack.Navigator>
</MyContext.Provider>
  

В вашем HomeScreen используйте хуки, чтобы получить ваше значение:

 const value = useContext(MyContext);
  

Комментарии:

1. На самом деле я переписал его из функционального компонента в компонент класса, думая, что мне нужно для доступа к реквизиту, состоянию и жизненному циклу и т.д… Я вижу, что есть обходные пути, но у меня также возникли проблемы с контекстом, всегда говорящим, что MyContext не определено внутри компонента.

2. вы должны импортировать свой MyContext , чтобы иметь возможность использовать его внутри другого компонента