javascript - 当 useContext 对象更改时反应不重新渲染
问题描述
我正在使用useAuth
钩子进行身份验证,如此处所述。我做了一个类似的钩子,如图所示:
const AuthContext = createContext();
export function ProvideAuth({children}) {
const auth = useProvideAuth();
return <AuthContext.Provider value={auth}>{children}</AuthContext.Provider>
}
export const useAuth = () => {
return useContext(AuthContext);
}
function useProvideAuth() {
const [user, setUser] = useState(null);
console.log(user); // originally prints 'null'
// after mounting and re-rendering prints USERNAME
const login = (username, password, callback, errorcb) => {
...
}
// A small diff here
useEffect(() => {
axios.get(
'/isLoggedIn/',
).then((response) => {
setUser(response.data.user)
}).catch(error => {
setUser(null)
})
}, [])
return {
user,
login,
}
}
在安装时,我调用/isLoggedIn/
并相应地更新状态,这应该会触发重新渲染。
但是我PrivateRoute
的并没有重新渲染,所以user
始终保持不变null
,因此再次登陆登录页面。
function PrivateRoute({children, ...rest}) {
const auth = useAuth();
return (<Route {...rest}
render={({location}) => {
console.log(auth.user)
return auth.user ? (
children
) : (
<Redirect
to={{
pathname: '/login',
state: {from: location}
}}
/>
)
}}
></Route>)
}
我的App.js
function App() {
return (
<ProvideAuth>
<Router>
<Switch>
<PrivateRoute path="/builder">
<Builder/>
</PrivateRoute>
<Route path="/login">
<Login/>
</Route>
</Switch>
</Router>
</ProvideAuth>
)
}
解决方案
推荐阅读
- c++ - 如何在另一个类中使用带有布尔函数的 If 语句
- fpga - SPI 时钟频率与 FPGA 内部时钟频率
- javascript - 如何在 Django 中有条件地限制用户访问页面
- python - 如何对 Python pyspark 的实用程序函数进行单元测试
- performance - HEC RAS RasQuasiSediment.exe 进程计数 = 3 退出代码 = -2147483645
- python - 如何将自定义要求添加到 buildozer.spec 文件
- node.js - 如何使用 nodejs 作为后端在 React Native 中进行 facebook 身份验证?
- android - 如何在 Flutter WebView for Android 中添加 JavaScriptInterface?
- arrays - 在 C 中制作二维字符数组表
- ios -
文件未找到