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 获取它。
| 归档时间: |
|
| 查看次数: |
6036 次 |
| 最近记录: |