Render Props

Render Props

Render Prop 是一种在组件之间共享代码的方法,通过传入一个值为函数的 prop 来实现。

这个传入的函数 prop 会返回一个 React 元素,接受这个函数 prop 的组件会调用这个函数来完成渲染。

Render Props 的本质就是给一个组件传入一个 render 方法,组件根据这个方法来进行渲染

简单案例

构建一个 Mouse 组件,它可以实现自定义鼠标指针效果。通过传入一个 render prop 来指明需要的鼠标样式。

// mouse/index.jsx
import { useState } from "react";

// 鼠标指正的具体元素由传入的 render 函数负责渲染
// Mouse 组件只负责监听鼠标移动事件,并且根据传入的 render prop 将自定义鼠标元素渲染到指定位置
export default function Mouse({ render = undefined }) {
    const [position, setPosition] = useState({ x: 0, y: 0 })

    function handleMouseMove(e) {
        setPosition({ x: e.clientX, y: e.clientY })
    }
    
    return (
        <div onMouseMove={handleMouseMove} style={{ position: 'fixed', width: '100vw', height: '100vh' }}>
            {render(position)}
        </div>
    )
}
// App.js

// 调用 Mouse 组件的时候,传入一个 render 函数,来指定具体渲染的内容
export default function App() {
    return (
        <div className="container">
            <Mouse render={position => {
                return (
                    <div style={{ position: 'fixed', left: position.x, top: position.y }}>
                        <img src={cursor} alt='cursor' />
                    </div>
                )
            }} />
        </div>
    )
}

传入的 prop 名称不一定必须是 'render'

其实这个 render 函数的名字可以使任意的,也可以利用 children props

// App.js

export default function App() {
    return (
        <div className="container">
            <Mouse>
                {position => ( ... ) }                }
            </Mouse>
        </div>
    )
}

Last updated