#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
, чтобы иметь возможность использовать его внутри другого компонента