### tdesign-vue-next 版本 1.19.2 ### 重现链接 https://stackblitz.com/edit/dppu61az?file=package.json,src%2Fdemo.vue ### 重现步骤 <img width="419" height="222" alt="Image" src="https://github.com/user-attachments/assets/637ac36c-bc3d-4a39-837f-38267463ba49" /> 如上我写了4个nextTick,才清除了必填的校验 ### 期望结果 1个nextTick就行 ### 实际结果 _No response_ ### 框架版本 _No response_ ### 浏览器版本 _No response_ ### 系统版本 _No response_ ### Node版本 _No response_ ### 补充说明 _No response_
Activity
github-actions commentedon May 9, 2026
👋 @huchaomin,感谢给 TDesign 提出了 issue。
请根据 issue 模版确保背景信息的完善,我们将调查并尽快回复你。
guozi9999 commentedon May 23, 2026
stackblitz 中的例子好像不能复现这个问题
dongyikuan919 commentedon May 23, 2026
我看了下
TForm/TFormItem这块,感觉这个问题像是clearValidate()和 FormItem 的自动校验 watcher 之间有时序竞争。当前
packages/components/form/form.tsx里的clearValidate是同步遍历:但
packages/components/form/form-item.tsx里同时有:所以如果业务代码在同一个 tick 里改了表单值,然后马上
nextTick(() => form.clearValidate()),可能出现:clearValidate -> resetHandler已经清掉错误,但上一轮 value watcher / validateHandler 随后又把错误状态写回来。这个也能解释为什么示例里多写几个nextTick才能最终清掉。建议加一个回归测试:
await nextTick()后调用clearValidate();await nextTick(),断言.t-is-error和.t-input__extra都被清掉。实现上可以考虑两种方向:
clearValidate返回Promise<void>,内部 reset 后await nextTick(),确保对外时序稳定;clearValidate后到来的旧validateHandler结果不再覆盖TO_BE_VALIDATED状态。第二种更稳,因为它能处理异步 validator 慢返回覆盖 reset 状态的问题。
huchaomin commentedon May 25, 2026
你注释掉一组 nextTick 就可以复现了
dongyikuan919 commentedon May 25, 2026
明白了,注释掉一组
nextTick后确实更容易把时序问题暴露出来。我理解这个问题的关键点不是单纯 “nextTick 里调用不生效”,而是
clearValidate触发时表单项内部校验状态还没有完成同步,导致外层 tick 和字段状态更新 tick 存在先后差。建议后续可以把复现说明补成:保留/注释不同层级nextTick时的表现对比,这样维护者更容易判断是文档预期、调用时机问题,还是组件内部需要额外 flush。huchaomin commentedon Jun 23, 2026
这个问题还没进展么?
dongyikuan919 commentedon Jun 24, 2026
目前看 issue 里还没有维护者的进一步反馈。
我这边的理解还是更偏向
clearValidate和FormItem内部 value watcher 触发的change校验之间存在时序竞争:clearValidate已经把错误状态 reset 掉,但前一轮validateHandler的结果可能随后又把 error 状态写回来,所以才会表现成需要多层nextTick才能最终清掉。建议后续可以先补一个最小回归用例把这个时序固定下来:先触发 required 错误 -> 修改字段值 ->
await nextTick()后调用clearValidate()-> 再await nextTick()断言错误态和提示都已清除。修复上单纯让clearValidate多等一个 tick 可能不够稳,更建议在FormItem内部加 reset/version 标记,避免clearValidate之后返回的旧校验结果覆盖 reset 后的状态。