私はネイティブに反応するのが初めてで、次のことにこだわっています。
以下のコードを使用してナビゲーションを実行しています(アラートビューボタンをクリックしたとき)。
const {navigation} = this.props.navigation;
…
.
.
{ text: 'Done', onPress:() => {
navigate.Push(HomeScreen);}
React nativeで別のページにデータを渡すにはどうすればよいですか?パラメーターをグローバルに宣言して、単に割り当てることができますか?
これを実行する正しい方法は何ですか?
react-navigation
のページ間でデータを渡すことは、かなり簡単です。ドキュメントで明確に説明されています here
完全を期すために、1つの画面から別の画面に移動して画面間で値を渡すことができる小さなアプリを作成しましょう。この例では文字列を渡すだけですが、数値、オブジェクト、配列を渡すことは可能です。
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
および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'
}
});
ここには4つのファイルがあります。 App.js
をインポートするMainNavigation.js
。 MainNavigation.js
は、Screen1.js
とScreen2.js
の2つの画面でStackNavigator
を設定します。 Screen1
は、StackNavigator
の初期画面として設定されています。
を使用してScreen1
からScreen2
に移動できます
this.props.navigation.navigate('Screen2');
を使用してScreen1
からScreen2
に戻ることができます
this.props.navigation.goBack();
したがって、Screen1
のコードは
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>
)
}
}
そして、Screen2
のコードは次のようになります。
export default class Screen extends React.Component {
render() {
return (
<View style={styles.container}>
<Button title={'Go back'} onPress={() => this.props.navigation.goBack()} />
</View>
)
}
}
これで、Screen1
とScreen2
の間を移動できます
Screen1
からScreen2
に値を送信していますScreen1
とScreen2
の間で値を送信するには、2つの手順が必要です。最初に送信する必要があり、次にキャプチャする必要があります。
値を2番目のパラメーターとして渡すことで送信できます。テキスト値がオブジェクトにどのように含まれているかに注目してください。
this.props.navigation.navigate('Screen2', {text: 'Hello from Screen 1' });
そして、以下を実行することでScreen2
にそれをキャプチャできます。getParams
の最初の値はkey
で、2番目の値はデフォルト値です。
const text = this.props.navigation.getParams('text','nothing sent');
したがって、Screen1
は次のようになります。
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>
)
}
}
そして、Screen2
のコードは次のようになります。
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
からScreen1
に値を送信するScreen2
からScreen1
に値を送信する最も簡単な方法は、Screen2
の状態を更新するScreen1
からScreen1
に関数を渡すことです。送信したい値で
したがって、Screen1
をこのように更新できます。最初に状態の初期値を設定します。次に、状態を更新する関数を作成します。次に、その関数をパラメーターとして渡します。 Text
コンポーネントのScreen2
から取得した値を表示します。
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>
)
}
}
先ほどreceivedValue
を渡したのと同じ方法で関数text
を渡しています。
ここで、Screen2
の値をキャプチャする必要があります。これは、以前と同様の方法で行います。デフォルトを設定することを忘れないで、getParam
を使用して値を取得します。次に、戻るボタンを押すと、最初にreceivedValue
関数を呼び出すように更新し、送信するテキストを渡しますバック。
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
を使用する代わりgetParam
メソッドを使用せずに、値に直接アクセスすることもできます。その場合、デフォルト値を設定するオプションはありません。しかし、それはできます。
Screen2
では、次のことができます。
const text = this.props.navigation.state.params.text;
const receivedValue = this.props.navigation.state.params.receivedValue;
Screen1
からScreen2
)react-navigation
を使用すると、ライフサイクルイベントを使用して値をキャプチャできます。これを行うにはいくつかの方法があります。 NavigationEvents
を使用するか、componentDidMount
に設定されたリスナーを使用できます
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>
)
}
}
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>
)
}
}
上記の例では、画面から画面に値を渡しました。画面上にコンポーネントがあり、そこから移動したい場合があります。コンポーネントがナビゲーターの一部である画面内で使用されている限り、それを行うことができます。
最初のテンプレートから始めて、2つのボタンを作成する場合。 1つは機能コンポーネントで、もう1つは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'
}
});
コンポーネントのタイプに関係なく、ナビゲーションは小道具であることに注意してください。コンポーネントにナビゲーションを渡す必要があります。そうしないと機能しません。
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'
}
});
StackNavigatorに含まれているScreen1.js
には、this.props.navigation
へのアクセス権があります。これをコンポーネントに小道具として渡すことができます。コンポーネントでそれを使用する限り、コンポーネント独自の機能を使用してナビゲートできる必要があります。
<MyButton
title={'Press my button'}
navigation={this.props.navigation} // pass the navigation here
value={'this is a string passed using MyButton'}
/>
1)ホーム画面:-
初期化:-
constructor(props) {
super(props);
this.navigate = this.props.navigation.navigate; }
送信:-
this.navigate("DetailScreen", {
name: "Detail Screen",
about:"This is Details Screen Page"
});
2)詳細画面:-
初期化:-
constructor(props) {
super(props);
this.params = this.props.navigation.state.params;
}
データの取得:-
console.log(this.params.name);
console.log(this.params.about);
const {navigate} = this.props.navigation;
…
.
.
{ text: 'Done', onPress:() => {
navigate('homeScreen',...params);}
次のようなパラメータを取得できます
const {params} = this.props.navigation.state
以下のように react-navigation で簡単にパラメーターを送受信できます
パラメータを送信:
{
text: 'Done',
onPress: () => {
this.props.navigation.navigate(
HomeScreen,
{param1: 'value1', param2: 'value2'}
);
}
}
HomeScreen
のparamsを取得:
const { navigation } = this.props;
var param1 = navigation.getParam('param1', 'NO-VALUE');
var param2 = navigation.getParam('param2', 'NO-VALUE');
'NO-VALUE'
は、必要なパラメーターがない場合のデフォルト値です
私はあなたが反応ナビゲーションを使用していると仮定しています。したがって、反応ナビゲーションでは、データを2つの部分に渡すことができます。
Paramsをnavigation.navigate関数の2番目のパラメーターとしてオブジェクトに入れて、ルートに渡します。
this.props.navigation.navigate('RouteName', { /* params go here */ })
画面コンポーネントのパラメーターを読み取ります。
this.props.navigation.getParam(paramName, someDefaultValue)
アラートボタン
<Button
title="Alert View"
onPress={() => {
this.props.navigation.navigate('alerts', {
itemId: 86,
otherParam: 'anything you want here',
});
}}
/>
画面:
const itemId = navigation.getParam('itemId', 'NO-ID');
const otherParam = navigation.getParam('otherParam', 'some default value')