Skip to content

fix(useDelayState): cancel pending updates on unmount - #806

Merged
yoyo837 merged 1 commit into
react-component:masterfrom
nrps9909:codex/cancel-delay-state-on-unmount
Sep 17, 2026
Merged

yoyo837 merged 1 commit into
react-component:masterfrom
nrps9909:codex/cancel-delay-state-on-unmount

Conversation

@nrps9909

@nrps9909 nrps9909 commented Aug 26, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • cancel a pending animation-frame or timeout update when useDelayState unmounts
  • reuse the hook's existing cancelPending path for cleanup
  • cover both supported delay modes with regression tests

Problem

useDelayState cancels pending work before scheduling a replacement, but it did not cancel that work on unmount. In React 19/Vitest environments this can leave the callback alive beyond jsdom teardown and surface errors such as window is not defined.

Fixes #805.

Verification — September 17, 2026

Rebased onto current master (c241125); signed/GitHub-Verified head: c3e4e08f2fb6b69da4e1caa84c65c22765d97f8f.

  • Full suite: 30 suites, 199 tests passed; 1 test skipped.
  • TypeScript, ESM/CJS/declaration build, focused ESLint (0 errors), Prettier and diff checks passed.
  • GitHub signatures and changed-file blobs were checked against the local branch.
  • Includes upstream fix: resolve pre-existing test failures on master #815, which fixes the prior pickAttrs and React-17 fallback test failures.
  • Upstream CI: ✅ test currently action_required. A maintainer must approve the fork workflow before it can run.
  • Vercel preview still requires upstream team authorization.

The cleanup retains [cancelPending]: useEvent returns a stable callback, so this preserves unmount cleanup and satisfies the hook dependency contract.

AI assistance disclosure

Codex assisted with implementation, conflict resolution, regression tests, and validation.

Summary by CodeRabbit

  • Bug 修复

    • 修复组件卸载时仍执行延迟状态更新的问题。
    • 组件卸载后会自动取消待处理的动画帧或定时器,避免意外更新。
  • 测试

    • 增加针对帧数和毫秒延迟场景的卸载清理测试。

@vercel

vercel Bot commented Aug 26, 2026

Copy link
Copy Markdown

@nrps9909 is attempting to deploy a commit to the React Component Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Aug 26, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 25da6cbb-dd06-4287-be3e-53340ba0d428

📥 Commits

Reviewing files that changed from the base of the PR and between d1045f4 and cb17e58.

📒 Files selected for processing (2)
  • src/hooks/useDelayState.ts
  • tests/useDelayState.test.tsx

Included review availability: Your plan provides up to 4 included reviews per hour; 3 remain after this review.


Walkthrough

useDelayState 现在会在组件卸载时调用 cancelPending,取消待处理的 requestAnimationFrame 或定时器更新。新增参数化测试覆盖两种延迟方式,并验证卸载后定时器已清除。

Changes

延迟状态清理

Layer / File(s) Summary
卸载清理与参数化验证
src/hooks/useDelayState.ts, tests/useDelayState.test.tsx
组件卸载时调用 cancelPending。测试覆盖帧延迟和毫秒延迟,并确认卸载后所有定时器均已清除。

Estimated code review effort: 2 (简单) | ~10 minutes

Merge Risk: ⚪ Minimal · up to cb17e

This localized change cancels pending delayed updates when the hook unmounts, with regression tests covering both delay modes. No actionable merge-blocking risk remains after normal checks and review.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed PR 实现了 Issue #805 的核心要求:组件卸载时调用现有的 cancelPending,取消 timeout 和 animation-frame 模式下的待处理更新,并增加对应回归测试。
Out of Scope Changes check ✅ Passed 代码变更和测试变更均直接服务于 Issue #805 及 PR 目标,未发现无关或超出范围的修改。
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 2 files.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 标题准确概括了主要变更:在 useDelayState 卸载时取消待处理更新。标题简洁、明确,并与代码和测试变更一致。
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

