将自定义props传递给 react-router v4 中的路由器组件

IT技术 javascript reactjs react-router react-router-v4
2021-01-20 14:43:14

我正在使用 React Router 创建一个多页应用程序。我的主要组件是<App/>,它将所有路由渲染到子组件。我正在尝试通过路由传递 props,根据我所做的一些研究,子组件利用传递下来的 props 的最常见方法是通过this.props.route它们继承对象。但是,这个对象对我来说是未定义的。render()子组件中的函数中,我console.log(this.props)返回一个如下所示的对象

{match: Object, location: Object, history: Object, staticContext: undefined}

看起来完全不像我期望的props。这是我的详细代码。

父组件(我试图在我的所有子组件中将“hi”这个词作为一个名为“test”的props传递下去):

import { BrowserRouter as Router, HashRouter, Route, Switch } from 'react-router-dom';
import Link from 'react-router';
import React from 'react';

import Home from './Home.jsx';
import Nav from './Nav.jsx';
import Progress from './Progress.jsx';
import Test from './Test.jsx';



export default class App extends React.Component {

  constructor() {
    super();

    this._fetchPuzzle = this._fetchPuzzle.bind(this);
  }

  render() {
    return (
      <Router>
        <div>
          <Nav />
          <Switch>
            <Route path="/" exact test="hi" component={Home} />
            <Route path="/progress" test="hi" component={Progress} />             
            <Route path="/test" test="hi" component={Test} />
            <Route render={() => <p>Page not found!</p>} />
          </Switch>
        </div>
      </Router>
    );
  }
}

孩子:

import React from 'react';
const CodeMirror = require('react-codemirror');
import { Link } from 'react-router-dom';

require('codemirror/mode/javascript/javascript')

require('codemirror/mode/xml/xml');
require('codemirror/mode/markdown/markdown');

export default class Home extends React.Component {

  constructor(props) {
    super(props);

    console.log(props)

  }

  render() {
    const options = {
      lineNumbers: true,  
      theme: 'abcdef'    
      // mode: this.state.mode
    };
    console.log(this.props)

    return (
      <div>
        <h1>First page bro</h1>        
        <CodeMirror value='code lol' onChange={()=>'do something'} options={options} />
      </div>);
  }
}

我对 React 还很陌生,所以如果我遗漏了一些明显的东西,我深表歉意。谢谢!

1个回答

您可以通过使用renderprop将 props 传递给组件Route,从而内联组件定义。根据DOCS:

这允许方便的内联渲染和包装,而无需上面解释的不需要的重新挂载component。 您可以传入一个在location匹配时调用的函数,而不是使用prop为您创建新的 React 元素渲染props接收所有与组件渲染props相同的路由props

所以你可以将props传递给组件,如

 <Route path="/" exact render={(props) => (<Home test="hi" {...props}/>)} />

然后你可以像这样访问它

this.props.test 

在您的Home组件中

PS还要确保您正在传递,{...props}以便默认路由器propslocation, history, match etc也被传递给Home组件,否则唯一传递给它的props是test.

这工作谢谢。奇怪的是,我在上面的问题中尝试的方法不起作用。
2021-03-28 14:43:14
您应该将 props 参数添加到您传入的函数中,并在带有 {...props} 的组件“Home”中使用它,否则您将丢失标准的 props react router v4 传入
2021-03-31 14:43:14
@speedDeveloper,我不认为这是一个快速修复,如果你将它传递给render(). 我错过了答案中的那部分。但是我更新了它以包含相同的
2021-04-02 14:43:14
是的,在回答这个问题之前,我已经在本地设置中进行了分析,花了我一些时间
2021-04-05 14:43:14
这是推荐的方法吗?它看起来像一个快速修复?
2021-04-10 14:43:14