Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between passing component to Route as prop and wrapping component in render function

What is the difference between routing to a component like this:

 <Route path="coolPath" component={MyComponent} />
or
 <Route path="coolPath" render={props => <MyComponent {...props} customProp="s" } />

To this:

 <Route path"=coolPath">
      <MyComponent />
 </Route>
or
 <Route path"=coolPath">
      <MyComponent cusomProps="cp"/>
 </Route>
like image 669
TheNormalPerson Avatar asked Dec 09 '19 20:12

TheNormalPerson


People also ask

What is the difference between render and component in the route component?

render makes the component mount just once, then re-render when required. The component stays in the background — this means that anything you put in componentDidMount , constructor , or, for example, shouldComponentUpdate , will run only once!

What is the difference between render and component prop on React router?

When you use component (instead of render or children , below) the router uses React. createElement to create a new React element from the given component. That means if you provide an inline function to the component prop, you would create a new component every render.

Can I pass props to route component?

This allows you to use the component anywhere, which makes the component easier to reuse and test.

What are the prop choice for how you render a component for a given route?

Route props These props are called history , match and location . They are used as help in navigating our application and they can be passed down to components as well.


1 Answers

first you should read through this site:
https://reacttraining.com/react-router/web/api/Route

But to explain, there's three things going on here, the first two are examples of routing with previous version of react-router (before v5) and the third is react-router (v5 - current) recommended approach.

1. Route with component

<Route path="/coolPath" component={MyComponent} />

This type of route renders the single component passed to the prop. If an inline function is passed to the Route's component prop, it will unmount and remount the component on every render via the use of React.createElement. This can be inefficient, and passing custom props via this method is only possible via an inline function. React Router's authors recommend using the render prop as opposed to the component prop for handling inline functions, as shown below.

2. Route with render

<Route path="/coolPath" render={props => <MyComponent {...props} customProp="s" } />

Instead of having a new React element created for you using the component prop with an inline function, this route type passes in a function to be called when the location matches and does not unmount a component and remount a brand new one during rerender. It's also much easier to pass custom props via this method.

3. Route with children as components

<Route path="/coolPath">
    <MyComponent customProp="s" />
</Route>

This is currently the recommended approach to routing, the child components will be rendered when the path is matched by the router. It's also very easy to pass custom props with this method.



Keep in mind there is a fourth type, which is:

4. Route with children as function

From reacttraining.com:

import React from "react";
import ReactDOM from "react-dom";
import {
  BrowserRouter as Router,
  Link,
  Route
} from "react-router-dom";

function ListItemLink({ to, ...rest }) {
  return (
    <Route
      path={to}
      children={({ match }) => (
        <li className={match ? "active" : ""}>
          <Link to={to} {...rest} />
        </li>
      )}
    />
  );
}

ReactDOM.render(
  <Router>
    <ul>
      <ListItemLink to="/somewhere" />
      <ListItemLink to="/somewhere-else" />
    </ul>
  </Router>,
  node
);

Sometimes you need to render whether the path matches the location or not. In these cases, you can use the function children prop. It works exactly like render except that it gets called whether there is a match or not.

like image 117
Mike Abeln Avatar answered Sep 24 '22 17:09

Mike Abeln