質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

4200閲覧

React Navigationを利用した際のstate値の初期化の方法

tomaa

総合スコア84

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/07/31 16:06

編集2020/07/31 16:08

前提・実現したいこと

React Nativeでアプリ開発をしています。

期待する動作

①:textInputでテキストを入力し、その内容をstateで保持
②:react navigationで画面を遷移し、その際①で保持したstateを遷移先に渡す
③:遷移先の画面で渡されたsatateを表示
④:react navigationで表示されるTopBarで遷移前の画面に戻る(添付画面参照)
⑤:textInput最初に入力されたテキストの値が表示されず初期化される


上記の動作になるように、試していますが、⑤のときにstateの値が初期化されず、遷移先で表示される値がそのまま表示されてしまいます。

解決の方法をご存知の方おりましたら、ご教授いただけないでしょうか?

イメージ説明

対象のコード

遷移元のコード

JS

1import React from "react"; 2import { View, Text } from "react-native"; 3import { TextInput } from "react-native-gesture-handler"; 4 5class AreaSetScreen extends React.Component { 6 state = { 7 title: "初期値", 8 }; 9 10 handleToTestHome(title) { 11 this.props.navigation.navigate("TestHome", { title: title }); 12 } 13 14 render() { 15 return ( 16 <View> 17 <Text>テスト入力</Text> 18 <TextInput 19 value={this.state.title} 20 onChangeText={(text) => { 21 this.setState({ title: text }); 22 }} 23 onEndEditing={() => { 24 this.handleToTestHome(this.state.title); 25 }} 26 /> 27 </View> 28 ); 29 } 30} 31 32export default AreaSetScreen;

遷移先のコード

import React from "react"; import { Text, View } from "react-native"; class TestHome extends React.Component { state = { title: "", }; componentDidMount() { const { params } = this.props.navigation.state; this.setState({ title: params.title }); } render() { return ( <View> <Text>{this.state.title}</Text> </View> ); } } export default TestHome;

試したこと

下記の方法を試しましたが、うまくいきませんでした。
コンストラクタの利用

constructor(props) { super(props); this.state = { title: "初期値", }; }

componentDidMountの利用

componentDidMount() { this.setState({ title: "初期値", });

}

補足情報(FW/ツールのバージョンなど)

node : 12.18.3
react native : 4.10.1
expo : 3.22.3
React Navigation: 4.3.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらくStackNavigatorを使用されていると思いますのでそれ前提で説明しますと
StackNavigatorは画面遷移しても前の画面がmountされたままになるので、backで戻ってもrerenderがかかりません。

代わりに、今見ている画面がその画面になった時(=forcusされたとき)にdidFocusイベントが走るので、それを使用します。

javascript

1componentDidMount() { 2 3 this.props.navigation.addListener( 4 'didFocus', 5 payload => { 6 this.forceUpdate(); 7 } 8 ); 9 10}

参考Doc: React Navigation公式

投稿2020/08/03 03:58

編集2020/08/05 00:03
Hogeike

総合スコア293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomaa

2020/08/03 09:02

ご回答いただきありがとうございます。 ご指摘のとおり、StackNavigatorを利用しています。 紹介していただいたコードで試したのですが、対象の画面に戻っても初期化されませんでした。 確認したいのですが、payloadの所は変更する必要がありますでしょうか?
Hogeike

2020/08/04 07:31 編集

すみません、didFocusでした。payloadは勝手に入ってくる値なので変更は不要のはずです。 また、versionによってはdidFocusがうまく動かないバグがあるそうなので、 react-navigation-stack は v2.3.8 以降で試してください。 公式ドキュメント https://reactnavigation.org/docs/4.x/function-after-focusing-screen/#triggering-an-action-with-a-didfocus-event-listener にdidFocusについて説明が載っています。 import React, { Component } from 'react'; import { View } from 'react-native'; import { withNavigation } from 'react-navigation'; class TabScreen extends Component { componentDidMount() { const { navigation } = this.props; this.focusListener = navigation.addListener('didFocus', () => { this.forceUpdate(); }); } componentWillUnmount() { this.focusListener.remove(); } render() { return <View />; } } export default withNavigation(TabScreen);
tomaa

2020/08/04 08:11

ありがとうございます。 ご指摘のとおり、didFoucusに変更すると初期化する事ができました。 componentDidMount() { this.props.navigation.addListener("didFocus", (payload) => { this.setState({ title: "初期値" }); this.forceUpdate(); }); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問