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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

React Native

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

Q&A

解決済

1回答

1318閲覧

[React Native] classコンポーネントからfinctionコンポーネントに書き換えたい

DaisukeMori

総合スコア225

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

React Native

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

0グッド

0クリップ

投稿2020/09/29 08:24

前提

  • React Native
  • Firebase authentication
  • Expo

要件

・Firebase authenticationを利用してFirebaseにユーザー登録
・classコンポーネントで書かれているサンプルをfunctionコンポーネントに書き換えたい(Hooks利用)

エラー

送信ボタンを押すとエラーになる
イメージ説明

おそらく9行目のhandleSubmitの関数がうまくいっていない

js

1 const handleSubmit = () => { 2 const { email, password } = state; 3 signup(email, password); 4 }

コード全文
コメントアウトしてる箇所はclassコンポーネントのサンプル(こっちは問題なく登録できます)

jsx

1import React, { useState } from 'react'; 2import { Text, View, Button, TextInput } from 'react-native'; 3import { signup } from './firebase'; 4 5const SignUp = () => { 6 const [email, setEmail] = useState(''); 7 const [password, setPassword] = useState(''); 8 9 // おそらくここが間違っているがどうすればいいかわからない 10 const handleSubmit = () => { 11 const { email, password } = state; 12 signup(email, password); 13 } 14 15 return ( 16 <> 17 <Text>SignUp</Text> 18 <View> 19 <Text>メールアドレス</Text> 20 <TextInput 21 onChangeText={(email) => setEmail({email})} 22 value={email} 23 placeholder="メールアドレスを入力してください" 24 /> 25 </View> 26 27 <View> 28 <Text>パスワード</Text> 29 <TextInput 30 onChangeText={(password) => setPassword({password})} 31 value={password} 32 placeholder="パスワードを入力してください" 33 /> 34 </View> 35 36 <View> 37 <Button 38 title="送信" 39 onPress={() => handleSubmit()} 40 /> 41 </View> 42 </> 43 ); 44} 45 46// class SignUp extends React.Component { 47// constructor(props) { 48// super(props); 49// this.state = { 50// email: '', 51// password: '', 52// }; 53// } 54 55// // ユーザー登録のメソッド 56// handleSubmit = () => { 57// const { email, password } = this.state; 58// signup(email, password); 59// } 60 61// render() { 62// return ( 63// <> 64// <View> 65// <Text>メールアドレス</Text> 66// <TextInput 67// onChangeText={(email) => this.setState({email})} 68// value={this.state.email} 69// placeholder="メールアドレスを入力してください" 70// /> 71// </View> 72 73// <View> 74// <Text>パスワード</Text> 75// <TextInput 76// onChangeText={(password) => this.setState({password})} 77// value={this.state.password} 78// placeholder="パスワードを入力してください" 79// /> 80// </View> 81 82// <View> 83// <Button 84// title="送信" 85// onPress={() => this.handleSubmit()} 86// /> 87// </View> 88// </> 89// ) 90// } 91// } 92 93export default SignUp;

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

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

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

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

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

guest

回答1

0

ベストアンサー

const { email, password } = state;

この一行が不要なのではないでしょうか?

jsx

1import React, { useState } from 'react'; 2import { Text, View, Button, TextInput } from 'react-native'; 3import { signup } from './firebase'; 4 5const SignUp = () => { 6 const [email, setEmail] = useState(''); 7 const [password, setPassword] = useState(''); 8 9 // おそらくここが間違っているがどうすればいいかわからない 10 const handleSubmit = () => { 11 //const { email, password } = state; 12 signup(email, password); 13 } 14 15 return ( 16 <> 17 <Text>SignUp</Text> 18 <View> 19 <Text>メールアドレス</Text> 20 <TextInput 21 onChangeText={(email) => setEmail({email})} 22 value={email} 23 placeholder="メールアドレスを入力してください" 24 /> 25 </View> 26 27 <View> 28 <Text>パスワード</Text> 29 <TextInput 30 onChangeText={(password) => setPassword({password})} 31 value={password} 32 placeholder="パスワードを入力してください" 33 /> 34 </View> 35 36 <View> 37 <Button 38 title="送信" 39 onPress={() => handleSubmit()} 40 /> 41 </View> 42 </> 43 ); 44}

投稿2020/09/29 08:28

nekoniki

総合スコア2409

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

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

DaisukeMori

2020/09/29 08:37

取った場合、フォームに入力すると「Failed proptype: Invalid prop `value` of type `object` supplied to `ForwardRef(TextInput)`,expected `string`.」というWarningが出て、さらにこの状態でボタンを押すと「Error: createUserWithEmailAndPassword failed: First argument "email" must be a valid string.」というエラーが出ます。
nekoniki

2020/09/29 08:42

すみません。 よくよく見てみたら、下記2行も修正が必要です。 onChangeText={(email) => setEmail({email})} onChangeText={(password) => setPassword({password})} setXXX()にはオブジェクト形式でなく、無名関数の引数そのままを渡してください。 例. onChangeText={(email) => setEmail(email)}
DaisukeMori

2020/09/29 08:46

ありがとうございます。例のようにしたら登録できました。 1つ質問なのですが、なぜclassコンポーネントではこの部分オブジェクトにして渡しているのに、functionコンポーネントではそのまま渡すのでしょうか?
nekoniki

2020/09/29 08:51

setState()は更新したいstateを丸ごと渡すから(※あくまで渡すイメージ)です。 逆にuseState()を使って独自で定義したsetXXXといった関数は、定義したstateの型をそのまま渡します。 今回は const [email, setEmail] = useState(''); のように文字列型でemailというstateを定義したのでsetEmail()に渡す引数もそのまま文字列型になります。 例えば、 const [hoge, setHoge] = useState({ fuga : "fugafuga" }); というようにオブジェクトで定義していたら、 setHoge({ fuga : "fugafugafugafuga" }) のようにオブジェクト型で渡します。
DaisukeMori

2020/09/29 08:56

わかりやすい説明ありがとうございました。 useStateで定義した型に合わせてなかったからエラーになったんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問