如何在react.js中创建可重用的组件或部分?

时间:2017-02-04 17:30:51

标签: javascript reactjs web web-deployment

第一次使用React.js,我想做一些非常简单的事情。

我创建了一个app.js,用于加载包含导航的初始页面并吐出子道具。

我没有将导航放在app.js文件中,而是想创建另一个组件或部分来渲染它。

以下代码:

import React, { Component } from 'react';
import NavLink from './components/NavLinks/NavLinks'
import './App.css';
import { Link } from 'react-router';

class App extends Component {
  render() {
    return (
      <div className="App">
        <nav>
          <li><NavLink to="/">Home</NavLink></li>
          <li><NavLink to="/contact" activeClassName="active">Contact</NavLink></li>
          <li><NavLink to="/bad-link" activeClassName="active">Bad Link</NavLink></li>
        </nav>

        <div className='container'>
          {this.props.children}
        </div>
      </div>
    );
  }
}

export default App;

我想要的是什么:

class App extends Component {
  render() {
    return (
      <div className="App">

        {-- Some component or partial here to render the nav --}

        <div className='container'>
          {this.props.children}
        </div>
      </div>
    );
  }
}

export default App;

3 个答案:

答案 0 :(得分:2)

实现这一目标的理想方法是制作无状态功能组件。由于您没有根据导航组件的状态进行更改,因此您可以将其设置为轻量级无状态功能组件,只为您呈现所需的视图。

const navRenderer = () => {
     <nav>
         <li><NavLink to="/">Home</NavLink></li>
         <li><NavLink to="/contact" activeClassName="active">Contact</NavLink</li>         
         <li><NavLink to="/bad-link" activeClassName="active">Bad Link</NavLink</li>
     </nav>
    }

export default navRenderer;

现在您可以在App.js文件中导入它:

import navRenderer from 'path/to/navRenderer';

    class App extends Component {
      render() {
        return (
          <div className="App">
            <NavRenderer />
            <div className='container'>
              {this.props.children}
            </div>
          </div>
        );
      }
    }

export default App;

您可以在此处详细了解Stateless Functional Components

答案 1 :(得分:1)

像这样写:

首先创建一个单独的组件,其中仅包含应用程序的Navigation部分,如下所示:

class Nav extends Component {
  render() {
    return (
       <div>
          <nav>
             <li><NavLink to="/">Home</NavLink></li>
             <li><NavLink to="/contact" activeClassName="active">Contact</NavLink></li>
             <li><NavLink to="/bad-link" activeClassName="active">Bad Link</NavLink></li>
          </nav>
       </div>
    );
  }
}

export default Nav;

然后在App组件中导入此导航文件,并将其直接呈现在render内,如下所示:

import Nav from './nav'; // import here change the path according to your folder structure 

class App extends Component {
  render() {
    return (
      <div className="App">

        <Nav/>

        <div className='container'>
          {this.props.children}
        </div>

      </div>
    );
  }
}

export default App;

答案 2 :(得分:0)

您可以创建另一个组件NavLinks,因为它没有任何状态,您可以将其创建为无状态组件,并在App中导入,如

const NavLinks= () => {
         <nav>
             <li><NavLink to="/">Home</NavLink></li>
             <li><NavLink to="/contact" activeClassName="active">Contact</NavLink</li>         
             <li><NavLink to="/bad-link" activeClassName="active">Bad Link</NavLink</li>
         </nav>
        }

export default NavLinks;

App.js

import NavLinks form 'path/to/NavLinks';
class App extends Component {
  render() {
    return (
      <div className="App">

        <NavLinks/>

        <div className='container'>
          {this.props.children}
        </div>
      </div>
    );
  }
}

export default App;