React Router Pass Param to Component

Mud*_*uli 45 reactjs react-router

const rootEl = document.getElementById('root');

ReactDOM.render(
    <BrowserRouter>
        <Switch>
            <Route exact path="/">
                <MasterPage />
            </Route>
            <Route exact path="/details/:id" >
                <DetailsPage />
            </Route>
        </Switch>
    </BrowserRouter>,
    rootEl
);
Run Code Online (Sandbox Code Playgroud)

我正在尝试访问DetailsPage组件中的ID,但它无法访问.我试过了

<DetailsPage foo={this.props}/>
Run Code Online (Sandbox Code Playgroud)

将参数传递给DetailsPage,但是徒劳无功.

export default class DetailsPage extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <div className="page">
            <Header />
            <div id="mainContentContainer" >

            </div>
            </div>
    );
    }
}
Run Code Online (Sandbox Code Playgroud)

那么任何想法如何将ID传递给DetailsPage?

Win*_*Win 63

如果要将props传递给路径中的组件,最简单的方法是使用render,如下所示:

<Route exact path="/details/:id" render={(props) => <DetailsPage globalStore={globalStore} {...props} /> } />
Run Code Online (Sandbox Code Playgroud)

您可以访问使用中的道具DetailPage:

this.props.match
this.props.globalStore
Run Code Online (Sandbox Code Playgroud)

{...props}需要通过原路线的道具,否则你将只能得到this.props.globalStoreDetailPage.

  • 首先,你的代码是错误的。将组件放置在 Route 中,例如 `&lt;Route exact path="/details/:id" &gt;&lt;DetailsPage /&gt;&lt;/Route&gt;` 与 `&lt;Route exact path="/details/:id" component= 不同{详情页} /&gt;`。即使您访问了“/”,您的代码也会呈现“DetailsPage”。其次,当你写 `&lt;DetailsPage foo={this.props}/&gt;` 时,`this` 指的是 `null`。这就是它不起作用的原因。 (3认同)
  • 但是为什么它不能按照我在提问中指定的方式工作? (2认同)

Ale*_*una 54

我用它来访问我的组件中的ID:

<Route path="/details/:id" component={DetailsPage}/>
Run Code Online (Sandbox Code Playgroud)

并在细节组件中:

