From eac37614d3f17f5a7e1d340eee47a06f72985941 Mon Sep 17 00:00:00 2001 From: llq-yyds <958614130@qq.com> Date: Thu, 16 May 2024 21:51:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=E6=96=B0=E5=A2=9E=20LTrigger?= =?UTF-8?q?=20=E7=9A=84=20children=20=E4=B8=BA=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Trigger/demos/Demo8.tsx | 20 +++++++++++++++----- src/Trigger/index.md | 4 ++-- src/Trigger/index.tsx | 34 ++++++++++++++++------------------ src/Trigger/interface.ts | 17 ++++++++++++++--- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/Trigger/demos/Demo8.tsx b/src/Trigger/demos/Demo8.tsx index ff605f9f..0996a3f0 100644 --- a/src/Trigger/demos/Demo8.tsx +++ b/src/Trigger/demos/Demo8.tsx @@ -1,13 +1,23 @@ -import ScrollTableSelect from './components/ScrollTableSelect'; +import { LTrigger } from 'lighting-design'; export default function Demo8() { return (
无线滚动
- {/* - - */} - + + {(props) => { + console.log('==props====>', props); + return ( +
+ 这里也可以配合虚拟列表实现大量数据{' '} +
+ ); + }} +
); } diff --git a/src/Trigger/index.md b/src/Trigger/index.md index 368a68fa..592feb6c 100644 --- a/src/Trigger/index.md +++ b/src/Trigger/index.md @@ -39,7 +39,7 @@ demo: -### 无线滚动 +### children 为函数 @@ -95,7 +95,7 @@ import { LTrigger } from 'lighting-design'; | tagRender | 自定义渲染 tag `mode=tag`模式下生效 | `(props) => ReactElement \| JSXElementConstructor` | `-` | | onChange | 受控, value 变化时,调用此函数 , **会透传给子组件** | `function(value)` | `-` | | getPopupContainer | 控制渲染到的节点。默认渲染到 body 上 | `(triggerNode: HTMLElement) => HTMLElement` | `() => document.body` | -| children | children 组件会接受到 `open`,`setOpen`,`value`,`onChange` 等参数 | `ReactElement` | `-` | +| children | children 组件或函数会接受到 `open`,`setOpen`,`value`,`onChange` 等参数 | `ReactNode \| (props) => ReactNode` | `-` | ### mode 在子组件中使用时, 子组件 onChange 的调用方式: diff --git a/src/Trigger/index.tsx b/src/Trigger/index.tsx index b517bebe..ced8f923 100644 --- a/src/Trigger/index.tsx +++ b/src/Trigger/index.tsx @@ -18,7 +18,7 @@ const LTrigger: FC = (props) => { disabled = false, overlayArrow = false, destroyOnHide = false, - mode: outMode = 'default', + mode: outMode = 'radio', width = 250, variant, suffixIcon, @@ -56,14 +56,8 @@ const LTrigger: FC = (props) => { const stateLabel: any = state?.[labelKey]; const stateValue = state?.[valueKey]; - const childMode = useMemo(() => { - if (outMode === 'default') return 'radio'; - if (outMode === 'tag') return 'radioTag'; - return outMode; - }, []); - const selectMode = useMemo(() => { - if (outMode === 'default' || outMode === 'radio' || outMode === 'checkbox') { + if (outMode === 'radio' || outMode === 'checkbox') { return void 0; } return 'multiple'; @@ -92,17 +86,21 @@ const LTrigger: FC = (props) => { /> ); + const contentProps = { + // @ts-ignore + value: labelInValue ? state : stateValue, + onChange: setState, + open: isOpen, + setOpen: setIsOpen, + labelInValue, + fieldNames, + mode: outMode, + }; + const content = isValidElement(children) - ? cloneElement(children, { - // @ts-ignore - value: labelInValue ? state : stateValue, - onChange: setState, - open: isOpen, - setOpen: setIsOpen, - labelInValue, - fieldNames, - mode: childMode, - }) + ? cloneElement(children, contentProps) + : typeof children === 'function' + ? children?.(contentProps) : children; return ( diff --git a/src/Trigger/interface.ts b/src/Trigger/interface.ts index 58c69abd..c5fd71fe 100644 --- a/src/Trigger/interface.ts +++ b/src/Trigger/interface.ts @@ -1,7 +1,7 @@ import type { PopoverProps, SelectProps } from 'antd'; import type { ReactNode } from 'react'; -export type LTriggerMode = 'checkboxTag' | 'radioTag' | 'checkbox' | 'radio' | 'tag' | 'default'; +export type LTriggerMode = 'checkboxTag' | 'radioTag' | 'checkbox' | 'radio'; export type LTriggerProps = { maxTagCount?: number | 'responsive'; @@ -92,13 +92,24 @@ export type LTriggerProps = { props: Record, ) => React.ReactElement>; /** - * children 组件 + * children 组件 或 函数返回一个组件 * - 会接受到 open,setOpen,value,onChange * - 必须在 children 组件中绑定 value,onChange 才会收集到数据 * @see 官网 https://llq0802.github.io/lighting-design/latest LTriggerProps */ // children: ReactElement>; - children: ReactNode; + children: + | ReactNode + | ((props: { + // @ts-ignore + value: any; + onChange: any; + open: boolean; + setOpen: any; + labelInValue: boolean; + fieldNames: Record; + mode: LTriggerMode; + }) => ReactNode); selectProps?: SelectProps; popoverProps?: PopoverProps; } & Pick<