
處理 Authentication Credentials
讓 User 登入
- 在送出 button 地方,要取得值之後,做 callback function
- 在送出的 button 加上 onPress 來取得值
<Button onPress={this.onButtonPress.bind(this)}>
- 在 LoginForm.js 引入 firebase
import firebase from 'firebase';
- 新增 onButtonPress 的 callback function
1 | onButtonPress() { |
- 登入的三種模式
- 登入 => 成功
- 登入 => 失敗 => 創建帳號 => 成功
- 登入 => 失敗 => 創建帳號 => 失敗 => 出現錯誤
錯誤處理
- 點擊之後,用 catch 來處理失敗的 Promise,最後顯示出 error,error 要新增一個空白的 state 讓它去改變
1 | state = { email: '', password: '', error: '' }; |
- 把 Text 補回來,因為要讓 error 顯示
import { Text } from 'react-native';
- 新增 Text 區塊來顯示 error
1 | <Text style={styles.errorTextStyle}> |
- 新增 error Text 的 style 樣式
1 | const styles = { |
更多 Authentication Flow
- 在登入錯誤的密碼之後,如果又正確登入,要把錯誤訊息移除,所以要在 onPress 的 callback function 裡面把 state 設為預設空值
this.setState({error: ''});
- 為了要讓送出的時候,等候存取資料庫回覆前,要做一個旋轉圖示 Spinner 讓用戶知道在等候,新增 src/components/Spinner.js
1 | import React from 'react'; |
- 在 components/index.js 新增 component
export * from './Spinner';
建立一個活動 Spinner
- 新增 ActivityIndicator
import { View, ActivityIndicator } from 'react-native';
- 新增 spinner styles
1 | const styles = { |
- 將 style 加到 View,然後從上層元件取得 size props,最後用預設的方式,如果沒有 size 的 props,預設 large
1 | const Spinner = ({ size }) => { |
JSX 中有條件的渲染
- 預設不顯示 loading
state = { email: '', password: '', error: '', loading: false };
- 在 onButtonPress 的 callback function 加上 loading true,做法就是在點選登入時,清掉所有錯誤,然後顯示 Loading
this.setState({error: '', loading: true });
- 把 Spinner 的元件也 load 進來
import { Button, Card, CardSection, Input, Spinner } from "./common";
- 新增一個 renderButton 的 function,如果 this.state.loading === true,就 return spinner,如果不是,就 return 本來的 Button
1 | renderButton() { |
- 最後把本來送出 Button 的地方用 renderButton 的 function 取代
1 | <CardSection> |
清除表單 Spinner
- 建立 LoginSuccess function
1 | onLoginSuccess() { |
- 建立 LoginFail function
1 | onLoginFail() { |
- 送出表單時候,正確的話,執行 .then 裡面的 function,錯誤的話,執行 .catch 裡面的 function
1 | firebase.auth().signInWithEmailAndPassword(email, password) |
處理 Authentication 事件
- 新增一個 state 叫做 loggedIn,預設為未登入,然後在 componentWillMount 新增 onAuthStateChanged 的 function,如果是 user 就登入
1 | state = { loggedIn: false }; |
更多有條件的渲染
- 把 loggedIn 的 state 改成 null,然後新增 renderContent,登入時在讀取資料會先跑出 Spinner,成功的話就顯示登出的 Button,失敗的話就回到登入表單
1 | state = { loggedIn: null }; |
- 引入 Button 和 Spinner
import { Header, Button, Spinner } from './components/common';
- 修改 button 樣式,修改 src/component/common/Button.js
1 | import React from 'react'; |
讓 User 登出和結束
- 用 firebase 的語法讓用戶登出
1 | return ( |