简体   繁体   English

嵌套的React组件和路由

[英]Nested React components and routing

Outer component (page layout): 外部组件(页面布局):

var Layout = React.createClass({
  render() {
    return (
      <div className="container">
        <header>
          <h1>{this.props.title}</h1>
        </header>
        <section>
          {this.props.children}
        </section>
      </div>
    );
  }
});

Component one (page 1): 组件一(第1页):

var PageOne = React.createClass({
  render() {
    return (
      <Layout title="Component One">
        <p>This is component one.</p>
      </Layout>
    );
  }
});

Component two (page 2): 第二部分(第2页):

var PageTwo = React.createClass({
  render() {
    return (
      <Layout title="Component Two">
        <p>This is component two.</p>
      </Layout>
    );
  }
});

Now, if we render these components to document.body dynamically, based on which page user is located (using HTML5 History API), how would that impact performance (as opposed to switching just Page components without re-rendering the outer (layout) component)? 现在,如果我们根据所定位的页面用户(使用HTML5 History API)动态地将这些组件呈现到document.body ,这将对性能有何影响(与仅切换Page组件而不重新呈现外部(布局)组件相反) )?

var React = require('react');
var {Router} = require('director');

var render = (page) => { React.renderComponent(page(), document.body); };

var routes = {
    '/page-one': () => { render(require('./pages/PageOne')); },
    '/page-two': () => { render(require('./pages/PageTwo')); }
};

Router(routes).configure({html5history: true}).init();

PS: The HTML markup in these sample components is intentionally simplified. PS:这些示例组件中的HTML标记被有意简化。 On StackOverflow.com example, there could be page components such as Questions, Tags, Users, Badges, AskQuestion, all contained inside a layout component which itself contains header, footer, navigation, sidebar. 在StackOverflow.com示例中,可能存在页面组件,例如“问题”,“标签”,“用户”,“徽章”,“ AskQuestion”,它们全部包含在布局组件中,而布局组件本身包含页眉,页脚,导航,侧边栏。

You can't do this without rerender because this two page components are not similar. 如果没有重新渲染,您将无法执行此操作,因为这两个页面组件并不相似。 You can avoid lot of mutations if you create one component with some calculated parameters. 如果使用某些计算出的参数创建一个组件,则可以避免很多变异。

Component Page: 组件页面:

var Page = React.createClass({
  render() {
   return (
        var _component_title = "Component" + this.props.componentName  
        <Layout title={_component_title}>
            <p>This is {_component_title}</p>
        </Layout>
     );
   }
});

Router: 路由器:

var Page = require('./pages/Page')
var render = (page) => { React.renderComponent(Page({componentName: page}), document.body); };

var routes = {
   '/page-one': () => { render('One'); },
   '/page-two': () => { render('Two'); }
};

React will rerender only nodes with component name. React只会重新渲染具有组件名称的节点。

But you no need wory about rerender, React do this really fast. 但是您无需担心重新渲染,React可以非常快速地做到这一点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM