React + Redux 在 App.js 渲染时分派 3 次动作
React + Redux dispatching 3 times an action at render of App.js
这段代码我遇到了一些问题,我正在使用 Redux 进行状态管理。我期望的行为是在用户登录后使用调度程序(带有评论的那个)(所以只有一次!)但是在 App.js 的每次渲染中它被调用三次
该操作包含一个 API 调用,所以我收到了三个 API 调用!我不知道如何让它只触发一次。知道这个问题吗?
import React from 'react';
import {
Route, Switch, Redirect,
} from 'react-router-dom';
import { useSelector, useDispatch } from 'react-redux';
import Login from './components/auth/login';
import Dashboard from './components/Dashboard';
import * as actions from './store/actions/indexActions';
export default function App() {
const isAuthenticated = useSelector((state) => state.auth.isAuthenticated);
const jwt = useSelector((state) => state?.auth?.user?.token);
const dispatch = useDispatch();
if (isAuthenticated) {
dispatch(actions.getRole(jwt)); //THIS DISPATCHER IS CALLED 3 TIMES
}
return(
<Provider store={store}>
<BrowserRouter basename="/">
<Switch>
<Route path="/login" exact>
{isAuthenticated ? <Redirect to="/" /> : <Login />}
</Route>
<Route exact path="/">
{isAuthenticated ? <Dashboard /> : <Redirect to="/login" />}
</Route>
</Switch>
</BrowserRouter>
</Provider>
)
}
您当前在每次组件呈现时分派它。
如果您希望仅在用户登录时调用它,您需要将调用包装在 useEffect 中,如下所示:
useEffect(() =>
if (isAuthenticated) {
dispatch(actions.getRole(jwt));
}
}, [isAuthenticated]);
现在,仅当 isAuthenticated 发生变化时,useEffect 中的代码才会运行。
这段代码我遇到了一些问题,我正在使用 Redux 进行状态管理。我期望的行为是在用户登录后使用调度程序(带有评论的那个)(所以只有一次!)但是在 App.js 的每次渲染中它被调用三次 该操作包含一个 API 调用,所以我收到了三个 API 调用!我不知道如何让它只触发一次。知道这个问题吗?
import React from 'react';
import {
Route, Switch, Redirect,
} from 'react-router-dom';
import { useSelector, useDispatch } from 'react-redux';
import Login from './components/auth/login';
import Dashboard from './components/Dashboard';
import * as actions from './store/actions/indexActions';
export default function App() {
const isAuthenticated = useSelector((state) => state.auth.isAuthenticated);
const jwt = useSelector((state) => state?.auth?.user?.token);
const dispatch = useDispatch();
if (isAuthenticated) {
dispatch(actions.getRole(jwt)); //THIS DISPATCHER IS CALLED 3 TIMES
}
return(
<Provider store={store}>
<BrowserRouter basename="/">
<Switch>
<Route path="/login" exact>
{isAuthenticated ? <Redirect to="/" /> : <Login />}
</Route>
<Route exact path="/">
{isAuthenticated ? <Dashboard /> : <Redirect to="/login" />}
</Route>
</Switch>
</BrowserRouter>
</Provider>
)
}
您当前在每次组件呈现时分派它。 如果您希望仅在用户登录时调用它,您需要将调用包装在 useEffect 中,如下所示:
useEffect(() =>
if (isAuthenticated) {
dispatch(actions.getRole(jwt));
}
}, [isAuthenticated]);
现在,仅当 isAuthenticated 发生变化时,useEffect 中的代码才会运行。