小兔挥爪,帧与定时器停止奔跑
卸载发生,待处理更新安静退场
两种延迟,都经过测试检查
定时器清空,窗口不再惊慌
代码轻轻落地,耳朵闪闪发光

Comment @coderabbitai help to get the list of available commands.

@Pareder

Pareder commented Sep 15, 2026

Copy link
Copy Markdown

@zombieJ @yoyo837 Could you please review?

@yoyo837

yoyo837 commented Sep 15, 2026

Copy link
Copy Markdown
Member

CI failed.

@pushkedra

Copy link
Copy Markdown

On "CI failed" — the two failures in test / react component workflow are
tests/utils.test.ts › pickAttrs › forwards every React DOM event handler and
tests/hooks-17.test.tsx › useId › fallback of React 17 or lower. Neither touches useDelayState, and neither file is in this diff (2 files, +17/−0). A rebase and re-run would confirm they are pre-existing — I could not check that from outside, as the test workflow has not run on master recently.

One note on the change: the cleanup is useEffect(() => cancelPending, [cancelPending]), while the sibling copy in @rc-component/picker uses []. cancelPending comes from useEvent, so the two are equivalent today — but [] states the intent better: were that identity ever to change, the effect would re-run and its cleanup would cancel a live pending update.

We hit #805 independently on antd 6; numbers posted there. The fix matches the diagnosis.

@nrps9909
nrps9909 force-pushed the codex/cancel-delay-state-on-unmount branch from cb17e58 to c3e4e08 Compare September 17, 2026 08:16
@nrps9909

Copy link
Copy Markdown
Contributor Author

Rebased onto current master (c241125); signed/GitHub-Verified head: c3e4e08f2fb6b69da4e1caa84c65c22765d97f8f.

  • Full suite: 30 suites, 199 tests passed; 1 test skipped.
  • TypeScript, ESM/CJS/declaration build, focused ESLint (0 errors), Prettier and diff checks passed.
  • GitHub signatures and changed-file blobs were checked against the local branch.
  • Includes upstream fix: resolve pre-existing test failures on master #815, which fixes the prior pickAttrs and React-17 fallback test failures.
  • Upstream CI: ✅ test currently action_required. A maintainer must approve the fork workflow before it can run.
  • Vercel preview still requires upstream team authorization.

The cleanup retains [cancelPending]: useEvent returns a stable callback, so this preserves unmount cleanup and satisfies the hook dependency contract.

@codecov

codecov Bot commented Sep 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 86.78%. Comparing base (c241125) to head (c3e4e08).

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #806      +/-   ##
==========================================
+ Coverage   86.77%   86.78%   +0.01%     
==========================================
  Files          41       41              
  Lines        1096     1097       +1     
  Branches      397      382      -15     
==========================================
+ Hits          951      952       +1     
  Misses        143      143              
  Partials        2        2              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@yoyo837
