【免费下载链接】autoskillsOne command. Your entire AI skill stack. Installed.项目地址https://gitcode.com/gh_mirrors/au/autoskills点击查看免费下载导读在构建可扩展的 React 组件库时最常见的 API 设计分叉点之一就是通过renderX回调属性让调用方注入内容还是直接通过children让调用方自由组合结构本指南以 autoskills 仓库中 composition-patterns 技能包的规则文档 patterns-children-over-render-props.md 为骨架结合仓库内配套的 compound components、explicit variants 等规则源码讲清二者的适用边界与重构路径。读完你将掌握如何用 children 重构满是renderX属性的组件、如何用复合组件Compound Components实现自然组合以及何时保留 render props 才是正确选择。规则速览为什么 children 优于 render props该规则属于 composition-patterns 技能包中优先级第 3 的「Implementation Patterns实现模式」类别前缀patterns-影响级别为MEDIUM官方给出的影响描述是「cleaner composition, better readability」更干净的组合、更好的可读性。规则核心只有一句话使用children进行组合而不是renderX属性。children 更易读、能自然组合且调用方无需理解回调签名。它要解决的现实痛点非常具体当组件为了灵活而暴露出renderHeader、renderFooter、renderActions等一系列回调属性时调用方被迫为每个插槽编写匿名函数而这些函数的签名() React.ReactNode本身就是一种隐式契约增加理解成本。与其用插槽配置驱动渲染不如把渲染结构本身交给调用方。反模式剖析被 render props 淹没的 Composer规则文档给出了一个典型的反模式示例。假设要做一个消息编辑器组件你最初可能这样设计function Composer({ renderHeader, renderFooter, renderActions, }: { renderHeader?: () React.ReactNode renderFooter?: () React.ReactNode renderActions?: () React.ReactNode }) { return ( form {renderHeader?.()} Input / {renderFooter ? renderFooter() : DefaultFooter /} {renderActions?.()} /form ) } // Usage is awkward and inflexible return ( Composer renderHeader{() CustomHeader /} renderFooter{() ( Formatting / Emojis / / )} renderActions{() SubmitButton /} / )这段代码的问题可以从三个层面拆解调用方被迫理解回调签名每个renderX都是() React.ReactNode类型的函数调用方必须知道该传函数而非元素出错时类型错误信息也更难读。结构与数据分离的断裂感调用方真正想表达的是页头放 CustomHeader页脚放 Formatting 和 Emojis却被包装成一组属性回调语义被稀释。默认值逻辑隐藏在组件内部renderFooter ? renderFooter() : DefaultFooter /这种条件渲染把何时使用默认值的决策埋进组件实现里每增加一个插槽组件内部的条件分支就多一层。从仓库的配套规则看这类renderX 布尔开关showAttachments、showFormatting的组合正是 architecture-avoid-boolean-props.md 与 architecture-compound-components.md 反复批判的monolithic component with render props带 render props 的巨石组件形态——组件越大回调插槽与布尔开关越多可维护性越差。正解children 复合组件实现自然组合规则给出的正确做法是把Composer拆成一组接受children的小组件并通过命名空间导出成复合组件compound componentfunction ComposerFrame({ children }: { children: React.ReactNode }) { return form{children}/form } function ComposerFooter({ children }: { children: React.ReactNode }) { return footer classNameflex{children}/footer } // Usage is flexible return ( Composer.Frame CustomHeader / Composer.Input / Composer.Footer Composer.Formatting / Composer.Emojis / SubmitButton / /Composer.Footer /Composer.Frame )对比重构前后的调用方代码可以看到几个决定性变化JSX 层级即 UI 层级Composer.Footer里放什么页脚就渲染什么结构与视觉完全对应不再需要翻译回调属性名。任意嵌套与顺序自由调用方可以随意增删、重排子元素——例如在CustomHeader与Composer.Input之间再插入一个提示条无需改动Composer本体。共享命名空间减少认知负担Composer.Frame、Composer.Input、Composer.Footer通过同一个Composer对象导出调用方一目了然这些部件属于同一家族。这种复合组件 共享 context的完整形态在配套规则 architecture-compound-components.md 中有更完整的实现子组件通过 context在 React 19 中直接使用use(ComposerContext)读取共享的state、actions、meta而非通过 props 层层传递从而避免 prop drilling。何时该用 render props数据回传场景规则文档明确给出了 render props 的合法适用场景——当父组件需要把数据或状态回传给子组件时// Render props work well when you need to pass data back List data{items} renderItem{({ item, index }) Item item{item} index{index} /} /这里的关键差异在于数据流向render props 用于数据回传List拥有items数据需要在渲染每个Item时把item和index交给调用方——这是一种父组件持有数据、子组件负责展示的倒置关系回调参数{ item, index }是必要的接口。children 用于静态结构组合Composer.Footer不持有需要传递给调用方的数据调用方只是摆放已经定义好的 UI 片段此时回调参数没有任何信息量children 自然更合适。判断准则可以凝练为一句话原文当父组件需要向子组件提供数据或状态时使用 render props当组合的是静态结构时使用 children。从 React 生态惯例看renderItem、renderIcon这类为每条数据渲染一行/一项的回调是 render props 的经典合理用法而在容器里放什么内容则几乎永远属于 children 的职责。把二者区分清楚组件 API 才会既灵活又直觉。从规则到实践三种模式的协同这条规则并不是孤立的技巧它与 composition-patterns 技能包的其他规则共同构成一套完整的组件设计方法论。仓库的 README.md 将其归纳为四条核心原则组合优于配置Composition over configuration——与其不断加 props不如让调用方自由组合提升状态Lift your state——状态放在 Provider 中而不是困在组件内部组合内部实现Compose your internals——子组件通过 context 访问状态而不是通过 props显式变体Explicit variants——创建ThreadComposer、EditComposer而不是带isThread开关的Composer。与本规则直接呼应的配套规则包括architecture-compound-components.mdHIGH给出了ComposerContextComposer.Provider 各子组件 命名空间导出的完整复合组件实现说明每个子组件通过 context 而非 props 访问共享状态。其中ComposerInput、ComposerSubmit均通过use(ComposerContext)消费 context——这是 React 19 的写法对应 react19-no-forwardref.md 中用use()取代useContext()的要求。若项目仍停留在 React 18 及以下需改为useContext(ComposerContext)并在规则文档标注的 React 19 only 前提下调整。patterns-explicit-variants.mdMEDIUM主张与其一个组件配多个布尔开关不如创建显式变体组件每个变体明确自己使用哪个 Provider、包含哪些 UI 元素、暴露哪些动作。这与 children 组合天然互补——变体组件内部正是通过Composer.Frame children 结构拼装出来的。architecture-avoid-boolean-props.mdCRITICAL从源头说明为什么不能用isThread、isEditing这类布尔属性驱动渲染——每个布尔开关都会让可能的状态组合翻倍最终形成无法维护的条件逻辑。三者的演进路径通常是先意识到布尔开关爆炸avoid-boolean-props→ 用显式变体收敛explicit-variants→ 变体内部通过 children 复合组件自由组合本规则→ 状态由 Provider 通过 context 注入compound-components。本规则是这条链路里表达层的关键一环它决定了组件对外暴露的到底是一组回调插槽还是一棵可自由组装的 JSX 树。重构清单把 renderX 属性迁移到 children结合上述分析给出一个可操作的重构检查清单清点所有renderX属性逐一判断该插槽是否涉及数据从父组件流向子组件。若回调签名是() ReactNode无参数100% 可以迁移到 children若回调接收item、index、value等数据参数则需要评估数据从何而来。把无参插槽替换为 children 结构将{renderFooter?.()}这类调用替换为Footer{children}/Footer把默认值逻辑renderFooter ? renderFooter() : DefaultFooter /下沉为调用方不放东西就是默认。保留真正的 render propsdata驱动的列表、表格等组件继续使用renderItem{({ item, index }) ...}这是合理的接口设计不必为了统一而强行改写。组合显式变体参照 patterns-explicit-variants.md为不同业务形态创建ThreadComposer、EditMessageComposer等显式组件内部用 children 拼装共享部件。配合复合组件与 context若多个子组件需要共享状态参照 architecture-compound-components.md 引入 Provider context 的复合组件结构。仓库中的定位与使用方式本规则文档位于 autoskills 仓库的技能注册表内完整路径为 patterns-children-over-render-props.md。它同时被编译进 AGENTS.md 的 3.2 节供 Agent 与 LLM 在维护、生成或重构 React 代码库时遵循。在技能注册体系中composition-patterns 与 React 技术栈绑定仓库的 skills-map.ts 在检测到项目安装了react/react-dom依赖时会将vercel-labs/agent-skills/composition-patterns纳入 React 技术对应的技能列表skills-registry/index.json 中composition-patterns条目则记录了其来源vercel-labs/agent-skills、提交哈希ce3e64e4...与包含的全部文件清单便于溯源与版本追踪。每个规则文件都遵循统一的 rules/_template.md 结构——frontmatter标题、影响级别、影响描述、标签 简短解释 错误示例 正确示例 参考资料。这种一规则一文件、错误/正确成对示例的格式正是为了让规则既能被人类快速阅读也能被 Agent 精准检索与引用。总结children 是组合静态结构的默认选择它可读、可嵌套、可重排调用方无需理解任何回调签名。render props 是为数据回传保留的接口当父组件持有数据、需要把item/index之类的值交给子组件渲染时renderItem是合理且必要的设计。判断标准是数据流向而非个人偏好无参插槽用 children有参回调用 render props。这条规则是复合组件方法论的一部分与 compound components、explicit variants、avoid boolean props 等规则协同共同支撑组合优于配置的组件设计原则。赞分享【免费下载链接】autoskillsOne command. Your entire AI skill stack. Installed.项目地址https://gitcode.com/gh_mirrors/au/autoskills点击查看免费下载相关推荐React 组件组合优先使用 children 组合而非 render props组合优于配置React 组件组合优先使用 children 组合而非 render props组合优于配置 组件 API 的设计直接决定代码库的可维护性与可读性。在前端教程OpenMontage 组合式 React 组件开发指南优先用 children 组合而非 render propsOpenMontage 组合式 React 组件开发指南优先用 children 组合而非 render props 本文以 OpenMontage 仓库内置人工智能AI Agent音视频媒体生成工作流自动化Next.js 组合模式实战优先用 children 组合而非 render propsNext.js 组合模式实战优先用 children 组合而非 render props 导读 本文聚焦 Vercel 出品的 React 组合模式规范前端UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考