ReactNative開發入門教學(4)-利用AsyncStorage保存登入資料

很多軟體都會有登入一次之後,接下來進入軟體都不需要再打帳號密碼的功能。

這個我很好奇是怎麼做的,上網爬文也大多是別人寫好的套件。也不知其所然。

後來爬到了一個ReactNative組件叫做 AsyncStorage 。是可以將資料存放在手機

的某個部分,我們再利用KEY去把它取出來。所以我決定利用這個方法來寫看看。

先來寫個簡單的表格吧!

import React, { Component } from 'react';
import {
  Text,
  TextInput,
  View,
  Button,
} from 'react-native';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      login_id: '',
      login_pw: '',
    };
  }
  _login_event() {
    alert(this.state.login_id + ' ' + this.state.login_pw);
  }
  render() {
    return(
      <View>
        <Text>帳號:</Text>
        <TextInput 
          onChangeText={(login_id) => this.setState({login_id})}
          value={this.state.login_id}
          />
        <Text>密碼:</Text>
        <TextInput 
          onChangeText={(login_pw) => this.setState({login_pw})}
          value={this.state.login_pw}
          />
        <Button title="登入" onPress={this._login_event.bind(this)}/>
      </View>
    );
  }
}

export default App;

執行之後如果跳出剛剛打的帳號密碼就表示簡單的表格製作成功啦!接著我們要把

帳號密碼存在手機的儲存空間內,所以我們要把AsyncStorage給import進來

import React, { Component } from 'react';
import {
  Text,
  TextInput,
  View,
  AsyncStorage,
  Button,
} from 'react-native';

然後來對登入事件作處裡

_login_event() {
  AsyncStorage.multiSet([
    ['token', 'abcdefghijklmn'],
    ['login_id', this.state.login_id],
    ['login_pw', this.state.login_pw],
  ]);
  alert('登入成功');
}

那個token是我拿來當作key使用的,這樣才能夠找到我相對應的資料用的!

接著我們加上一個檢查是否有輸入過帳號密碼的代碼

_login_event() {
  AsyncStorage.multiGet(['token', 'login_id', 'login_pw']).then((data)=>{
    token = data[0][1] || null;
    if (token == 'abcdefghijklmn') {
      alert('已登入! 帳號是' + data[1][1]);
    } else {
      AsyncStorage.multiSet([
        ['token', 'abcdefghijklmn'],
        ['login_id', this.state.login_id],
        ['login_pw', this.state.login_pw],
      ]);
      alert('登入成功');
    }
  });
}

最後我們加上一個登出事件

_logout_event() {
  AsyncStorage.multiRemove(['token', 'login_id', 'login_pw']);
  this.setState({
    login_id: '',
    login_pw: '',
  });
  alert('登出了!');
}

這樣就完成一個簡單的登入資訊保存的功能了,不過把使用者的資訊完整地保存在

手機上面我覺得是一件危險的事情。所以我覺得只要保存某個關鍵資料。每次開啟

軟體的時候都進行驗證比較好。下面是完整的代碼

import React, { Component } from 'react';
import {
  Text,
  TextInput,
  View,
  AsyncStorage,
  Button,
} from 'react-native';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      login_id: '',
      login_pw: '',
    };
  }
  _login_event() {
    AsyncStorage.multiGet(['token', 'login_id', 'login_pw']).then((data)=>{
      token = data[0][1] || null;
      if (token == 'abcdefghijklmn') {
        alert('已登入! 帳號是' + data[1][1]);
      } else {
        AsyncStorage.multiSet([
          ['token', 'abcdefghijklmn'],
          ['login_id', this.state.login_id],
          ['login_pw', this.state.login_pw],
        ]);
        alert('登入成功');
      }
    });
  }
  _logout_event() {
    AsyncStorage.multiRemove(['token', 'login_id', 'login_pw']);
    this.setState({
      login_id: '',
      login_pw: '',
    });
    alert('登出了!');
  }
  render() {
    return(
      <View>
        <Text>帳號:</Text>
        <TextInput 
          onChangeText={(login_id) => this.setState({login_id})}
          value={this.state.login_id}
          />
        <Text>密碼:</Text>
        <TextInput 
          onChangeText={(login_pw) => this.setState({login_pw})}
          value={this.state.login_pw}
          />
        <Button title="登入" onPress={this._login_event.bind(this)}/>
        <Button title="登出" onPress={this._logout_event.bind(this)}/>
      </View>
    );
  }
}

export default App;