docs(workspace): explain component state and async ownership

This commit is contained in:
2026-11-12 16:14:21 +08:00
parent cc2172319e
commit 65c54e7b9e
7 changed files with 19 additions and 1 deletions
@@ -53,6 +53,7 @@ export function EditableTitle({ title, editable, onSave, className = "" }: {
cancelled.current = true;
setError("");
setMode("selected");
// 不保存帧句柄做卸载取消;执行时通过 ref 可选访问,目标已卸载则不聚焦。
requestAnimationFrame(() => button.current?.focus());
}
/** 同步ref挡重复提交,trim后校验非空及UTF-8≤300字节;同名不发请求。
@@ -70,6 +71,7 @@ export function EditableTitle({ title, editable, onSave, className = "" }: {
setMode("saving");
setError("");
try {
// onSave 没有本组件的 signal/代次护栏;切换目标或卸载后的结果隔离需由宿主回调保证。
await onSave(name);
cancelled.current = true;
setMode("idle");
@@ -78,6 +80,7 @@ export function EditableTitle({ title, editable, onSave, className = "" }: {
setMode("editing");
} finally { pending.current = false; }
}
// title prop 改变不自动覆盖正在编辑的 draft;同名判断使用本次 save 闭包看到的 title。
// saving保留input但只读;输入法组合不把Enter当提交,键盘事件停止冒泡避免触发画布快捷键。
return (
<div ref={shell} className={`${styles.shell} ${className}`}>