react-router 如何通过 props 将参数传递给其他组件?

IT技术 javascript reactjs reactjs-flux react-router refluxjs
2021-04-16 00:50:31

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

//开始:我的知识范围

假设存在一个topic在 A.jsx 中调用的状态变量我想把它传递给 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 的教程,其中包含以下代码片段

主题.jsx:

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

路线.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>
)

头文件.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传递给propstopic.jsx?在代码中,我没有看到上述关于“我的知识范围”即的习语。<Topic params = {this.state.topics} />route.jsx 或 header.jsx 中都没有链接到这里完整回购React-router 文档说 params 是“从原始 URL 的路径名中解析出来的”。这没有引起我的共鸣。

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方法创建组件时将以下props“传递”给每个组件以下是传递给每个组件的所有props:

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

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

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

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

所以基本上内部实现中的调用看起来像:

this.createElement(components[key], props)

这意味着react-router使用上面定义的 props 来启动每个元素(Main、Topic 等),这样就解释了如何this.props.paramsTopic组件本身中访问它,它被传递了react-router

感谢您的回答。我总是很好奇人们如何在引擎盖下挖掘这些东西。这是根据经验,还是您在文档中找到的?如果是这样,你能指出我的确切位置吗?
2021-05-24 00:50:31
它工作正常,但在那个网址上我的所有链接和脚本都变成了 404。请帮忙
2021-06-01 00:50:31
2021-06-02 00:50:31