Реагировать 0.14 - использовать реактивный маршрутизатор

Ниже приведен мой код. App.js - это корневой файл, about.js - это файл, отображающий только некоторый текст, а index.js обрабатывает все маршруты с помощью реактора-ретранслятора. Я хочу сделать свой about.js в app.js. Он не отображается, если я не пишу "this.props.children" в app.js.

App.js - корневой файл, который отображает все дочерние компоненты внутри него.

"use strict";

import React from 'react';
import { Link } from 'react-router';

class App extends React.Component {
  render() {
    console.log(this.props.children)
    return(
        <div>
            <h1>Hello !</h1>
            <Link to="about">About</Link>
            {this.props.children} **//Is this necessary?**
        </div>
    ) 
  }
}
export default App;

About.js

"use strict";

import React from 'react';

class About extends React.Component {
  render() {
    return(
        <div>
            <h1>About page!</h1>
        </div>
    )
  }
}
export default About;

Index.js - Файл, обрабатывающий маршруты

import React from 'react';
import { render } from 'react-dom';
import { Router, Route, Link, browserHistory } from 'react-router'

/*Require own custom files*/
import App from './app';
import About from './about';

render((
  <Router history={browserHistory}>
    <Route path="/" component={App}>
      <Route path="about" component={About}/>
    </Route>
  </Router>
), document.getElementById('app'))

Я работаю в React 0.14 с ecma6. Чтобы использовать "реактивный маршрутизатор", нужно ли писать "this.props.children" в корневом компоненте? Если да, то почему? Есть ли другой способ реализовать "реактивный маршрутизатор"?

Ответы

Ответ 1

Да, необходимо иметь this.props.children.

В вашем index.js вы определили свои маршруты как вложенные. Если вы объявляете о маршрут внутри /, то вам нужно отобразить страницу как дочерний элемент приложения. Если вы не хотите вызывать this.props.children в приложении, сделайте их отдельными маршрутами уровня, но вы потеряете возможность использовать его как часть приложения.

React router в основном передает компонент About в качестве дочернего элемента приложения в соответствии с вашим определением маршрутов. Если вы не используете this.props.children, вы не сможете этого сделать.

Если у вас есть другие страницы в вашем приложении, например, о странице или странице индекса. Они также не будут отображаться без использования this.props.children.

Ответ 2

Да, вам нужно использовать файл {this.props.children} в файле app.js, чтобы отображать дочерние страницы маршрутизации. Поскольку вы устанавливаете app.js, это маршрут индекса в пути маршрутизатора = "/". Он отобразит данные app.js на домашней странице, и когда вы перейдете к следующей дочерней странице, тогда также отобразятся данные app.js и данные дочерней страницы на той же странице. Это будет полезно, если вы хотите повторно использовать компоненты, такие как меню навигации Header, для отображения одного и того же заголовка на всех страницах без повторного создания компонента заголовка.

Ответ 3

this.props.children - свойство, автоматически заданное React для компонента, содержащего дочерние элементы этого компонента. Вы можете использовать интерактивный маршрутизатор, не помещая this.props.children.

В вашем случае this.props.children в компоненте App.js соответствует содержимое, помещенное в тег <App /> в вашем приложении. Если нет тега <App />, тогда ни один из них не будет помещен внутрь, и будет создан только рендер из App.js.

Ответ 4

Вот полный пример использования вложенных маршрутов для ReactSpeed.com.

ReactDOM.render(
  <Router history={browserHistory}>
    <Route path="/" component={HomePage}>
      <IndexRoute component={CardStack} />
      <Route path="/roadmap" component={Roadmap} />
      <Route path="/ajax" component={CardStackAjax} />
      <Route path="/infographics" component={CardStackInfo} />
      <Route path="/media" component={CardStackMedia} />
      <Route path="/forms" component={CardStackForm} />
      <Route path="/buttons" component={CardStackButton} />
      <Route path="/blog" component={PostSummary} />
      <Route path="/blog/:slug" component={PostDetail} />
    </Route>
    <Route path="*" component={HomePage}>
      <IndexRoute component={MissingRoute} />
    </Route>
  </Router>,
  document.getElementById('app')
);

компонент HomePage рендеринг props.children также указан в GitHub. Маршруты определены в index.jsx, доступных на GitHub здесь. Все вложенные компоненты также перечислены в GitHub.