Comment gérez-vous les cas lorsque vous disposez, par exemple, d'un composant de formulaire et que vous devez soumettre une partie de l'état du composant à l'aide du bouton de la barre de navigation?
const navBtn = (iconName, onPress) => (
<TouchableOpacity
onPress={onPress}
style={styles.iconWrapper}
>
<Icon name={iconName} size={cs.iconSize} style={styles.icon} />
</TouchableOpacity>
)
class ComponentName extends Component {
static navigationOptions = {
header: (props) => ({
tintColor: 'white',
style: {
backgroundColor: cs.primaryColor
},
left: navBtn('clear', () => props.goBack()),
right: navBtn('done', () => this.submitForm()), // error: this.submitForm is not a function
}),
title: 'Form',
}
constructor(props) {
super(props);
this.state = {
formText: ''
};
}
submitForm() {
this.props.submitFormAction(this.state.formText)
}
render() {
return (
<View>
...form goes here
</View>
);
}
}
Juste pour faire suite à l'excellente réponse de @ val, voici comment j'ai structuré mon composant afin que tous les paramètres soient définis dans le componentWillMount
. Je trouve cela plus simple et c'est un modèle facile à suivre pour tous les autres écrans.
static navigationOptions = ({navigation, screenProps}) => {
const params = navigation.state.params || {};
return {
title: params.title,
headerLeft: params.headerLeft,
headerRight: params.headerRight,
}
}
_setNavigationParams() {
let title = 'Form';
let headerLeft = <Button onPress={this._clearForm.bind(this)} />;
let headerRight = <Button onPress={this._submitForm.bind(this)} />;
this.props.navigation.setParams({
title,
headerLeft,
headerRight,
});
}
componentWillMount() {
this._setNavigationParams();
}
_clearForm() {
// Clear form code...
}
_submitForm() {
// Submit form code...
}
Envoyez une fonction liée avec setParams
, vous aurez alors accès au state
du composant dans cette fonction.
Exemple:
constructor(props) {
super(props);
this._handleButtonNext = this._handleButtonNext.bind(this);
this.state = { selectedIndex: 0 }
}
componentDidMount() {
this.props.navigation.setParams({
handleButtonNext: this._handleButtonNext,
});
}
_handleButtonNext() {
let action = NavigationActions.setParams({
params: { selectedImage: images[this.state.selectedIndex] }
});
this.props.navigation.dispatch(action);
}
Vous pouvez maintenant avoir un gestionnaire de boutons lié au state
du composant.
static navigationOptions = ({ navigation }) => {
const { state, setParams, navigate } = navigation;
const params = state.params || {};
return {
headerTitleStyle: { alignSelf: 'center' },
title: 'Select An Icon',
headerRight: <Button title='Next' onPress={params.handleButtonNext} />
}
}
Sur votre componentDidMount, vous pouvez utiliser
this.navigation.setParams({
myTitle: this.props.myTitle
})
Ensuite, passez une fonction à votre en-tête sur les accessoires statiques. Cette fonction a accès aux paramètres que vous avez définis auparavant
Merci à rafaelcorreiapoli