javascript - 如何在 Redux 中使用 React Native AsyncStorage?

标签 javascript reactjs react-native redux

我已经进行了登录和注销操作以及 userReducer。如何将 AsyncStorage 与 Redux 集成?我使用 Redux Thunk 作为中间件。

我能够使用内部状态变量实现登录和注销,但我无法理解如何将其分解为操作和缩减器以及如何使用 AsyncStorage 来存储 accessToken

原始代码:

_onLogin = () => {
    auth0.webAuth
      .authorize({
        scope: 'openid profile',
        audience: 'https://' + credentials.domain + '/userinfo'
      })
      .then(credentials => {
        this.setState({ accessToken: credentials.accessToken });
      })
      .catch(error => console.log(error));
  };

  _onLogout = () => {
    if (Platform.OS === 'android') {
      this.setState({ accessToken: null });
    } else {
      auth0.webAuth
        .clearSession({})
        .then(success => {
          this.setState({ accessToken: null });
        })
        .catch(error => console.log(error));
    }
  };

loginAction.js:

   import { LOGIN_USER } from './types';
import Auth0 from 'react-native-auth0';

var credentials = require('./auth0-credentials');
const auth0 = new Auth0(credentials);

export const loginUser = () => dispatch => {
    auth0.webAuth
    .authorize({
      scope: 'openid profile',
      audience: 'https://' + credentials.domain + '/userinfo'
    })
    .then(credentials =>
        dispatch({
            type: LOGIN_USER,
            payload: credentials.accessToken
        })
    )
    .catch(error => console.log(error));
}

logoutAction.js:

       import { LOGOUT_USER } from './types';
import Auth0 from 'react-native-auth0';

var credentials = require('./auth0-credentials');
const auth0 = new Auth0(credentials);

export const logoutUser = () => dispatch => {

        auth0.webAuth
          .clearSession({})
          .then(success => 
                dispatch({
                    type: LOGOUT_USER,
                    payload: null
                })
          )
          .catch(error => console.log(error));
}

userReducer.js:

  import { LOGIN_USER, LOGOUT_USER } from '../actions/types';

const initialState = {
    accessToken: null
}

export default function (state = initialState, action) {
    switch (action.type) {

        case LOGIN_USER:

            _storeData = async () => {
                try {
                    await AsyncStorage.setItem('accessToken', action.payload);
                } catch (error) {
                    console.log(error)
                }
            }

            return {
               ...state,
               accessToken:action.payload
            };

        case LOGOUT_USER:

            _removeData = async (accessToken) => {
                try {
                    await AsyncStorage.removeItem(accessToken);
                } catch (error) {
                    console.log(error)
                }
            }    

            return {
                ...state,
                accessToken:action.payload
            };

        default:
            return state;
    }
}

我是 Redux 的新手,所以我尝试将原始代码转换为操作和缩减器,但我不确定我是否在 userReducer.js 中正确实现了 AsyncStorage?

最佳答案

为了持久化 redux state 我推荐你 redux-persist .

安装:

npm i -S redux-persist

用法:

首先配置redux store

// configureStore.js

import { createStore } from 'redux'
import { persistStore, persistReducer } from 'redux-persist'
import storage from 'redux-persist/lib/storage' // defaults to localStorage for web and AsyncStorage for react-native

import rootReducer from './reducers'

const persistConfig = {
  key: 'root',
  storage,
}

const persistedReducer = persistReducer(persistConfig, rootReducer)

export default () => {
  let store = createStore(persistedReducer)
  let persistor = persistStore(store)
  return { store, persistor }
}

然后,用 PersistGate 包裹你的根组件

import { PersistGate } from 'redux-persist/integration/react'

// ... normal setup, create store and persistor, import components etc.

const App = () => {
  return (
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        <RootComponent />
      </PersistGate>
    </Provider>
  );
};

关于javascript - 如何在 Redux 中使用 React Native AsyncStorage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52352094/

相关文章:

JavaScript setInterval 函数仅淡入文本一次

javascript - 使用 React Hook Form 不会显示验证错误

javascript - 如何显示作为 props 传递给功能组件的数组元素?

javascript - 为什么 react-native-gifted-chat 不能从 firebase 时间戳正确显示时间?

react-native - fetch() 和 FormData() 定义在哪里?

javascript - 如果 X 与 Y 的 href 匹配,则添加类 'active' - jQuery

javascript - html 加载页面后隐藏字段的值丢失

javascript - 为什么在node.js fs模块中删除文件被命名为 "unlink"?

reactjs - NPM 7 工作区安装多个版本的 react

android - 在 React Native 中按下按钮时一个接一个地附加 TextInput 组件