javascript - 类型错误 : Cannot read property 'props' of undefined In a React function

标签 javascript reactjs react-router

我有一个正在验证用户身份的 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/

相关文章:

javascript - React - 如何将电话号码格式化为用户类型

reactjs - Jest 遇到意外标记,因为试图导入 Jest 无法解析的文件

javascript - React - 子路由未加载

reactjs - 警告 : Failed prop type: The prop `to` is marked as required in `Link` , 但其值为 `undefined`

javascript - 这个正则表达式有什么作用以及函数用它做什么?

javascript - 如何 slideDown() 输入框?

node.js - 在后端、React 和 React-Native 客户端之间共享 TypeScript 代码

javascript - React Router + Redux - 在路由更改时调度异步操作?

javascript - 构建 json 对象时跳过表单字段值

javascript - getElementsByTagName 不是函数。它调用不在列表中