在 React 中使用受保护路由时无法读取未定义的 属性 'push'

Cannot read property 'push' of undefined when using protected route in React

我正在尝试在我的仪表板中实施受保护的路由器。所以我的登陆页面直接是一个登录页面,如果用户成功登录,我想将页面重定向到我的仪表板。所以这是我的 index.js:

ReactDOM.render(
  <Router history={hist}>
    <Switch>
      <Route path="/" component={Login} exact />
      <ProtectedRoute path="/admin" component={(props) => <AdminLayout {...props} />}/>
      <Route path="" component={() => "404 NOT FOUND"} />
    </Switch>
  </Router>,
  document.getElementById("root")
);

所以我的登录组件非常基础,我在这里获取数据并检查数据库中是否存在该用户的 ID:

const Login = ({ submitForm }, props) => {
  const [isSubmitted, setIsSubmitted] = useState(false);

  function submitForm() {
    setIsSubmitted(true);
  }
  const { handleChange, values, handleSubmit, errors } = useForm(
    submitForm,
    validate
  );

  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(false);
  const [login, setLogin] = useState(false);

  const fetchLogin = async (email, password) => {
    try {
      setLoading(true);
      const res = await Axios({
          //API CALL
      });
      if (res.status === 200) {
        setLogin(true);
        localStorage.setItem("user-info", JSON.stringify(res));
      }
      setLoading(false);
    } catch (err) {
      setError(err.message);
      setLoading(false);
    }
  };

  function loginButton() {
    fetchLogin(values.email, values.password);
    
    auth.login(() => {
      props.history.push("/admin");
    });
  }
  return (
    <form>
    </form>
  );
};

export default Login;

所以我有一个基本的 Auth class:

class Auth {
    constructor() {
      this.authenticated = false;
    }
  
    login(cb) {
      this.authenticated = true;
      cb();
    }
  
    logout(cb) {
      this.authenticated = false;
      cb();
    }
  
    isAuthenticated() {
      return this.authenticated;
    }
  }
  
  export default new Auth();

这是我的受保护路由器:

export const ProtectedRoute = ({
  component: Component,
  ...rest
}) => {
  return (
    <Route
      {...rest}
      render={props => {
        if (auth.isAuthenticated()) {
          return <Component {...props} />;
        } else {
          return (
            <Redirect
              to={{
                pathname: "/",
                state: {
                  from: props.location
                }
              }}
            />
          );
        }
      }}
    />
  );
};

所以一切看起来都很好,但是当我点击提交按钮时,我得到 无法读取 属性 'push' of undefined 我真的不明白我为什么明白了。

请看看我的代码并帮助我。 评论也很感激。

好的,我认为问题在于您正在解构 props 并尝试使用默认值。

const Login = ({ submitForm }, props) => {

你能否尝试将历史记录添加到你的解构列表中,或者反过来只使用 props 而不是解构进入你的组件的 props,然后再重组

const Login = ({ submitForm, history}) => { rest of your component...

or 

const Login = (props) => {
  const { submitForm, history } = props;
}

正如我之前评论中的文档所述,当您在 Route

中使用道具时,它们会自动传入:匹配、位置和历史记录