在 Routes 路由中调用 A 函数时,React 未按预期重定向
React not redirecting as intended when A function is called in the Routes route
我正在为我的一个 React 项目构建一个登录和注销系统。我有一个导航栏设置,我正在使用 react-redirect-dom
创建 links 并将 links 重定向到不同的页面以管理登录系统。
在当前项目中,我有一个路由在登录组件中对登录进行处理。我有另一个 link 在注册组件中处理注册。
对于注销,如果用户登录并使用 /logout
端点,我希望它立即调用 handleLogout
函数并将用户注销并重新路由到 /
端点
这是我的代码和错误:
function App() {
const [loggedIn, setLoggedIn] = useState(false)
const [currentUser, setCurrentUser] = useState('')
function handleLogout() {
console.log('handle logout')
axios.post('/api/auth/logout', {
"username":currentUser.username,
"password":currentUser.password,
})
.then((data) => {
console.log(data.data)
setCurrentUser(data.data)
setLoggedIn(false)
return(<Navigate to='/' />)
})
.catch((err) => {
console.log(err)
})
}
return (
<div className="App">
{/* <ContentContext value={contentContextValue}> */}
<BrowserRouter>
<Routes>
<Route exact path="/" element={loggedIn ? <Feed/> : <Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser}/>} />
<Route exact path="/login" element={<Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser}/>}/>
<Route exact path="/signup" element={<Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser}/>}/>
<Route exact path="/logout" element={loggedIn ? () => {handleLogout()} : <Login/>}/>
</Routes>
</BrowserRouter>
{/* </ContentContext> */}
</div>
);
}
这里是错误:
Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.
****************** 更新 ************************
import React from 'react'
export default function Logout(props) {
const {
handleLogout
} = props
const Logout = ({ handleLogout }) => {
const navigate = useNavigate();
React.useEffect(() => {
handleLogout();
navigate("/", { replace: true });
}, []);
return null;
};
return (
<div>
</div>
)
}
在 react-router-dom
版本 6 中,Route
组件采用 element
属性,该属性仅采用 一个ReactElement
,a.k.a。 JSX。正如警告指出的那样,在此处传递函数是无效的。
将您的注销逻辑重构到挂载 useEffect
挂钩中的一个组件中。调用传递的 handleLogout
函数,然后强制重定向到主 "/"
路径。
const Logout = ({ handleLogout }) => {
const navigate = useNavigate();
React.useEffect(() => {
handleLogout();
navigate("/", { replace: true });
}, []);
return null;
};
...
<Routes>
<Route
path="/"
element={loggedIn
? <Feed />
: <Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser} />
}
/>
<Route
path="/login"
element={<Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser} />}
/>
<Route
path="/signup"
element={<Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser} />}
/>
<Route
path="/logout"
element={loggedIn
? <Logout handleLogout={handleLogout} />
: <Login />
}
/>
</Routes>
我正在为我的一个 React 项目构建一个登录和注销系统。我有一个导航栏设置,我正在使用 react-redirect-dom
创建 links 并将 links 重定向到不同的页面以管理登录系统。
在当前项目中,我有一个路由在登录组件中对登录进行处理。我有另一个 link 在注册组件中处理注册。
对于注销,如果用户登录并使用 /logout
端点,我希望它立即调用 handleLogout
函数并将用户注销并重新路由到 /
端点
这是我的代码和错误:
function App() {
const [loggedIn, setLoggedIn] = useState(false)
const [currentUser, setCurrentUser] = useState('')
function handleLogout() {
console.log('handle logout')
axios.post('/api/auth/logout', {
"username":currentUser.username,
"password":currentUser.password,
})
.then((data) => {
console.log(data.data)
setCurrentUser(data.data)
setLoggedIn(false)
return(<Navigate to='/' />)
})
.catch((err) => {
console.log(err)
})
}
return (
<div className="App">
{/* <ContentContext value={contentContextValue}> */}
<BrowserRouter>
<Routes>
<Route exact path="/" element={loggedIn ? <Feed/> : <Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser}/>} />
<Route exact path="/login" element={<Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser}/>}/>
<Route exact path="/signup" element={<Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser}/>}/>
<Route exact path="/logout" element={loggedIn ? () => {handleLogout()} : <Login/>}/>
</Routes>
</BrowserRouter>
{/* </ContentContext> */}
</div>
);
}
这里是错误:
Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.
****************** 更新 ************************
import React from 'react'
export default function Logout(props) {
const {
handleLogout
} = props
const Logout = ({ handleLogout }) => {
const navigate = useNavigate();
React.useEffect(() => {
handleLogout();
navigate("/", { replace: true });
}, []);
return null;
};
return (
<div>
</div>
)
}
在 react-router-dom
版本 6 中,Route
组件采用 element
属性,该属性仅采用 一个ReactElement
,a.k.a。 JSX。正如警告指出的那样,在此处传递函数是无效的。
将您的注销逻辑重构到挂载 useEffect
挂钩中的一个组件中。调用传递的 handleLogout
函数,然后强制重定向到主 "/"
路径。
const Logout = ({ handleLogout }) => {
const navigate = useNavigate();
React.useEffect(() => {
handleLogout();
navigate("/", { replace: true });
}, []);
return null;
};
...
<Routes>
<Route
path="/"
element={loggedIn
? <Feed />
: <Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser} />
}
/>
<Route
path="/login"
element={<Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser} />}
/>
<Route
path="/signup"
element={<Login setLoggedIn={setLoggedIn} setCurrentUser={setCurrentUser} />}
/>
<Route
path="/logout"
element={loggedIn
? <Logout handleLogout={handleLogout} />
: <Login />
}
/>
</Routes>