DEV Community

Cover image for ReactJS Hook Pattern ~Prop Render Pattern~
Ogasawara Kakeru
Ogasawara Kakeru

Posted on

ReactJS Hook Pattern ~Prop Render Pattern~

・In addition to the HOC pattern, the Prop Render Pattern enables you to utilise common logic across multiple components. This pattern passes a component down to its child component as a render prop.

function Kelvin({ value = 0 }) {
  return <div className="temp">{value + 273.15}K</div>;
}

function Fahrenheit({ value = 0 }) {
  return <div className="temp">{(value * 9) / 5 + 32}°F</div>;
}

function Input({value, setValue}) {

  return (
    <input
      type="text"
      value={value}
      onChange={e => setValue(e.target.value)}
      placeholder="Temp in °C"
    />
  );
}

export default function App() {
  const [value, setValue] = useState("");

  return (
    <div className="App">
      <h1>☃️ Temperature Converter 🌞</h1>
      <Input value={value} handleChange={setValue} />
      <Kelvin value={value} />
      <Fahrenheit value={value} />
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

・This application works well. This is the lift state up pattern. If there are many child components within a large application that share a state, this pattern can reduce the application's performance, as it renders every child component each time a value is entered into the input element.

function Input(props) {
  const [value, setValue] = useState("");

  return (
    <>
      <input
        type="text"
        value={value}
        onChange={e => setValue(e.target.value)}
        placeholder="Temp in °C"
      />
      {props.render(value)}
    </>
  );
}

export default function App() {
  return (
    <div className="App">
      <h1>☃️ Temperature Converter 🌞</h1>
      <Input
        render={value => (
          <>
            <Kelvin value={value} />
            <Fahrenheit value={value} />
          </>
        )}
      />
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

・The Prop Render Pattern solves the performance issue by passing components as a render prop.

Top comments (0)