Im nouveau pour réagir natif et je suis coincé à suivre.
J'effectue la navigation (lorsque vous cliquez sur le bouton d'affichage des alertes) en utilisant le code ci-dessous.
const {navigation} = this.props.navigation;
…
.
.
{ text: 'Done', onPress:() => {
navigate.Push(HomeScreen);}
Comment puis-je transmettre des données à une autre page en React native? Puis-je déclarer le paramètre global et simplement l'affecter?
Quelle serait la bonne façon de procéder et comment procéder?
Passage de données entre les pages dans react-navigation
est assez simple. C'est clairement expliqué dans la documentation ici
Pour être complet, créons une petite application qui nous permet de naviguer d'un écran à un autre en passant des valeurs entre les écrans. Nous allons simplement passer des chaînes dans cet exemple mais il serait possible de passer des nombres, des objets et des tableaux.
App.js
import React, {Component} from 'react';
import AppContainer from './MainNavigation';
export default class App extends React.Component {
render() {
return (
<AppContainer />
)
}
}
MainNavigation.js
import Screen1 from './Screen1';
import Screen2 from './Screen2';
import { createStackNavigator, createAppContainer } from 'react-navigation';
const screens = {
Screen1: {
screen: Screen1
},
Screen2: {
screen: Screen2
}
}
const config = {
headerMode: 'none',
initialRouteName: 'Screen1'
}
const MainNavigator = createStackNavigator(screens,config);
export default createAppContainer(MainNavigator);
Screen1.js
et Screen2.js
import React, {Component} from 'react';
import { View, StyleSheet, Text, Button } from 'react-native';
export default class Screen extends React.Component {
render() {
return (
<View style={styles.container}>
</View>
)
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'white'
}
});
Ici, nous avons 4 fichiers. Le App.js
dont nous importerons le MainNavigation.js
. Le MainNavigation.js
configure un StackNavigator
avec deux écrans, Screen1.js
et Screen2.js
. Screen1
a été défini comme écran initial pour notre StackNavigator
.
Nous pouvons naviguer à partir de Screen1
à Screen2
en utilisant
this.props.navigation.navigate('Screen2');
et nous pouvons revenir à Screen1
de Screen2
en utilisant
this.props.navigation.goBack();
Donc, codez dans Screen1
devient
export default class Screen extends React.Component {
render() {
return (
<View style={styles.container}>
<Button title={'Go to screen 2'} onPress={() => this.props.navigation.navigate('Screen2')} />
</View>
)
}
}
Et codez dans Screen2
devient:
export default class Screen extends React.Component {
render() {
return (
<View style={styles.container}>
<Button title={'Go back'} onPress={() => this.props.navigation.goBack()} />
</View>
)
}
}
Maintenant, nous pouvons naviguer entre Screen1
et Screen2
Screen1
à Screen2
Pour envoyer une valeur entre Screen1
et Screen2
, deux étapes sont impliquées. Nous devons d'abord l'envoyer, ensuite nous devons le capturer.
Nous pouvons envoyer une valeur en la passant comme second paramètre. Remarquez comment la valeur du texte est contenue dans un objet.
this.props.navigation.navigate('Screen2', {text: 'Hello from Screen 1' });
Et nous pouvons le capturer dans Screen2
en procédant comme suit, la première valeur dans getParams
est la key
la deuxième valeur est la valeur par défaut.
const text = this.props.navigation.getParams('text','nothing sent');
Donc Screen1
devient maintenant
export default class Screen extends React.Component {
render() {
return (
<View style={styles.container}>
<Button
title={'Go to screen 2'}
onPress={() => this.props.navigation.navigate('Screen2', {
text: 'Hello from screen 1'
})} />
</View>
)
}
}
Et codez dans Screen2
devient:
export default class Screen extends React.Component {
render() {
const text = this.props.navigation.getParam('text', 'nothing sent')
return (
<View style={styles.container}>
<Text>{text}</Text>
<Button
title={'Go back'}
onPress={() => this.props.navigation.goBack()} />
</View>
)
}
}
Screen2
retour à Screen1
Le moyen le plus simple que j'ai découvert pour envoyer une valeur à partir de Screen2
à Screen1
consiste à passer une fonction à Screen2
de Screen1
qui mettra à jour l'état dans Screen1
avec la valeur que vous souhaitez envoyer
Nous pouvons donc mettre à jour Screen1
pour ressembler à ceci. D'abord, nous définissons une valeur initiale dans l'état. Ensuite, nous créons une fonction qui mettra à jour l'état. Ensuite, nous passons cette fonction comme paramètre. Nous afficherons la valeur capturée à partir de Screen2
dans un composant Text
.
export default class Screen1 extends React.Component {
state = {
value: ''
}
receivedValue = (value) => {
this.setState({value})
}
render() {
return (
<View style={styles.container}>
<Button
title={'Go to screen 2'}
onPress={() => this.props.navigation.navigate('Screen2', {
text: 'Hello from Screen 1',
receivedValue: this.receivedValue }
)} />
<Text>{this.state.value}</Text>
</View>
)
}
}
Notez que nous transmettons la fonction receivedValue
de la même manière que nous avons passé la text
plus tôt.
Maintenant, nous devons capturer la valeur dans Screen2
et nous le faisons de manière très similaire à ce que nous avons fait précédemment. Nous utilisons getParam
pour obtenir la valeur, sans oublier de définir notre valeur par défaut. Ensuite, lorsque nous appuyons sur notre bouton Revenir en arrière , nous le mettons à jour pour appeler la fonction receivedValue
en premier, en passant le texte que nous voulons envoyer retour.
export default class Screen2 extends React.Component {
render () {
const text = this.props.navigation.getParam('text', 'nothing sent');
const receivedValue = this.props.navigation.getParam('receivedValue', () => {});
return (
<View style={styles.container}>
<Button
title={'Go back'}
onPress={() => {
receivedValue('Hello from screen 2')
this.props.navigation.goBack()
}} />
<Text>{text}</Text>
</View>
);
}
}
getParam
Il est possible de ne pas utiliser la méthode getParam
et d'accéder directement aux valeurs. Si nous le faisions, nous n'aurions pas la possibilité de définir une valeur par défaut. Mais cela peut être fait.
Dans Screen2
nous aurions pu faire ce qui suit:
const text = this.props.navigation.state.params.text;
const receivedValue = this.props.navigation.state.params.receivedValue;
Screen1
à Screen2
)react-navigation
vous permet de capturer des valeurs à l'aide des événements du cycle de vie. Il y a plusieurs façons de procéder. Nous pourrions utiliser NavigationEvents
ou nous pourrions utiliser des écouteurs définis dans le componentDidMount
Voici comment le configurer à l'aide de NavigationEvents
import React, {Component} from 'react';
import { View, StyleSheet, Text } from 'react-native';
import { NavigationEvents } from 'react-navigation'; // you must import this
export default class Screen2 extends React.Component {
state = {
text: 'nothing passed'
}
willFocusAction = (payload) => {
let params = payload.state.params;
if (params && params.value) {
this.setState({value: params.value});
}
}
render() {
return (
<View style={styles.container}>
<NavigationEvents
onWillFocus={this.willFocusAction}
/>
<Text>Screen 2</Text>
<Text>{this.state.text}</Text>
</View>
)
}
}
Voici comment le faire en utilisant des écouteurs dans le componentDidMount
export default class Screen2 extends React.Component {
componentDidMount () {
// we add the listener here
this.willFocusSubscription = this.props.navigation.addListener('willFocus', this.willFocusAction);
}
componentWillUmount () {
// we remove the listener here
this.willFocusSubscription.remove()
}
state = {
text: 'nothing passed'
}
willFocusAction = (payload) => {
let params = payload.state.params;
if (params && params.value) {
this.setState({value: params.value});
}
}
render() {
return (
<View style={styles.container}>
<Text>Screen 2</Text>
<Text>{this.state.text}</Text>
</View>
)
}
}
Dans les exemples ci-dessus, nous avons transmis des valeurs d'écran à écran. Parfois, nous avons un composant à l'écran et nous souhaitons peut-être naviguer à partir de cela. Tant que le composant est utilisé dans un écran qui fait partie d'un navigateur, nous pouvons le faire.
Si nous partons de notre modèle initial et construisons deux boutons. L'un sera un composant fonctionnel, l'autre un composant React.
MyButton.js
// this is a functional component
import React, {Component} from 'react';
import { View, StyleSheet, Text, TouchableOpacity } from 'react-native';
export const MyButton = ({navigation, value, title}) => {
return (
<TouchableOpacity onPress={() => navigation.navigate('Screen2', { value })}>
<View style={styles.buttonStyle}>
<Text>{title}</Text>
</View>
</TouchableOpacity>
)
}
const styles = StyleSheet.create({
buttonStyle: {
width: 200,
height: 60,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'red'
}
});
MyOtherButton.js
// this is a React component
import React, {Component} from 'react';
import { View, StyleSheet, Text, TouchableOpacity } from 'react-native';
export default class MyOtherButton extends React.Component {
render() {
const { navigation, value, title } = this.props;
return (
<TouchableOpacity onPress={() => navigation.navigate('Screen2', { value })}>
<View style={styles.buttonStyle}>
<Text>{title}</Text>
</View>
</TouchableOpacity>
)
}
}
const styles = StyleSheet.create({
buttonStyle: {
width: 200,
height: 60,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'yellow'
}
});
Quel que soit le type de composant, notez que la navigation est un accessoire. Nous devons passer la navigation au composant sinon il ne fonctionnera pas.
Screen1.js
import React, {Component} from 'react';
import { View, StyleSheet, Text, Button } from 'react-native';
import { MyButton } from './MyButton';
import MyOtherButton from './MyOtherButton';
export default class Screen1 extends React.Component {
render() {
return (
<View style={styles.container}>
<Text>Screen 1</Text>
<MyButton
title={'Press my button'}
navigation={this.props.navigation}
value={'this is a string passed using MyButton'}
/>
<MyOtherButton
title={'Press my other button'}
navigation={this.props.navigation}
value={'this is a string passed using MyOtherButton'}
/>
</View>
)
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'white'
}
});
Remarquez dans Screen1.js
comme il est contenu dans un StackNavigator, il aura accès à this.props.navigation
. Nous pouvons transmettre cela à notre composant comme accessoire. Tant que nous l'utilisons dans notre composant, nous devrions pouvoir naviguer en utilisant les fonctionnalités propres aux composants.
<MyButton
title={'Press my button'}
navigation={this.props.navigation} // pass the navigation here
value={'this is a string passed using MyButton'}
/>
1) Sur l'écran d'accueil: -
Initialiser: -
constructor(props) {
super(props);
this.navigate = this.props.navigation.navigate; }
Envoyer: -
this.navigate("DetailScreen", {
name: "Detail Screen",
about:"This is Details Screen Page"
});
2) Sur l'écran de détail: -
Initialiser: -
constructor(props) {
super(props);
this.params = this.props.navigation.state.params;
}
Données retrive: -
console.log(this.params.name);
console.log(this.params.about);
const {navigate} = this.props.navigation;
…
.
.
{ text: 'Done', onPress:() => {
navigate('homeScreen',...params);}
Vous pouvez obtenir ces paramètres comme
const {params} = this.props.navigation.state
Vous pouvez facilement envoyer et recevoir vos paramètres avec react-navigation comme ci-dessous
Envoyer les paramètres :
{
text: 'Done',
onPress: () => {
this.props.navigation.navigate(
HomeScreen,
{param1: 'value1', param2: 'value2'}
);
}
}
Récupère les paramètres dans HomeScreen
:
const { navigation } = this.props;
var param1 = navigation.getParam('param1', 'NO-VALUE');
var param2 = navigation.getParam('param2', 'NO-VALUE');
les 'NO-VALUE'
est la valeur par défaut, s'il n'y a pas de paramètre souhaité
Je suppose que vous utilisez React-Navigation. Ainsi, dans React-Navigation, nous pouvons transmettre des données en deux parties:
Passez des paramètres à un itinéraire en les plaçant dans un objet comme deuxième paramètre de la fonction navigation.navigate:
this.props.navigation.navigate('RouteName', { /* params go here */ })
Lisez les paramètres de votre composant d'écran:
this.props.navigation.getParam(paramName, someDefaultValue)
Bouton d'alerte
<Button
title="Alert View"
onPress={() => {
this.props.navigation.navigate('alerts', {
itemId: 86,
otherParam: 'anything you want here',
});
}}
/>
Écran:
const itemId = navigation.getParam('itemId', 'NO-ID');
const otherParam = navigation.getParam('otherParam', 'some default value')