Hello 🙋🏻‍♀️

Renée Ghattas

Software Developer @ Qlik

Sharing Logic across React Components

React Timeline

My React Timeline

November 28, 2017

  • First time using React in a professional setting
  • First exposure to Higher-order Components (HOCs)

Higher-order Component (HOC)

A higher-order component is a function that takes a component and returns a new component.

    // Take in a component as argument WrappedComponent
    function simpleHOC(WrappedComponent) {
      // And return a new anonymous component
      return class extends React.Component{
        render() {
          return <WrappedComponent {...this.props}/>;
        }
      }
    }

Basic example:

Going back to this...

export default connect(mapStateToProps, mapDispatchToProps)(MyFancyComponent)

Redux: connect HOC

The connect HOC connects a component to the Redux store.

Negatives of using HOCs

  • Changes component hierarchy
<withRedux>
  <withAuth>
    <withLogging>
      <withLayout>
        <MyFancyComponent />
      </withLayout>
    </withLogging>
  </withAuth>
</withRedux>
  • Very verbose
  • Hard to debug
  • Reordering HOCs can break things
  • Prop collisions - HOCs with same prop names

A few months later...

Render props

Render props

  • The component just injects functionality without needing to know how it is being applied to the UI.
  • Uses a render prop whose value is a function.
import React from 'react';

const SECRET_TO_LIFE = 42;

class ShareSecretToLife extends React.Component {
  render() {
    return (
      <div>
       {this.props.render({ secretToLife: SECRET_TO_LIFE })}
      </div>
    );
  }
}
const ShareSecretWithWorld = () => (
  <ShareSecretToLife 
    render={({ secretToLife }) => (
      <h1>{secretToLife}</h1>
    )}
  />
);

Negatives of using Render props

  • Nested render props (wrapper hell)
  • Can clutter up your render method
  • Still pretty verbose
  • Makes it difficult to unit test component in isolation
  • Pure components: can negate the advantage that comes from using React.PureComponent

February 6, 2019

🤔

 Forget everything you've learned about React...

Lol jk.

  • Use state and other React features without classes.
  • It's just a function.
  • Do not change component hierarchy.
  • Allows splitting a component into smaller reusable functions (rather than forcing a split based on lifecycle methods).
  • LESS CODE!
  • Work side-by-side with existing code so you can adopt them gradually.

Hooks (specifically, custom hooks)

Sounds good?

  • Easier to compose (static)
  • One level of HOC (and you're using class components)

How do you choose?

HOCs:

const page = compose(
  withRedux,
  withAuth,
  withLogging,
  withLayout('default'),
);

Render props:

  • Easier to set up than HOCs
  • Dynamic composition
  • Less boiler code
  • Can use both props and state in render props component.
  • You're using class components.

Hooks:

  • Should be able to satisfy most needs for reusing component logic. Look here first.

My thoughts...

  • I'm a big fan of hooks.
  • New projects: Start with hooks.
  • Existing projects: Reevaluate your HOC and render prop usage, but don't go crazy.
  • Class components, HOCs and render props are not going anywhere.

Going back to this...

import { useSelector, useDispatch } from 'react-redux'

Instead of using connect() HOC...

export default connect(mapStateToProps, mapDispatchToProps)(MyFancyComponent)

Thanks!

Sharing Logic across Components

By Renee Ghattas

Sharing Logic across Components

  • 516