(ルートの)現在のコンポーネントの(最初の)title
プロパティを取得するユーティリティ関数を作成しようとしています。子プロセスのプロパティや状態を再帰的にスキャンする
私はルートのタイルプロパティを取得することができます。
function getPageTitleByRoutes(routes) {
for (let i = routes.length - 1; i >= 0; i -= 1) {
if (routes[i].hasOwnProperty('title')) {
return routes[i].title;
}
}
return null;
}
しかし、今、私は私のコンポーネントにタイトルの小道具を移動したい:
function getPageTitle(props) {
// ?? Iterate recurively ?? Context ok on render ??
React.Children.forEach(props.children, (child, i) => {
console.log(child + ' at index: ' + i);
// If it has title
// ??
// ??
if(title) return title;
return getPageTitle(child.props);
});
return null;
}
私はこの下のようなコンポーネントのセットアップを持っているが、ルータを反応させます:
<Router>
<Route path="/" title="App Title" component={App}>
<Route path="page1" title="Comp A" component={Comp1} />
<Route path="page2" title="Comp B" component={Comp2} />
</Route>
<Route path="/login" title="Login Comp" component={Login} />
</Router>
var NavBar = React.createClass({
render() {
const someTitle = getPageTitleByRoutes(this.props.routes);
// Line above works but now want to get 'title' (defaultProps)
// from "active/routed" component:
const someTitle = getPageTitle(this.props);
return (
<div>
<h2>{someTitle}</h2>
<ul>
<a onClick={() => history.push('page1') }>Page 1</a>
<a onClick={() => history.push('page2') }>Page 2</a>
</ul>
</div>
)
}
});
は、その後、私はこのように私のアプリを作成します。
var App = React.createClass({
render() {
return (
<div>
<NavBar />
{this.props.children}
</div>
)
}
});
多分別の方法がありますか?私はまた、反応して還元された接続を持っています...
興味深いが、それは奇妙な感じを与え、次の行の後にレンダリングします。概念的にNavBarは の子の所有者ではありません。 –
あなたのアプリケーションの子供をあなたのNavBarに入れておく必要はありません。 NavBarは 'routes = {...}'のようにそれに渡された小道具を必ず必要とします。さもなければNavBarのレンダー内でそれらを 'this.props.routes'として動作させることができません。 – Scott