From 6b087766cc754a09a5a0b7cfc5e8b9140eb35837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Thu, 11 Sep 2025 15:35:29 +0800 Subject: [PATCH 1/6] refactor: Upgrade utils and replace useMergedState --- package.json | 2 +- src/Collapse.tsx | 46 +++++++++++++++++++++++++--------------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index c61240a..00a6778 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/motion": "^1.1.4", - "@rc-component/util": "^1.0.1", + "@rc-component/util": "^1.3.0", "classnames": "2.x" }, "devDependencies": { diff --git a/src/Collapse.tsx b/src/Collapse.tsx index 1b0b099..02286c9 100644 --- a/src/Collapse.tsx +++ b/src/Collapse.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames'; -import useMergedState from '@rc-component/util/lib/hooks/useMergedState'; +import { useControlledState, useEvent } from '@rc-component/util'; import warning from '@rc-component/util/lib/warning'; import React from 'react'; import useItems from './hooks/useItems'; @@ -7,7 +7,7 @@ import type { CollapseProps } from './interface'; import CollapsePanel from './Panel'; import pickAttrs from '@rc-component/util/lib/pickAttrs'; -function getActiveKeysArray(activeKey: React.Key | React.Key[]) { +function getActiveKeysArray(activeKey: React.Key | React.Key[]): React.Key[] { let currentActiveKey = activeKey; if (!Array.isArray(currentActiveKey)) { const activeKeyType = typeof currentActiveKey; @@ -38,27 +38,31 @@ const Collapse = React.forwardRef((props, ref) => const collapseClassName = classNames(prefixCls, className); - const [activeKey, setActiveKey] = useMergedState([], { - value: rawActiveKey, - onChange: (v) => onChange?.(v as React.Key[]), - defaultValue: defaultActiveKey, - postState: getActiveKeysArray, - }); - - const onItemClick = (key: React.Key) => - setActiveKey(() => { - if (accordion) { - return activeKey[0] === key ? [] : [key]; - } + const [internalActiveKey, setActiveKey] = useControlledState( + defaultActiveKey, + rawActiveKey, + ); + const activeKey = getActiveKeysArray(internalActiveKey); - const index = activeKey.indexOf(key); - const isActive = index > -1; - if (isActive) { - return activeKey.filter((item) => item !== key); - } + const triggerActiveKey = useEvent((next) => { + setActiveKey(next); + if (next !== activeKey) { + onChange?.(next); + } + }); - return [...activeKey, key]; - }); + const onItemClick = (key: React.Key) => { + let keys = [...activeKey, key]; + if (accordion) { + keys = activeKey[0] === key ? [] : [key]; + } + const index = activeKey.indexOf(key); + const isActive = index > -1; + if (isActive) { + keys = activeKey.filter((item) => item !== key); + } + triggerActiveKey(keys); + }; // ======================== Children ======================== warning( From 517d59797ac02f3439c55b64a98c64b6a7ccf830 Mon Sep 17 00:00:00 2001 From: EmilyyyLiu <100924403+EmilyyyLiu@users.noreply.github.com> Date: Thu, 11 Sep 2025 16:04:19 +0800 Subject: [PATCH 2/6] Update src/Collapse.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/Collapse.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Collapse.tsx b/src/Collapse.tsx index 02286c9..b4b7b65 100644 --- a/src/Collapse.tsx +++ b/src/Collapse.tsx @@ -46,8 +46,11 @@ const Collapse = React.forwardRef((props, ref) => const triggerActiveKey = useEvent((next) => { setActiveKey(next); - if (next !== activeKey) { - onChange?.(next); + const nextKeys = getActiveKeysArray(next); + const hasChanged = nextKeys.length !== activeKey.length || + nextKeys.some((key, index) => key !== activeKey[index]); + if (hasChanged) { + onChange?.(nextKeys); } }); From c5b11252a9acc302784552e68d11c059b177e14b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Tue, 16 Sep 2025 16:41:35 +0800 Subject: [PATCH 3/6] feat: chaneg onItemClick --- src/Collapse.tsx | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Collapse.tsx b/src/Collapse.tsx index b4b7b65..da88b51 100644 --- a/src/Collapse.tsx +++ b/src/Collapse.tsx @@ -47,7 +47,8 @@ const Collapse = React.forwardRef((props, ref) => const triggerActiveKey = useEvent((next) => { setActiveKey(next); const nextKeys = getActiveKeysArray(next); - const hasChanged = nextKeys.length !== activeKey.length || + const hasChanged = + nextKeys.length !== activeKey.length || nextKeys.some((key, index) => key !== activeKey[index]); if (hasChanged) { onChange?.(nextKeys); @@ -55,16 +56,21 @@ const Collapse = React.forwardRef((props, ref) => }); const onItemClick = (key: React.Key) => { - let keys = [...activeKey, key]; + let newKeys: React.Key[]; + if (accordion) { - keys = activeKey[0] === key ? [] : [key]; - } - const index = activeKey.indexOf(key); - const isActive = index > -1; - if (isActive) { - keys = activeKey.filter((item) => item !== key); + newKeys = activeKey[0] === key ? [] : [key]; + } else { + const index = activeKey.indexOf(key); + const isActive = index > -1; + if (isActive) { + newKeys = activeKey.filter((item) => item !== key); + } else { + newKeys = [...activeKey, key]; + } } - triggerActiveKey(keys); + + triggerActiveKey(newKeys); }; // ======================== Children ======================== From 11f6838d7f3c464230d5baac35bd879cc819949b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Wed, 17 Sep 2025 11:54:13 +0800 Subject: [PATCH 4/6] feat: modify triggerActiveKey --- src/Collapse.tsx | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/Collapse.tsx b/src/Collapse.tsx index da88b51..f524da9 100644 --- a/src/Collapse.tsx +++ b/src/Collapse.tsx @@ -47,30 +47,19 @@ const Collapse = React.forwardRef((props, ref) => const triggerActiveKey = useEvent((next) => { setActiveKey(next); const nextKeys = getActiveKeysArray(next); - const hasChanged = - nextKeys.length !== activeKey.length || - nextKeys.some((key, index) => key !== activeKey[index]); - if (hasChanged) { + if (JSON.stringify(nextKeys) !== JSON.stringify(activeKey)) { onChange?.(nextKeys); } }); const onItemClick = (key: React.Key) => { - let newKeys: React.Key[]; - if (accordion) { - newKeys = activeKey[0] === key ? [] : [key]; + triggerActiveKey(activeKey[0] === key ? [] : [key]); } else { - const index = activeKey.indexOf(key); - const isActive = index > -1; - if (isActive) { - newKeys = activeKey.filter((item) => item !== key); - } else { - newKeys = [...activeKey, key]; - } + triggerActiveKey( + activeKey.includes(key) ? activeKey.filter((item) => item !== key) : [...activeKey, key], + ); } - - triggerActiveKey(newKeys); }; // ======================== Children ======================== From 228d54e39be13ee921d9933610215dddc0bac244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Wed, 17 Sep 2025 15:12:05 +0800 Subject: [PATCH 5/6] feat: modity triggerActiveKey function --- src/Collapse.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Collapse.tsx b/src/Collapse.tsx index f524da9..6dbba23 100644 --- a/src/Collapse.tsx +++ b/src/Collapse.tsx @@ -47,9 +47,7 @@ const Collapse = React.forwardRef((props, ref) => const triggerActiveKey = useEvent((next) => { setActiveKey(next); const nextKeys = getActiveKeysArray(next); - if (JSON.stringify(nextKeys) !== JSON.stringify(activeKey)) { - onChange?.(nextKeys); - } + onChange?.(nextKeys); }); const onItemClick = (key: React.Key) => { From 241d55224ea99fbfdbde18ab3674831855f90c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Wed, 17 Sep 2025 15:25:52 +0800 Subject: [PATCH 6/6] feat: triggerActiveKey function setValue --- src/Collapse.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Collapse.tsx b/src/Collapse.tsx index 6dbba23..20eeb38 100644 --- a/src/Collapse.tsx +++ b/src/Collapse.tsx @@ -45,8 +45,8 @@ const Collapse = React.forwardRef((props, ref) => const activeKey = getActiveKeysArray(internalActiveKey); const triggerActiveKey = useEvent((next) => { - setActiveKey(next); const nextKeys = getActiveKeysArray(next); + setActiveKey(nextKeys); onChange?.(nextKeys); });