![](/img/trans.png)
[英]React Router gives 404 if I try to copy and paste url in new tab
[英]React Router redirects to BASE_URL when I try to load a page in a new tab
我一直在做一個反應項目,大約 4 天前我遇到了一個問題。 當我嘗試在新選項卡中打開鏈接時,它會重定向到主頁/BASE url。 請幫助我修復錯誤。
渲染路由方法
export const renderRoutes = (routes = []) => (
<Suspense fallback={<Loader />}>
<Switch>
{routes.map((route, i) => {
const Guard = route.guard || Fragment;
const Layout = route.layout || Fragment;
const Component = route.component;
return (
<Route
key={i}
path={route.path}
exact={route.exact}
render={(props) => (
<Guard>
<Layout>
{route.routes
? renderRoutes(route.routes)
: <Component {...props} />}
</Layout>
</Guard>
)}
/>
);
})}
</Switch>
</Suspense>
);
訪客衛士
const GuestGuard = (props) => {
console.log(props, BASE_URL)
if (props.isLoggedIn) {
console.log(BASE_URL)
return <Redirect to={BASE_URL} />;
}
return (
<React.Fragment>
{props.children}
</React.Fragment>
);
};
GuestGuard.propTypes = {
isLoggedIn: PropTypes.bool.isRequired
}
const mapStateToProps = (state) => ({
isLoggedIn: state.auth.isLoggedIn
})
export default connect(mapStateToProps, )(GuestGuard);
AuthGuard
const AuthGuard = ({ children, isLoggedIn }) => {
// console.log(children, 393)
if (!isLoggedIn) {
return <Redirect to="/auth/signin-1" />;
}
console.log("LOGGED IN", children.props)
return (
<React.Fragment>
{children}
</React.Fragment>
);
};
AuthGuard.propTypes = {
isLoggedIn: PropTypes.bool.isRequired
}
const mapStateToProps = (state) => ({
isLoggedIn: state.auth.isLoggedIn
})
export default connect(mapStateToProps, )(AuthGuard);
應用程序(提供者來自 react-redux)
const App = () => {
useEffect(() => {
store.dispatch(init());
}, [])
return (
<Provider store={store}>
<Router basename={BASENAME}>
<React.Fragment>
{renderRoutes(routes)}
</React.Fragment>
</Router>
</Provider>
);
};
export default App;
在 useEffect 中調用的 init 方法
export const init = () => (dispatch) => {
try {
const serviceToken = window.localStorage.getItem('serviceToken');
if (serviceToken) {
setSession(serviceToken);
axios.get('http://localhost:8000/api/auth/user', tokenConfig())
.then(response => {
const user = response.data;
dispatch({
type: ACCOUNT_INITIALISE,
payload: {
isLoggedIn: true,
user
}
})
}).catch(err=>{
dispatch({
type:LOGOUT
})
})
} else {
dispatch({
type: ACCOUNT_INITIALISE,
payload: {
isLoggedIn: false,
user: null
}
});
}
} catch (err) {
console.error(err);
dispatch({
type: ACCOUNT_INITIALISE,
payload: {
isLoggedIn: false,
user: null
}
});
}
};
商店(在與 App.js 相同的目錄中)
import {createStore, applyMiddleware, compose } from 'redux'
import thunk from 'redux-thunk'
import rootReducer from './reducers/index'
const initialState = {};
const middleware = [thunk];
const store = createStore(
rootReducer,
initialState,
compose(
applyMiddleware(...middleware),
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
)
);
export default store;
授權減速器
const initialState = {
isLoggedIn: false,
isInitialised: false,
user: null
};
export default function (state = initialState, action) {
switch (action.type) {
case ACCOUNT_INITIALISE: {
const { isLoggedIn, user } = action.payload;
return {
...state,
isLoggedIn,
isInitialised: true,
user
};
}
case LOGIN: {
const { user } = action.payload;
return {
...state,
isLoggedIn: true,
user
};
}
case LOGOUT: {
localStorage.removeItem('serviceToken');
return {
...state,
isLoggedIn: false,
user: null
};
}
default: {
return { ...state };
}
}
}
我認為您需要在此處調試應用程序流程。 下面似乎是根本原因,當鏈接在新選項卡中打開時,它受 authGuard 保護,並且“在 useEffect 中調用的 init 方法”正在異步調用 api。 所以 authGuard 第一次得到 isloggedIn false 並重定向到“/auth/signin-1”。 同時,isloggedIn 設置為 true,guestGuard 重定向到登錄頁面。
您在此處有以下選項:除非您收到 api 的響應,否則不要加載您的路由器。 在收到響應時顯示加載程序。
希望你在這里得到這個錯誤,這個答案可以幫助你解決同樣的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.