Redux 状态持久化与数据库

IT技术 reactjs flux reactjs-flux redux
2021-05-05 07:57:51

这里的讨论看来,Redux 减速器的状态应该保存在数据库中。

在这种情况下,用户身份验证之类的工作是如何工作的?

不会为每个创建和编辑的用户(及其应用程序状态)创建一个新的状态对象来替换数据库中的先前状态吗?

在前端使用所有这些数据并不断更新数据库中的状态会提高性能吗?

编辑:我创建了一个示例 Redux 身份验证项目,它也恰好是通用 Redux 的示例,以及使用 Redux、Socket.io 和 RethinkDB 进行实时更新。

2个回答

从这里的讨论看来,Redux 减速器的状态应该保存在数据库中。

无论是否保持状态,它可能根本不是 Redux 关心的问题。这更多取决于应用程序逻辑。

如果应用程序中发生某些事情,例如数据上传到服务器,显然您需要保存状态(或状态的一部分到服务器)。

由于网络调用是异步的,而 Redux 是同步的——你需要引入额外的中间件,如redux-thunkredux-promise

作为注册示例,您可能需要这些操作,

export function creatingAccount() {
  return { type: 'CREATING_ACCOUNT' };
}

export function accountCreated(account) {
  return { type: 'ACCOUNT_CREATED', payload: account };
}

export function accountCreatingFailed(error) {
  return { type: 'ACCOUNT_CREATING_FAILED', payload: error };
}

export function createAccount(data, redirectParam) {
  return (dispatch) => {
    dispatch(creatingAccount());

    const url = config.apiUrl + '/auth/signup';

    fetch(url).post({ body: data })
      .then(account => {
        dispatch(accountCreated(account));
      })
      .catch(err => {
        dispatch(accountCreatingFailed(err));
      });
  };
}

状态的某些部分,例如授权后的用户对象,可能会被存储localStore并在下一次应用程序运行时重新水合。

这些都是合理的担忧。使用localStorage在前端持久化状态可能是一个更好的策略。您可以使用中间件来实现这一点,例如:

import {createStore, compose, applyMiddleware} from 'redux';

const localStorageMiddleware = ({getState}) => {
  return (next) => (action) => {
    const result = next(action);
    localStorage.setItem('applicationState', JSON.stringify(
      getState()
    ));
    return result;
  };
};

const store = compose(
  applyMiddleware(
    localStorageMiddleware
  )
)(createStore)(
  reducer,
  JSON.parse(localStorage.getItem('applicationState'))
)

如果您担心敌人访问用户的笔记本电脑并从中窃取凭据,您可以在用户离开页面时将状态持久化到后端(Navigator.sendBeacon()此处可能会有所帮助)并将其存储在会话中。