从父组件向子路由器组件传递数据的React Router dom没有通过props.match

时间:2020-06-23 19:14:56

标签: reactjs react-router-dom

父组件App.js的内容:-

import React, { useEffect, useState } from "react";
import NavBar from "./components/NavBar";
import Signup from "./pages/Signup";
import Home from "./pages/Home";
import Book from "./pages/Book";

function App() {
  const [user, setUser] = useState();
  useEffect(() => {
    const token = "Bearer " + sessionStorage.getItem("token");
    if (token) {
      axios
        .get(process.env.REACT_APP_API_URL + "user/self", {
          headers: {
            Authorization: token,
            "Content-Type": "application/json",
          },
        })
        .then((res) => setUser(res.data));
    }
  }, []);

  return (
    <div className="container-fluid">
      <NavBar user={user} />
      <Route exact path="/" component={Home} />
      <Route path="/signup" component={Signup} />
      <Route exact path="/book/:id" component={() => <Book user={user} />} />
    </div>
  );
}

export default App;

对于路线:-

<Route exact path="/book/:id" component={() => <Book user={user} />} />

当我将component值从component = {Book}设置为component = {()=>时,出现错误:-

TypeError:无法读取未定义的属性“ params”

那是因为我在Book组件中使用了“ props.match.params.id”。

我如何通过props.match将用户状态传递给Book组件?

2 个答案:

答案 0 :(得分:1)

这是您使用道具道具的方式

<Route exact path="/book/:id" component={Book} />

考虑像这样使用render道具而不是component道具:

<Route exact path="/book/:id" render={(routeProps) => <Book user={user} {...routeProps} />} />

答案 1 :(得分:0)

component道具不是函数。使用render代替component道具。

render prop是路由器props对象作为参数传递到的函数。您可以将这些路由器道具传递给您的组件。

<Route exact path="/book/:id" render={(props) => <Book user={user} {...props} />} />

有关render道具的详细信息,请参见react router docs