Render Props 的本质就是给一个组件传入一个 render 方法,组件根据这个方法来进行渲染
// 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>
)
}
// App.js
export default function App() {
return (
<div className="container">
<Mouse>
{position => ( ... ) } }
</Mouse>
</div>
)
}