【问题标题】:How does react-router pass params to other components via props?react-router 如何通过 props 将参数传递给其他组件?
【发布时间】:2015-12-30 07:57:32
【问题描述】:

到目前为止,我对属性如何通过参数从一个组件传递到另一个组件的了解程度如下

//开始:我的知识范围

假设在 A.jsx 中存在一个名为 topic 的状态变量。 我想将此传递给 B.jsx,所以我执行以下操作

B = require('./B.jsx')
getInitialState: function() {return {topic: "Weather"}}
<B params = {this.state.topic}>

在 B.jsx 中,我可以做类似的事情

module.exports = React.createClass({
render: function() {
   return <div><h2>Today's topic is {this.props.params}!</h2></div>
}
})

调用时会显示“今天的主题是天气!”

//结束:我的知识范围

现在,我正在阅读 react-router 教程,代码如下:sn-ps

topic.jsx:

module.exports = React.createClass({
  render: function() {
    return <div><h2>I am a topic with ID {this.props.params.id}</h2></div>
    }
  })

routes.jsx:

var Topic = require('./components/topic');
module.exports = (
  <Router history={new HashHistory}>
    <Route path="/" component={Main}>
      <Route path = "topics/:id" component={Topic}></Route>
    </Route>

  </Router>
)

header.jsx:

  renderTopics: function() {
    return this.state.topics.map(function(topic) {
      return <li key = {topic.id} onClick={this.handleItemClick}>
        <Link to={"topics/" + topic.id}>{topic.name}</Link>
      </li>
    })
  }

其中this.state.topics 是通过 Reflux 从 imgur API 提取的主题列表。

我的问题是params 是通过什么机制传递给 props 的 topic.jsx?在代码中的任何地方,我都没有看到上面关于“我的知识范围”部分所表达的习语。在 routes.jsx 或 header.jsx 中都没有 &lt;Topic params = {this.state.topics} /&gt;。链接到full repo here。 React-router 文档说参数是“parsed out of the original URL's pathname”。这并没有引起我的共鸣。

【问题讨论】:

    标签: javascript reactjs reactjs-flux react-router refluxjs


    【解决方案1】:

    这是关于react-router 内部的问题。

    react-router 本身就是一个 React 组件,它使用props 递归地将所有路由信息传递给子组件。但是,这是react-router 的实现细节,我知道它可能会造成混淆,因此请继续阅读以了解更多细节。

    您示例中的路由声明是:

    <Router history={new HashHistory}>
      <Route path="/" component={Main}>
        <Route path = "topics/:id" component={Topic}></Route>
      </Route>
    </Router>
    

    所以基本上,React-Router 将遍历路由声明(Main、Topic)中的每个组件,并在使用React.createElement 方法创建组件时将以下道具“传递”给每个组件。以下是传递给每个组件的所有道具:

    const props = {
       history,
       location,
       params,
       route,
       routeParams,
       routes
    }
    

    props 值由react-router 的不同部分使用各种机制计算(例如,使用正则表达式从 URL 字符串中提取数据)。

    React.createElement 方法本身允许react-router 创建一个元素并传递上面的道具。方法的签名:

    ReactElement createElement(
      string/ReactClass type,
      [object props],
      [children ...]
    )
    

    所以基本上内部实现中的调用如下:

    this.createElement(components[key], props)
    

    这意味着react-router 使用上面定义的道具来启动每个元素(Main、Topic 等),这样就解释了如何在Topic 组件本身中访问this.props.params,它是通过react-router!

    【讨论】:

    • 感谢您的回答。我总是很好奇人们如何在引擎盖下挖掘这些东西。这是凭经验,还是您在文档中找到的?如果可以,请您指出确切的位置吗?
    • 我刚刚在以下位置挖掘了实现:github.com/rackt/react-router/tree/master/modules
    • 它工作正常,但在那个 url 上我的所有链接和脚本都变成 404。请帮助
    猜你喜欢
    • 2019-03-10
    • 2015-07-12
    • 2017-09-14
    • 1970-01-01
    • 2019-04-03
    • 2017-02-13
    • 2018-02-04
    • 2021-09-06
    • 2020-06-12
    相关资源
    最近更新 更多