刷新页面后如何正确保存Redux状态?

rgd*_*dzv 7 javascript reactjs redux apollo-client

请求代码:

export class LogInContainer extends Component {

  submit = (values) => {
    const { mutate } = this.props;
    mutate({
      variables: {
        email: values.email,
        password: values.password,
      },
    })
      .then((res) => {
        const token = res.data.login.token;
        localStorage.setItem("token", token);
        const user = res.data.login.user;
        const { logIn } = this.props;
        logIn(user);
        this.props.history.push("/pages/processes");
      })
      .catch((error) => {
        const errorMessage = error.message;
        const { logInError } = this.props;
        logInError(errorMessage);
      });
  };

  render() {
    const { error, logInCleanError } = this.props;
    return (
      <LogIn
        onSubmit={this.submit}
        errorMessage={error}
        logInCleanError={logInCleanError}
      />
    );
  }
}

export default compose(
  graphql(LOG_IN),
  withRouter,
  connect(({ errors }) => ({ error: errors.log_in_error }), {
    logInError,
    logInCleanError,
    logIn,
  })
)(LogInContainer);
Run Code Online (Sandbox Code Playgroud)

减速器代码:

const initialState = {
  user: {
    id: "",
    firstName: "",
    secondName: "",
    email: "",
    isAuth: localStorage.getItem('token') ? true : false,
  },
};

export const userReducer = (state = initialState, { type, user }) => {
  switch (type) {
    case LOG_IN:
      return {
        ...state,
        user: {
          id: user.id,
          firstName: user.firstName,
          secondName: user.secondName,
          email: user.email,
          isAuth: true,
        },
      };
    case CURRENT_USER:
      return {
        ...state,
        user: {
          id: user.id,
          firstName: user.firstName,
          secondName: user.secondName,
          email: user.email,
          isAuth: true,
        },
      };
    case LOG_OUT:
      return {
        ...state,
        user: {
          id: "",
          firstName: "",
          secondName: "",
          email: "",
          isAuth: false,
        },
      };
    default:
      return state;
  }
};
Run Code Online (Sandbox Code Playgroud)

我保存 JWT 并将其放入每个请求的标头中,例如:

const client = new ApolloClient({
  uri: "http://localhost:4000/api",
  request: (operation) => {
    const token = localStorage.getItem("token");
    operation.setContext({
      headers: {
        authorization: token ? `Bearer ${token}` : "",
      },
    });
  },
}); 
Run Code Online (Sandbox Code Playgroud)

我会像这样保护我的路由器:

const App = ({ authorized }) => {
  return (
    <Switch>
      {!authorized ? (
        <Route path="/auth">
          <Auth />
        </Route>
      ) : (
        <Route path="/pages">
          <Pages />
        </Route>
      )}
      <Redirect from="/" to="/auth/login" />
    </Switch>
  );
};

export default App;
Run Code Online (Sandbox Code Playgroud)

刷新登录页面后,我不会丢失 JWT 并保留在系统中,但我会丢失用户的名字、名字等的 redux 状态,我需要在页面上显示这些状态。那么在这种情况下,没有像 redux-persist 或其他插件这样的插件来保存 redux 状态的正确方法是什么?

小智 0

使用本地存储:

localStorage.setItem('token', token);
Run Code Online (Sandbox Code Playgroud)

并在加载应用程序时检查是否设置了令牌,如果是,则从 localStorage 获取信息

localStorage.getItem('token');
Run Code Online (Sandbox Code Playgroud)

您还可以保存用户信息:

localStorage.setItem('user', JSON.stringify(userInfo));
Run Code Online (Sandbox Code Playgroud)

并使用 JSON.parse 获取它。