yoyo837 merged commit 335e3cf into react-component:master Sep 17, 2026
11 of 12 checks passed
kallesiukolaa pushed a commit to Technarion-Oy/thaw that referenced this pull request Oct 26, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [antd](https://ant.design)
([source](https://redirect.github.com/ant-design/ant-design)) | [`6.6.6`
→ `6.6.7`](https://renovatebot.com/diffs/npm/antd/6.6.6/6.6.7) |
![age](https://developer.mend.io/api/mc/badges/age/npm/antd/6.6.7?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/antd/6.6.6/6.6.7?slim=true)
|

---

### Release Notes

<details>
<summary>ant-design/ant-design (antd)</summary>

###
[`v6.6.7`](https://redirect.github.com/ant-design/ant-design/releases/tag/6.6.7)

[Compare
Source](https://redirect.github.com/ant-design/ant-design/compare/6.6.6...6.6.7)

- 🐞 Fix antd failing to load in some production builds when the React
version export is unavailable.
[#&#8203;59560](https://redirect.github.com/ant-design/ant-design/pull/59560)
[react-component/util#810](https://redirect.github.com/react-component/util/pull/810)
[@&#8203;github-actions](https://redirect.github.com/apps/github-actions)
[@&#8203;nrps9909](https://redirect.github.com/nrps9909)
- 🐞 Fix Button, Form, Slider, Typography, and Upload triggering delayed
state updates after unmounting.
[#&#8203;59560](https://redirect.github.com/ant-design/ant-design/pull/59560)
[react-component/util#806](https://redirect.github.com/react-component/util/pull/806)
[@&#8203;github-actions](https://redirect.github.com/apps/github-actions)
[@&#8203;nrps9909](https://redirect.github.com/nrps9909)
- 🐞 Fix Select, TreeSelect, Cascader, and Mentions `popupRender` content
inheriting Form.Item validation status and feedback icons.
[#&#8203;59463](https://redirect.github.com/ant-design/ant-design/pull/59463)
[@&#8203;huytdps13400](https://redirect.github.com/huytdps13400)
- 🐞 Fix Popover and Popconfirm preset `color` not applying to the panel
background.
[#&#8203;59549](https://redirect.github.com/ant-design/ant-design/pull/59549)
[@&#8203;dogledogle](https://redirect.github.com/dogledogle)
- Form
- 🐞 Fix Form custom `shouldUpdate` comparisons missing updates when
nested fields with `preserve={false}` are unmounted.
[#&#8203;59560](https://redirect.github.com/ant-design/ant-design/pull/59560)
[react-component/util#807](https://redirect.github.com/react-component/util/pull/807)
[@&#8203;github-actions](https://redirect.github.com/apps/github-actions)
[@&#8203;nrps9909](https://redirect.github.com/nrps9909)
- 🐞 Fix Form.Item incorrectly removing a trailing `|` from a string
`label` when displaying a colon.
[#&#8203;59599](https://redirect.github.com/ant-design/ant-design/pull/59599)
[@&#8203;wfatih](https://redirect.github.com/wfatih)
- ⌨️ Fix Form.Item not associating warning-only messages with the
control through `aria-describedby`.
[#&#8203;59443](https://redirect.github.com/ant-design/ant-design/pull/59443)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- Input
- 🐞 Fix Input.OTP losing valid characters when pasting text with a
filtering `formatter`.
[#&#8203;59580](https://redirect.github.com/ant-design/ant-design/pull/59580)
[@&#8203;yunfeizhu](https://redirect.github.com/yunfeizhu)
- 🐞 Fix Input.OTP ignoring `rootClassName` on the root element.
[#&#8203;59439](https://redirect.github.com/ant-design/ant-design/pull/59439)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- 🐞 Fix Input.OTP not rendering a numeric `0` as the `separator`.
[#&#8203;59518](https://redirect.github.com/ant-design/ant-design/pull/59518)
[@&#8203;Ye-YiChen](https://redirect.github.com/Ye-YiChen)
- Table
- 🐞 Fix Table selection menu skipping current-page tree descendants when
inverting selection and deselecting disabled rows on other pages when
clearing selections.
[#&#8203;59570](https://redirect.github.com/ant-design/ant-design/pull/59570)
[@&#8203;yunfeizhu](https://redirect.github.com/yunfeizhu)
- 🐞 Fix Table sorted fixed header hover background and the
`fixedHeaderSortActiveBg` token not taking effect.
[#&#8203;59554](https://redirect.github.com/ant-design/ant-design/pull/59554)
[@&#8203;dogledogle](https://redirect.github.com/dogledogle)
- ColorPicker
- 🐞 Fix ColorPicker applying RTL styles when ConfigProvider `direction`
is `ltr`.
[#&#8203;59441](https://redirect.github.com/ant-design/ant-design/pull/59441)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- 🐞 Fix ColorPicker number input control button width.
[#&#8203;59538](https://redirect.github.com/ant-design/ant-design/pull/59538)
[@&#8203;QDyanbing](https://redirect.github.com/QDyanbing)
- 🐞 Fix nested Descriptions being affected by the outer component's
borders, spacing, and cell layout.
[#&#8203;59547](https://redirect.github.com/ant-design/ant-design/pull/59547)
[@&#8203;xushanpei](https://redirect.github.com/xushanpei)
- 🐞 Fix Progress line ignoring string widths in `size`, such as `['50%',
20]`, and always filling the container.
[#&#8203;59597](https://redirect.github.com/ant-design/ant-design/pull/59597)
[@&#8203;wfatih](https://redirect.github.com/wfatih)
- 🐞 Fix Tooltip failing to limit panel corner radius to 8px for left and
right placements when the `borderRadius` token exceeds 8.
[#&#8203;59568](https://redirect.github.com/ant-design/ant-design/pull/59568)
[@&#8203;dogledogle](https://redirect.github.com/dogledogle)
- 🐞 Fix Popconfirm `onPopupClick` firing twice for a single click inside
the popup content.
[#&#8203;59440](https://redirect.github.com/ant-design/ant-design/pull/59440)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- 🐞 Fix Upload extra content styles when `showUploadList.extra` is `0`
or returns `0`.
[#&#8203;59438](https://redirect.github.com/ant-design/ant-design/pull/59438)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- ♿ Fix Typography duplicate button semantics for the default edit icon.
[#&#8203;59112](https://redirect.github.com/ant-design/ant-design/pull/59112)
[@&#8203;nrps9909](https://redirect.github.com/nrps9909)
- ⚡️ Improve Transfer source list rendering performance.
[#&#8203;59524](https://redirect.github.com/ant-design/ant-design/pull/59524)
[@&#8203;QDyanbing](https://redirect.github.com/QDyanbing)

***

- 🐞 修复 antd 在部分生产构建中因 React
版本信息缺失而加载失败的问题。[#&#8203;59560](https://redirect.github.com/ant-design/ant-design/pull/59560)
[react-component/util#810](https://redirect.github.com/react-component/util/pull/810)
[@&#8203;github-actions](https://redirect.github.com/apps/github-actions)
[@&#8203;nrps9909](https://redirect.github.com/nrps9909)
- 🐞 修复 Button、Form、Slider、Typography 和 Upload
在卸载后仍触发延迟状态更新的问题。[#&#8203;59560](https://redirect.github.com/ant-design/ant-design/pull/59560)
[react-component/util#806](https://redirect.github.com/react-component/util/pull/806)
[@&#8203;github-actions](https://redirect.github.com/apps/github-actions)
[@&#8203;nrps9909](https://redirect.github.com/nrps9909)
- 🐞 修复 Select、TreeSelect、Cascader 和 Mentions 的 `popupRender` 内容继承
Form.Item
校验状态和反馈图标的问题。[#&#8203;59463](https://redirect.github.com/ant-design/ant-design/pull/59463)
[@&#8203;huytdps13400](https://redirect.github.com/huytdps13400)
- 🐞 修复 Popover 和 Popconfirm 设置预设 `color`
后面板背景色不生效的问题。[#&#8203;59549](https://redirect.github.com/ant-design/ant-design/pull/59549)
[@&#8203;dogledogle](https://redirect.github.com/dogledogle)
- Form
- 🐞 修复 Form 嵌套字段设置 `preserve={false}` 后卸载时,自定义 `shouldUpdate`
判断可能无法更新关联内容的问题。[#&#8203;59560](https://redirect.github.com/ant-design/ant-design/pull/59560)
[react-component/util#807](https://redirect.github.com/react-component/util/pull/807)
[@&#8203;github-actions](https://redirect.github.com/apps/github-actions)
[@&#8203;nrps9909](https://redirect.github.com/nrps9909)
- 🐞 修复 Form.Item 显示冒号时误删字符串 `label` 末尾 `|`
的问题。[#&#8203;59599](https://redirect.github.com/ant-design/ant-design/pull/59599)
[@&#8203;wfatih](https://redirect.github.com/wfatih)
- ⌨️ 修复 Form.Item 仅有警告信息时未通过 `aria-describedby`
关联到控件的问题。[#&#8203;59443](https://redirect.github.com/ant-design/ant-design/pull/59443)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- Input
- 🐞 修复 Input.OTP 使用过滤型 `formatter`
时粘贴文本会丢失有效字符的问题。[#&#8203;59580](https://redirect.github.com/ant-design/ant-design/pull/59580)
[@&#8203;yunfeizhu](https://redirect.github.com/yunfeizhu)
- 🐞 修复 Input.OTP 根节点未应用 `rootClassName`
的问题。[#&#8203;59439](https://redirect.github.com/ant-design/ant-design/pull/59439)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- 🐞 修复 Input.OTP 无法渲染数值 `0` 作为 `separator`
的问题。[#&#8203;59518](https://redirect.github.com/ant-design/ant-design/pull/59518)
[@&#8203;Ye-YiChen](https://redirect.github.com/Ye-YiChen)
- Table
- 🐞 修复 Table
选择菜单反选时遗漏当前页树形子节点,以及清空选择时取消其他页禁用行选中状态的问题。[#&#8203;59570](https://redirect.github.com/ant-design/ant-design/pull/59570)
[@&#8203;yunfeizhu](https://redirect.github.com/yunfeizhu)
- 🐞 修复 Table 固定排序表头悬停背景异常及 `fixedHeaderSortActiveBg` token
不生效的问题。[#&#8203;59554](https://redirect.github.com/ant-design/ant-design/pull/59554)
[@&#8203;dogledogle](https://redirect.github.com/dogledogle)
- ColorPicker
- 🐞 修复 ConfigProvider 的 `direction` 为 `ltr` 时 ColorPicker 仍应用 RTL
样式的问题。[#&#8203;59441](https://redirect.github.com/ant-design/ant-design/pull/59441)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- 🐞 修复 ColorPicker
数值输入框操作按钮宽度异常的问题。[#&#8203;59538](https://redirect.github.com/ant-design/ant-design/pull/59538)
[@&#8203;QDyanbing](https://redirect.github.com/QDyanbing)
- 🐞 修复嵌套 Descriptions
受到外层组件边框、间距和单元格布局影响的问题。[#&#8203;59547](https://redirect.github.com/ant-design/ant-design/pull/59547)
[@&#8203;xushanpei](https://redirect.github.com/xushanpei)
- 🐞 修复 Progress 线形进度条 `size` 传入字符串宽度(如 `['50%',
20]`)时不生效、始终撑满容器的问题。[#&#8203;59597](https://redirect.github.com/ant-design/ant-design/pull/59597)
[@&#8203;wfatih](https://redirect.github.com/wfatih)
- 🐞 修复 Tooltip 的 `borderRadius` token 大于 8 时,左右侧弹层圆角未限制为 8px
的问题。[#&#8203;59568](https://redirect.github.com/ant-design/ant-design/pull/59568)
[@&#8203;dogledogle](https://redirect.github.com/dogledogle)
- 🐞 修复点击 Popconfirm 弹层内容时 `onPopupClick`
被触发两次的问题。[#&#8203;59440](https://redirect.github.com/ant-design/ant-design/pull/59440)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- 🐞 修复 Upload 的 `showUploadList.extra` 为 `0` 或返回 `0`
时额外内容样式未生效的问题。[#&#8203;59438](https://redirect.github.com/ant-design/ant-design/pull/59438)
[@&#8203;Chaoqi31](https://redirect.github.com/Chaoqi31)
- ♿ 修复 Typography
默认编辑图标暴露重复按钮语义的问题。[#&#8203;59112](https://redirect.github.com/ant-design/ant-design/pull/59112)
[@&#8203;nrps9909](https://redirect.github.com/nrps9909)
- ⚡️ 优化 Transfer
左侧列表的渲染性能。[#&#8203;59524](https://redirect.github.com/ant-design/ant-design/pull/59524)
[@&#8203;QDyanbing](https://redirect.github.com/QDyanbing)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Helsinki)

- Branch creation
  - "on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend Renovate
CLI](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNDMuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE0My4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: thaw-release-bot[bot] <277444778+thaw-release-bot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

useDelayState throws error in vitest

4 participants