0

First time working with React.js and I wanted to do something pretty simple.

I created an app.js that loads up the initial page that has my navigation and spits out the children props.

Instead of putting the navigation in the app.js file, I would like to create another component or partial to render it.

Code below:

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;

What I would like:

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 Answers 3

2

The ideal way to do this would be by making a stateless functional component. Since you are not making changes based on the state for the navigation component, you can make it as a light weight Stateless functional component that just renders the required view for you.

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;

Now you can import this in you App.js file:

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;

You can read more about Stateless Functional Components here.

Sign up to request clarification or add additional context in comments.

Comments

1

Write it like this:

First create a separate component that contains only Navigation part of the application like this:

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;

Then import this navigation file in your App component and render it directly inside render like this:

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;

Comments

0

You can create another component as NavLinks and since it doesn't have any state you can create it as a stateless component and import in App like

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;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.