export default class DetailsPage extends Component {
  render() {
    return(
      <div>
        <h2>{this.props.match.params.id}</h2>
      </div>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

这将在h2中呈现任何ID,希望对某人有所帮助.

  • 极好的!我错过了“.params”部分!谢谢! (2认同)
  • 这应该是公认的答案,它更干净,更简单。 (2认同)

use*_*062 35

从带有钩子的 react-router v5.1 开始:

import { useParams } from 'react-router';

export default function DetailsPage() {
  const { id } = useParams();
}
Run Code Online (Sandbox Code Playgroud)

https://reacttraining.com/blog/react-router-v5-1/

  • 虽然是最新的,但这仅适用于功能组件。 (5认同)
  • 这是最好的解决方案 (3认同)

Ste*_*son 16

使用渲染方法:

<Route exact path="/details/:id" render={(props)=>{
    <DetailsPage id={props.match.params.id}/>
}} />
Run Code Online (Sandbox Code Playgroud)

你应该能够使用以下方式访问id:

this.props.id
Run Code Online (Sandbox Code Playgroud)

在DetailsPage组件内

  • 顺便说一句,这个也适用于组件方法: ```&lt;Route path="/..." component={props =&gt; &lt;DetailsPage id={props.match.params.id}/&gt;}/&gt;``` (4认同)

Man*_*uel 13

除了 Alexander Lunas 的回答......如果你想添加多个参数,只需使用:

<Route path="/details/:id/:title" component={DetailsPage}/>

export default class DetailsPage extends Component {
  render() {
    return(
      <div>
        <h2>{this.props.match.params.id}</h2>
        <h3>{this.props.match.params.title}</h3>
      </div>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)


Kum*_*lit 11

适用于第 6 版(2022 年)

注意:使用 useParams 您可以轻松获取组件中的参数。

看下面的例子

import React from "react";
import { BrowserRouter as Router, Routes, Route, Link } from "react-router-dom";
import Home from "./compo/home";
import About from "./compo/about";
import Login from "./compo/login";
import "./styles.css";
const App = () => {
  return (
    <Router>
      <div className="container">
        <Link to="/home">Home</Link>
        <Link to="/about">About</Link>
        <Link to="/login">Login</Link>
      </div>
      <Routes>
        <Route path="/home" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/login" element={<Login />} />
        <Route path="/login/:name" element={<Login />} />
      </Routes>
    </Router>
  );
};
export default App;
Run Code Online (Sandbox Code Playgroud)

登录组件

import { useParams } from "react-router-dom";

const Login = () => {
  let { name } = useParams();

  return <h1>i am {name ? <b>{name}</b> : "login"}</h1>;
};
export default Login;

   
Run Code Online (Sandbox Code Playgroud)


Dek*_*kel 6

使用组件:

<Route exact path="/details/:id" component={DetailsPage} />
Run Code Online (Sandbox Code Playgroud)

并且您应该能够id使用:

this.props.match.params.id
Run Code Online (Sandbox Code Playgroud)

内部DetailsPage组件


dia*_*zlp 6

这是针对react-router-dom v6的(我强烈建议为此使用功能组件)

对于react-router-dom来说,不断改变语法和规则有点痛苦。但这里什么也没有发生。

您可以同时使用useParamsuseSelector来解决这个问题

import { useParams } from 'react-router';
import { useSelector } from 'react-redux';

const Component = () => {
const { id } = useParams();                              //returns the :id
const page = useSelector((state) => state.something[id]); //returns state of the page

return <div>Page Detail</div>;
}

export default Component;
Run Code Online (Sandbox Code Playgroud)

但是,当您还有一个动作创建者并且您想将其作为connect函数中的道具传递时,问题仍然存在

export const connect(mapStateToProps, mapDispatchToProps)(Component)
Run Code Online (Sandbox Code Playgroud)

由于我们正在使用useParams,它不会被传递给mapStateToProps我们创建的

const mapStateToProps = (state, ownProps) => {
console.log(ownProps)   //wont recognize :id
//hence
return {
  someReducers: state.someReducers[id] //would return an error: 'id' is not defined
 };
};
Run Code Online (Sandbox Code Playgroud)

另一方面,您不能完全忽略该connect函数,因为您需要mapDispatchToProps使用您的组件。

解决方法是withRouter自己创建一个高阶组件函数。这是一个已弃用的 React-router-dom 助手。

//make this
import { useParams, useLocation, useNavigate } from 'react-router';
import { connect } from 'react-redux';
import { yourActionCreator } from '../actionCreator';

const withRouter = (Child) => {
return (props) => {
 const location = useLocation();
 const navigation = useNavigate();
 const params = useParams();
 return (
   <Child
   {...props}
   params={params}
   navigate={navigate}
   location={location}
   />
  );
 };
};

const Component = () => {
// your component...
return <div> Page Detail </div>
};

export mapStateToProps = (state, ownProps) => {
console.log(ownProps)     // would contain the :id params
return {
//something
 }
};

const mapDispatchToProps = {
yourActionCreator
}

export withRouter(connect(mapStateToProps, mapDispatchToProps)(Component));
Run Code Online (Sandbox Code Playgroud)


GSe*_*rjo 5

这是打字稿版本。致力于"react-router-dom": "^4.3.1"

export const AppRouter: React.StatelessComponent = () => {
    return (
        <BrowserRouter>
            <Switch>
                <Route exact path="/problem/:problemId" render={props => <ProblemPage {...props.match.params} />} />
                <Route path="/" exact component={App} />
            </Switch>
        </BrowserRouter>
    );
};
Run Code Online (Sandbox Code Playgroud)

和组件

export class ProblemPage extends React.Component<ProblemRouteTokens> {

    public render(): JSX.Element {
        return <div>{this.props.problemId}</div>;
    }
}
Run Code Online (Sandbox Code Playgroud)

在哪里ProblemRouteTokens

导出接口 ProblemRouteTokens { ProblemId: string; }