j'essaie de transmettre des accessoires à stacknavigator, voici mon code
const MainCart = StackNavigator({
Cart: {
screen: CartScreen
},
Checkout: {
screen: COScreen
}
/* how to pass 'myprops' in this area? */
});
export default class ReactNative_RefreshControl extends Component {
constructor(props) {
super(props)
}
render() {
console.log('ReactNative_RefreshControl this.props.myparam : ' + this.props.myparam);
return <MainCart myprops = {
this.props.myparam
}
/>;
//https://reactnavigation.org/docs/navigators/stack#Navigator-Props
}
}
comment passer 'myprops' sur la zone StackNavigator?
merci
Si vous voulez passer des accessoires à cet endroit, vous devez l'utiliser comme ceci.
const MainCart = StackNavigator({
Cart: {
screen: props=> <CartScreen {...props} screenProps={other required prop}>
},
Checkout: {
screen: COScreen
}
Si vous souhaitez transmettre des accessoires lors de la navigation dans la solution de Sagar Chavada est utile
faites comme ceci dans votre événement click:
onPressed(movie){
this.props.navigation.navigate(
'screen',
{movie: movie}
});
}
<TouchableHighlight onPress={() => this.onPressed(movie)}>
et dans un autre écran, vous pouvez définir comme ceci:
export default class NavigateTo extends Component {
constructor(props){
super(props);
this.state = {
name: this.props.navigation.state.params.movie.title,
year: this.props.navigation.state.params.movie.year
}
}
movie est un objet json contenant le titre, l'année, la date de sortie, les résultats, les affiches, etc.
celui-ci est pour l'ancienne navigation:
onPressed(movie){
this.props.navigator.Push({
id:'page2',
movie: movie
});
}
et en deuxième écran:
this.state = {
name: this.props.movie.title,
email: this.props.movie.year
}
maintenant vous pouvez voir la difference
si cela ne fonctionne pas, essayez comme ça
<Button title="Second" onPress={() => navigate("MainCart",{},
{
type: "Navigate",
routeName: "Checkout",
params: {name:"Jo"}
}
)} />
vérifiez ceci pour la navigation de pile imbriquée https://github.com/react-community/react-navigation/issues/143 }
Dans mon cas, je souhaitais transmettre une fonction pour afficher toast avec conte pour chaque composant. Je l'ai finalement réalisé en utilisant screenProps et en surchargeant chaque composant:
export default class App extends React.Component {
constructor(props) {
super(props);
}
showToast = (text) => {
this.refs.toast.show(text, DURATION.FOREVER);
};
render() {
return <Provider store={store}>
<View style={styles.wrapper}>[
<MyAppNavigator showToast={this.showToast}/>,
<Toast ref="toast"/>
]
</View>
</Provider>;
}
}
const styles = StyleSheet.create({
wrapper: {
flex: 1
}
});
const createNavigator = (screenProps) => {
const toastWrapper = (Component, props, screenProps) => {
return <Component {...props} screenProps={screenProps}/>
};
return createStackNavigator({
login: {
screen: props => toastWrapper(LoginView, props, screenProps),
navigationOptions: () => {
return {header: null}
}
},
map: {
screen: props => toastWrapper(FieldMap, props, screenProps),
navigationOptions: () => ({
title: 'Map'
})
}
})
};
const MyAppNavigator = (props) => {
const AppNavigator = createNavigator(props);
return <AppNavigator/>
};
Puis de mon composant:
this.props.screenProps.showToast("Logging you in");
Je dois envoyer les accessoires du composant principal à StackNavigator, puis le transmettre à son composant. J'ai utilisé screenProps pour le faire.
Votre fonction principale devrait ressembler à ceci:
render() {
return <MainCart screenProps={this.props.params}
/>;
}
Après cela, dans l'écran du navigateur, vous pouvez y accéder comme ceci:
this.props.screenProps.params
Ma réponse précédente est valable si vous essayez d'accéder au niveau de l'application à partir d'une vue de navigation. Toutefois, si vous souhaitez simplement modifier l'en-tête ou quelque chose du genre, vous n'avez pas à passer les paramètres à votre navigateur.
Un peu de magie React:
export default class ReactNative_RefreshControl extends Component {
constructor(props) {
super(props)
}
//this function will override the navigation options specified in MainCart component
static navigationOptions = ({navigation}) => {
return {
headerTitle: navigation.state.params.name,
headerRight: <Button onPress={navigation.state.params.onClick}/>
};
};
componentDidMount() {
this.props.navigation.setParams({
name: "name",
onClick: this.onClick
});
}
...