Как react-router передает параметры другим компонентам через реквизит?

до сих пор, насколько я знаю о том, как свойства передаются от одного компонента к другому через параметры следующим образом

/ / start: степень моих знаний

предположим, существует некоторая переменная состояния 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>
}
})

который при вызове будет отображать " сегодняшняя тема Погода!"

/ / end: степень моих знаний

теперь я прохожу учебник по 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 - это список тем, взятых из API imgur через рефлюкс.

у меня вопрос: по какому механизму params принят в props по теме.jsx? Нигде в коде я не вижу идиомы, выраженной в приведенном выше разделе о "степени моих знаний", а именно. нет <Topic params = {this.state.topics} /> в обе стороны.jsx или заголовка.jsx. Ссылка на полный РЕПО здесь. React-router docs говорит, что параметры"разобран из исходного пути 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 метод. Вот все реквизиты, переданные каждому компоненту:

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

значения реквизита вычисляются различными частями react-router используя различные механизмы (например, извлечение данных из строки URL с помощью регулярных выражений).

на React.createElement сам метод позволяет react-router создать элемент и передать реквизит выше. Этот подпись метода:

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

таким образом, в основном вызов во внутренней реализации выглядит так:

this.createElement(components[key], props)

что означает react-router используется реквизит определено выше для начала каждого из элементов (главным образом, теме и т. д.), так что это объясняет, как вы могли получить доступ this.props.params на Topic сам компонент, он был передан react-router!