Render Prop Pattern

  1. Introduction
    The render props pattern in React is a technique for sharing code between components using a prop whose value is a function. This pattern allows you to pass dynamic content or behavior to a component, making it more flexible and reusable. Here's a detailed explanation of the render props pattern,
    i) What is Render Prop -
    A render prop is a function prop that a component uses to know what to render. Instead of using the traditional method of passing static data or JSX, you pass a function that returns JSX. This function can accept arguments, typically state or other data, which allows for dynamic rendering based on the component's logic.
    ii) Why Use Render Props? -
    Code Reuse: They enable the reuse of logic across multiple components without duplicating code.

    Separation of Concerns: They help separate the logic from the presentation, making components more modular and easier to manage.
    Composition: They facilitate the composition of components in a flexible way, allowing for more dynamic and customized UIs.
    iii) How to Implement Render Props -
    Create a Component with a Render Prop: Define a component that takes a function as a prop. This function will be called within the component's render method.
    Call the Render Prop: Within the component, call the render prop function, passing any necessary arguments (e.g., state or data).
    Use the Render Prop: When using the component, pass a function to the render prop that returns the desired JSX.

  2. Example

     import React from "react";
    
      const Cat = ({mouse}) => {
        return (
          <img
            src="/cat.png"
            alt="cat"
            style={{ position: "absolute", left: mouse.x, top: mouse.y }}
          />
        );
      };
    
      const Mouse = (props) => {
        const [state, setState] = React.useState();
    
        const handleMouseMove = (event) => {
          setState({
            x: event.clientX,
            y: event.clientY
          });
        };
    
        return (
          <div style={{ height: "100vh" }} onMouseMove={handleMouseMove}>
            {props.render(state)}
          </div>
        );
      };
    
      const MouseTracker = () => {
        return (
          <div>
            <h1>Move the mouse around!</h1>
            <Mouse render={(mouse) => <Cat mouse={mouse} />} />
          </div>
        );
      };
    
      export const App = () => {
        return (
          <div className="App">
            <MouseTracker />
          </div>
        );
      }
    
  3. Benefits of Render Props
    Flexibility: You can pass different render functions to customize the behavior and appearance of the component.
    Encapsulation: The component logic (e.g., tracking mouse position) is encapsulated within the MouseTracker component, while the rendering logic is provided by the parent component.
    Reusability: The same component can be reused with different render props to achieve different results without modifying the component itself.