これまでのところ、パラメータを介してプロパティが1つのコンポーネントから別のコンポーネントに渡される方法に関する私の知識の範囲は次のとおりです
//開始:私の知識の範囲
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のチュートリアルを実行します。
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から描画されたトピックのリストです。
私の質問はです。topic.jsxのparams
にどのようなメカニズムでprops
が渡されますか?上記の「私の知識の範囲」のセクションで表現されているように、コードのどこにもイディオムがありません。 routes.jsxまたはheader.jsxのいずれにも<Topic params = {this.state.topics} />
はありません。 ここに完全なリポジトリ へのリンク。 React-routerのドキュメントでは、paramsは「 元のURLのパス名から解析された 」であると書かれています。これは私には共鳴しませんでした。
これは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はルーティング宣言(メイン、トピック)の各コンポーネントを通過し、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
は上記の定義された小道具を使用して各要素(メイン、トピックなど)を開始したので、Topic
コンポーネント自体でthis.props.params
にアクセスする方法は、react-router
によって渡されました。