本库有几处 children 是双形态的:普通 ReactNode,或 (values) => ReactNode
的函数。resolveRenderChildren 是这个契约的唯一解析器 —— 封装层算好状态和默认
组合,把两种形态收敛成一个 ReactNode。语义(连同下面那条 nullish 回落)沿用当年
RAC useRenderProps 的收尾行为:
import { resolveRenderChildren } from '@gedatou/cadenza-utils'
resolveRenderChildren(children, values, defaultChildren?)- 函数 children:以
values外加defaultChildren为参数调用; - 节点 children:原样使用;
- 两条路的 nullish 结果都回落到
defaultChildren—— 收尾是computedChildren ?? defaultChildren,所以函数返回null拿到的是默认组合 而不是空白。「渲染空」靠不给defaultChildren表达,不靠在它头上返回null。
行为的规格书是 packages/utils/test/resolve-render-children.test.ts。
库内用法
SearchField:在自己的 render 体里解析调用方 children,把默认组合 (InputGroup+ 搜索图标 + 输入框 + 清除按钮)作为defaultChildren传入 —— 函数 children 于是可以「在默认组合基础上加」而不必重造;InfiniteCombobox:解析 trigger 的双形态 children,不给defaultChildren—— 触发器没有默认长相,必须由调用方给。
业务层给组件再包一层、需要同款「传 ReactNode 或按状态渲染」契约时,直接用它。