From 4d6c2b58e52bbe7b9a370360e92d3fc91a885eca Mon Sep 17 00:00:00 2001 From: lumir Date: Sun, 17 May 2026 21:51:55 +0900 Subject: [PATCH 1/3] fix(usePrevious): opt out `usePrevious` hook from React Compiler --- packages/core/src/hooks/usePrevious/usePrevious.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/src/hooks/usePrevious/usePrevious.ts b/packages/core/src/hooks/usePrevious/usePrevious.ts index 10e7cd52..905b46b5 100644 --- a/packages/core/src/hooks/usePrevious/usePrevious.ts +++ b/packages/core/src/hooks/usePrevious/usePrevious.ts @@ -21,6 +21,10 @@ const strictEquals = (prev: T, next: T) => prev === next; * const previousCount = usePrevious(count); */ export function usePrevious(state: T, compare: (prev: T, next: T) => boolean = strictEquals): T { + // Without `'use no memo'`, React Compiler throws when `panicThreshold` is not `'none'` + // because this hook intentionally violates React's refs rules. + 'use no memo'; + const prevRef = useRef(state); const currentRef = useRef(state); const isFirstRender = useRef(true); From cfd56fdf317922e7854cb1835d5f5b3dc8ae8a20 Mon Sep 17 00:00:00 2001 From: lumir Date: Sun, 17 May 2026 22:00:48 +0900 Subject: [PATCH 2/3] Opt out `usePrevious` hook from React Compiler Opt out the `usePrevious` hook from React Compiler to prevent issues. --- .changeset/cool-spies-change.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/cool-spies-change.md diff --git a/.changeset/cool-spies-change.md b/.changeset/cool-spies-change.md new file mode 100644 index 00000000..006350d9 --- /dev/null +++ b/.changeset/cool-spies-change.md @@ -0,0 +1,5 @@ +--- +'react-simplikit': patch +--- + +fix(usePrevious): opt out `usePrevious` hook from React Compiler From dea2eed53531d9d1212710e9b87628bb202bbf5e Mon Sep 17 00:00:00 2001 From: lumir Date: Sun, 17 May 2026 22:02:00 +0900 Subject: [PATCH 3/3] Update comment in usePrevious hook Clarify comment about React refs rules in usePrevious hook. --- packages/core/src/hooks/usePrevious/usePrevious.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/hooks/usePrevious/usePrevious.ts b/packages/core/src/hooks/usePrevious/usePrevious.ts index 905b46b5..627d8ca9 100644 --- a/packages/core/src/hooks/usePrevious/usePrevious.ts +++ b/packages/core/src/hooks/usePrevious/usePrevious.ts @@ -22,7 +22,7 @@ const strictEquals = (prev: T, next: T) => prev === next; */ export function usePrevious(state: T, compare: (prev: T, next: T) => boolean = strictEquals): T { // Without `'use no memo'`, React Compiler throws when `panicThreshold` is not `'none'` - // because this hook intentionally violates React's refs rules. + // because this hook intentionally reads and updates refs during render. 'use no memo'; const prevRef = useRef(state);