React路由器dom将数据从父组件传递到子路由器组件不通过props.match

IT技术 reactjs react-router-dom
2021-05-28 03:05:22

父组件 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={Book} 设置为 component={() => 我收到一个错误:-

类型错误:无法读取未定义的属性“参数”

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

如何将带有 props.match 的用户状态传递给 Book 组件?

2个回答

componentprop 不是函数。使用render代替componentprops。

renderprop 是一个函数,路由器 props 对象作为参数传递给它。您可以将这些路由器props传递给您的组件。

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

有关prop 的详细信息,请参阅react 路由器文档render

这就是你如何使用组件props

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

考虑使用renderprops而不是component像这样props:

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