👨‍💻
Hong's 前端笔记
  • 🌈About
  • JavaScript
    • 作用域
    • 闭包
    • this
      • bind()
    • 原型
      • Object.create()
      • 模拟“类”
      • ES6 Class
      • Function
    • 对象
    • 类型 & 值
      • 原生函数
      • 数组
      • 字符串
    • 异步
    • JavaScript 相关概念
      • Event Loop 事件循环
      • Prototype 原型
      • Context 执行上下文
      • this
      • Promise
    • JavaScript 常见问题
      • 手写实现
      • 看代码输出
  • React
    • 核心概念
    • 深入理解
      • State
      • 如何管理 State
      • React 渲染过程
      • 处理 DOM 事件
      • Pure 组件
      • Context
      • Key 属性
      • React.lazy()
      • Render Props
    • Hooks
      • useState
      • useRef
      • useEffect
        • Some details
      • 相关概念
      • 自定义 Hook
      • useEffect vs useLayoutEffect
    • React 相关问题
      • Class vs Function
  • React Libraries
    • Redux
      • Quick Start
      • 如何持久化 Redux 数据
      • 异步操作
      • 性能优化
      • Dive into immutability
    • Route v6
      • Quick Start
  • Reactivity
    • Immer
  • Vue
    • 深入理解
      • Composition vs Options
      • Reactivity
  • Network
    • Cookies
    • HTTP
    • HTTPS
    • CORS 跨域资源共享
    • 认证手段
    • 安全相关
    • 网络相关知识
  • Browser
    • DOM 操作
    • Events 事件
    • XHR & Fetch
    • 性能优化
    • HTML 相关概念
    • 浏览器相关概念
  • CSS
    • 盒模型
    • Layout 布局
    • Styles 样式
    • CSS 相关概念
    • CSS 相关技巧
      • 移动端适配
      • Flex
      • 动画
  • TypeScript
    • Quick Peek
    • Types in TypeScript
    • Narrowing
    • Functions in TypeScript
  • Workflow
    • Webpack
      • Webpack 概念
      • 资源管理
      • 管理输出
      • 开发环境配置
      • 生产环境配置
      • 优化代码运行性能
  • Others
    • 小程序与原生 Web 的区别
  • SSO
    • About
    • API Doc
    • 接入指南
Powered by GitBook
On this page
  • Render Props
  • 简单案例
Edit on GitHub
  1. React
  2. 深入理解

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 1 year ago

iShot2022-05-06_00.21.38