我有一个正在验证用户身份的 userContext。它正在工作,但成功登录后我希望用户被定向到/dashboard。所以我使用 this.props.history.push('/dashboard'); 但出现以下错误。
TypeError: Cannot read property 'props' of undefined
有更好的方法吗?使用函数时?
UserContext.js
import React, {useState, createContext, useEffect} from 'react'
import Firebase from 'firebase'
import { Redirect } from 'react-router'
export const UserContext = createContext();
export const UserProvider = props => {
const [user, setUser] = useState({
username: "blank",
loggendIn: false
});
var id = localStorage.getItem('id');
// check if its null
console.log(id);
useEffect(() => {
if (id != null) {
console.log('id is there');
// load user from realtime database
const dbOBJ = Firebase.database().ref().child("users").child(id);
dbOBJ.on('value', function(snapshot) {
setUser(snapshot.val());
});
} else {
console.log('no id :( ');
}
console.log(props.history);
this.props.history.push('/dashboard');
}, [id]);
return (
<UserContext.Provider value = {[user, setUser]} >
{ props.children}
</UserContext.Provider>
);
}
app.js
import React from 'react';
import NavBar from './components/navBar';
import Login from './components/login';
import Session from './components/session';
import Dashboard from './components/dashboard';
import './App.css';
import Container from '@material-ui/core/Container';
import {BrowserRouter as Router, Route, Switch} from 'react-router-dom';
import { UserProvider } from './model/UserContext'
function App() {
return (
<div>
<UserProvider>
<Session />
<NavBar />
<Container maxWidth="sm">
<Router>
<Route path='/Login' component={Login} />
<Route path='/Dashboard' component={Dashboard} />
</Router>
</Container>
</UserProvider>
</div>
);
}
export default App;
最佳答案
这是一个功能组件,没有 this
存在的实例,历史记录仅位于 props
上。您可能还需要将路由器的历史对象“注入(inject)”到 props 中。
import React, {useState, createContext, useEffect} from 'react'
import Firebase from 'firebase'
import { Redirect, withRouter } from 'react-router'
export const UserContext = createContext();
const UserProvider = ({ // don't export here
children, // destructuring props here so it is clearer
history
}) => {
const [user, setUser] = useState({
username: "blank",
loggendIn: false
});
var id = localStorage.getItem('id');
// check if its null
console.log(id);
useEffect(() => {
if (id != null) {
console.log('id is there');
// load user from realtime database
const dbOBJ = Firebase.database().ref().child("users").child(id);
dbOBJ.on('value', function(snapshot) {
setUser(snapshot.val());
});
} else {
console.log('no id :( ');
}
console.log(props.history);
history.push('/dashboard'); // <-- no this.props, just props or destructured props
}, [id]);
return (
<UserContext.Provider value = {[user, setUser]} >
{ children }
</UserContext.Provider>
);
}
export default withRouter(UserProvider);
关于javascript - 类型错误 : Cannot read property 'props' of undefined In a React function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58128226/