javascript - 在每个组件上调用的用户 api
问题描述
你好,我使用 laravel 有后端 REST API 和 React 作为前端。
我的问题是在每条路线上多次调用用户 api。
如果我去,
/category
我收到了对用户 API 的请求,因为我需要有用户信息,比如是否是管理员;用户名;...,这是正常的,因为我在 App.js 上调用了这个 api 我试图在 上做一个条件语句componentDidMount
来知道我是否已经有用户数据处于我的状态,但是 React 给我返回infinite loop
了一个this.setState({user: data})
所以我的问题是我可以一次调用 api 吗?或者我是否需要使用 Redux 存储一次用户数据,并使用这些数据?
我的 App.js:
import React from 'react';
import axios from 'axios';
import {BrowserRouter as Router, Switch, Route, Redirect} from 'react-router-dom';
import Login from "./pages/Login";
import Home from "./pages/Home";
import Profile from "./pages/Profile";
import Register from "./pages/Register";
import Header from "./components/Header";
import Administration from "./pages/Administration";
import './assets/main.css'
import './App.css'
import PrivateRoute from "./components/PrivateRoute";
import Category from "./pages/Category";
import Product from "./pages/Product";
import Order from "./pages/Order";
import User from "./pages/User";
import Support from "./pages/Support";
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
redirectToHome: false,
isLog: false,
isAdmin: false,
user: null,
}
}
componentDidMount(){
if (localStorage.getItem('token')){
axios.post('auth/me')
.then((res) => {
this.setUser(res.data)
})
.catch((err) => {
localStorage.removeItem('token')
})
}
}
setUser = (user) => {
this.setState({user: user})
}
render() {
if (this.state.redirectToHome){
return <Redirect to={'/'} from={'/logout'} />
}
return (
<Router>
<div>
<Header user={this.state.user} setUser={this.setUser} />
</div>
<div className="mx-10">
<Switch>
<Route exact path="/" component={() => <Home user={this.state.user} />} />
<Route exact path="/login" component={() => <Login setUser={this.setUser} />} />
<Route exact path="/profile" component={() => <Profile user={this.state.user}/>} />
<Route exact path="/register" component={Register} />
<PrivateRoute exact path="/admin" component={() => <Administration user={this.state.user} />} />
<PrivateRoute exact path="/admin/categories" component={() => <Category />} />
<PrivateRoute exact path="/admin/products" component={() => <Product />} />
<PrivateRoute exact path="/admin/orders" component={() => <Order />} />
<PrivateRoute exact path="/admin/users" component={() => <User />} />
<PrivateRoute exact path="/admin/supports" component={() => <Support />} />
</Switch>
</div>
</Router>
);
}
};
解决方案
要只调用一次用户获取代码,您需要一个管理用户状态的地方,以检查它之前是否被调用过。你有两个不错的选择。您可以使用 Redux 并在全局状态下缓存用户值,也可以使用 Context API 并在传递状态下缓存。根据您拥有的路线数量,我真诚地建议您使用 redux,因为它(在我看来)更适合大型应用程序。上下文可能会变得混乱,因为它没有严格区分动作、减速器和当前状态。
推荐阅读
- c++builder - 如何在 Rad Studio (C++ Builder) 10.3 中更改编译器
- json - Golang 解组数组给出运行时错误:索引超出范围
- r - 根据 r 中的条件,用一组新的观察值替换特定的观察值
- sas - 如何将一个表的值作为 SAS Base 中另一个表的名称?
- angular - 在 FE 中使用 BE 提供的 Enum 是可能的,如何?
- sql - 找一个吃过苹果没吃过香蕉的人
- javascript - 在多轨设置中使用waveform.js 库在音频中寻找位置的问题
- python - pyqt在读取文件时没有响应
- html-email - 在 macOS/OSX 上查看 Mutt 邮件中的内联图像
- angular - 手动更新 Angular 版本