Я пытаюсь передать реквизиты компоненту, который был обернут через вызов create...Navigator, т.е.
// Search.js
const Navigator = createMaterialTopTabNavigator({
Wines,
Stores,
Vineyards,
Restaurants
});
// Somewhere in render()...
<Navigator />
Я пытаюсь понять, как передать параметры компонентам Wines / Stores / и т. д. Из компонента Search (см. Выше). У меня есть читать документы, и, по-видимому, это можно легко сделать с помощью navigation.navigate, передав объект, но я не уверен, как это сделать с помощью этого конкретного метода. Может кто-нибудь помочь?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваш пример немного расплывчат, поэтому я пытаюсь объяснить как можно больше.
Есть 2 разных способа передать свойства на экраны (кроме реализации redux).
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' })
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.
screenProps был удален в реакции-навигации 5 github.com/react-navigation/rfcs/pull/5
На основе это вы можете передавать свойства на экраны также следующим образом:
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>
В аналогичном случае у меня это отлично сработало.
точный ответ
Вы пытаетесь сделать экран поиска как инстаграмм? SearchBar и вкладки ниже с различными решениями, и вы хотите передать критерии поиска на вкладки?