Skip to content

内建 form 分支的 input 字段:legacy max_length 拼法拿不到任何 maxlength 上限,只在 DOM 上留下一个失效属性 #5201

Description

@os-steve

#3439(内建 textarea 分支的字数计数)时,按「规则的消费半径」扫同一文件的兄弟分支扫到的,不在该 PR 范围内,独立记录。PR #5200 的 "Out of scope" 一节点名了它。

观察到的现象(已实测,不是推断)

packages/components/src/renderers/form/form.tsx 的内建 case 'input' 分支把
stripRendererOnlyProps(fieldProps) 展开到 <Input> 上,从不读取声明的上限。于是同一个上限声明按拼法分成两种结果:

声明 元素上的 maxlength 效果
maxLength: 50 "50" 有硬截断 —— 但是巧合:maxLength 恰好是合法 DOM 属性名
max_length: 50 null,另有一个多余的 max_length="50" 完全没有上限,且渲染出无效 HTML

实测方式:在 worktree 里渲染内建分支(不调 registerAllFields()),dump 元素的
getAttributeNames()getAttribute('maxlength')。两条腿的实测输出:

{ attrs: [class, max_length, id, aria-describedby, aria-invalid, type, ...], maxlength: null }
{ attrs: [class, maxlength,  id, aria-describedby, aria-invalid, type, ...], maxlength: "50" }

为什么这是缺陷而不是风格问题

max_length 是本仓活着的编写拼法,不是历史遗迹:

  • 注册路径的 TextAreaField 自 framework#1878 §3 起就 dual-read maxLength ?? max_length;
  • 三个 form field 生产者都 dual-read 后归一到 maxLength(ObjectForm.tsxsectionFields.tsEmbeddableForm.applyDefaultMaxLengths);
  • packages/types/src/field-types.ts 在多个 field 类型上声明了 max_length

也就是说,除了这条内建分支,仓里每个读到它的地方都认这个拼法。而内建分支恰恰服务于
手写 FormSchema 直接喂给渲染器的 standalone/embedded 宿主 —— 那条路上没有任何生产者在中间做归一化,作者就是生产者。

同族口径:一份声明必须在两条渲染路径上产出同一种行为(#3272#3400/PR #3401#3402#3404#3439)。

#3439 的关系,以及为什么没有顺手一起修

#3439 的 PR(#5200)在 case 'textarea' 分支上修掉了同一个机制:显式解析两种拼法,并把
max_length 挡在 DOM 之外。input 分支没有跟着改,是刻意的:

  1. 它超出那张卡的范围(卡讲的是长文本的字数计数);
  2. 不是纯机械重复 —— 单行 input 要不要也配一个可见计数/可访问上限,是一个独立的设计取舍,不能从 textarea 的结论直接推出来。上限解析那半是机械的,计数那半不是。

所以留给 triage 定:是只补上限解析(小),还是连可访问上限一起补(与 #3439 同形)。

起点

检索记录

⚠️ 这一条没做成:立单时 GitHub API 对本身份 search_issues / list_issues 均返回
API rate limit already exceeded,三次重试均失败,所以没能按 objectstack#4949 的要求先搜后立。若与既有 open issue 重复,请直接合并/关闭本单 —— 缺的是检索,不是现象(现象是实测的)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpm:queue

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions