自适应表单块字段属性

本文档概述了在 blocks/form/form.js 中 JSON 架构如何映射到所渲染的 HTML,重点介绍如何识别和渲染字段、常见模式以及字段特有的差异。

如何识别字段 (fieldType)?

JSON 架构中的每个字段都有一个决定如何渲染该字段的 fieldType 属性。fieldType 可以是:

  • 一个特定类型
    例如:drop-downradio-groupcheckbox-grouppanelplain-textimageheading 等。
  • 一个有效的 HTML 输入类型
    例如:textnumberemaildatepasswordtelrangefile 等。
  • 带有 -input 后缀的类型
    例如:text-inputnumber-input 等。(标准化为基本类型,如 textnumber)。

如果 fieldType 是一个特定类型,就会使用一个​ 自定义渲染程序。否则,它会被视为一个​ 默认的输入类型

请参阅以下各节,了解每种字段类型的完整的 HTML 结构和属性

字段使用的常见属性

以下是大多数字段都使用的属性:

  • id:指定元素 ID 并支持无障碍性。
  • name:定义输入、选择或字段集元素的 name 属性。
  • label.valuelabel.richTextlabel.visible:指定标签/图例文本、HTML 内容和可见性。
  • value:表示字段的当前值。
  • required:添加 required 属性或验证数据。
  • readOnlyenabled:决定这是可编辑的或是禁用的字段。
  • description:在字段下方显示帮助文本。
  • tooltip:设置输入的 title 属性。
  • constraintMessages:提供自定义错误消息作为数据属性。

常见的 HTML 结构

大多数字段都是包裹在一个包含标签和可选帮助文本的容器中进行渲染。以下代码片段展示了这种结构:

<div class="<fieldType>-wrapper field-wrapper field-<name>" data-id="<id>">
<label for="<id>" class="field-label">Label</label>
<!-- Field-specific input/element here -->
<div class="field-description" id="<id>-description">Description or error
message</div>
</div>

对于组(单选按钮/复选框)和面板,会使用 <legend><fieldset>,而不是 <div>/<label>。帮助文本

只有在设置了描述的情况下存在。

错误消息显示

错误消息显示在 .field-description 元素中,这个元素中也显示会动态更新的帮助文本。

如果一个字段无效

如果字段变成有效

可以使用 JSON 中的 constraintMessages 属性来自定义错误消息。
这些作为 data-<constraint>ErrorMessage 属性添加在包装器上(例如 data-requiredErrorMessage)。

默认输入类型(HTML 输入或 *-input

如果 fieldType 不是特定类型,就会被视为一个标准 HTML 输入类型或者是 <type>-input,例如 textnumberemaildatetext-inputnumber-input

对默认输入类型的约束

根据 JSON 属性,输入元素中添加了约束属性。

JSON 属性
HTML 属性
应用到
maxLength
maxlength
文本、电子邮件、密码、电话
minLength
minlength
文本、电子邮件、密码、电话
模式
模式
文本、电子邮件、密码、电话
最大值
最大
数字、范围、日期
最小值
最小值
数字、范围、日期
步骤
步骤
数字、范围、日期
接受
接受
文件
多个
多个
文件
maxOccur
data-max
面板
minOccur
data-min
面板
NOTE
multiple 是一个布尔值属性。如果为真,就会添加 multiple 属性。

表单渲染程序会根据字段的 JSON 定义自动设置这些属性。

例如:有约束的 HTML 结构

以下示例展示了如何渲染一个带有验证约束和错误处理属性的数字字段。

<div class="number-wrapper field-wrapper field-age" data-id="age"
data-required="true"
data-minimumErrorMessage="Too small" data-maximumErrorMessage="Too large">
<label for="age" class="field-label">Age</label>
<input type="number"
id="age" name="age"
value="30" required min="18"
max="99" step="1"
placeholder="Enter your age" />
<div class="field-description" id="age-description"> Description or error message
</div>
</div>

HTML 结构的每个部分都在数据绑定、验证、显示帮助或错误消息方面起到自己的作用。

字段特定的属性及其 HTML 结构

下拉面板

额外的属性:

示例:

<div class="drop-down-wrapper field-wrapper field-<name>" data-id="<id>"
data-required="true"
data-requiredErrorMessage="This field is required">
<label for="<id>" class="field-label">Label</label>
<select id="<id>" name="<name>" required title="Tooltip" multiple>
<option disabled selected value="">Placeholder</option>
<option value="opt1">Option 1</option>
<option value="opt2">Option 2</option>
</select>
<div class="field-description" id="<id>-description"> Description or error message
</div>
</div>

纯文本

额外的属性

示例:

<div class="plain-text-wrapper field-wrapper field-<name>" data-id="<id>">
<label for="<id>" class="field-label">Label</label>
<p>Text or <a href="..." target="_blank">link</a></p>
</div>

复选框

额外的属性

示例:

<div class="checkbox-wrapper field-wrapper field-<name>" data-id="<id>"
data-required="true"
data-requiredErrorMessage="Please check this box">
<label for="<id>" class="field-label">Label</label>
<input type="checkbox"
id="<id>"
name="<name>" value="on"
required
data-unchecked-value="off" />
<div class="field-description" id="<id>-description"> Description or error message
</div>
</div>

按钮

额外的属性

示例:

<div class="button-wrapper field-wrapper field-<name>" data-id="<id>">
<button id="<id>" name="<name>" type="submit" class="button"> Label
</button>
</div>

多行输入

额外的属性

示例:

<div class="multiline-wrapper field-wrapper field-<name>" data-id="<id>"
data-minLengthErrorMessage="Too short" data-maxLengthErrorMessage="Too long">
<label for="<id>" class="field-label">Label</label>
<textarea id="<id>"
name="<name>" required
minlength="2"
maxlength="100"
pattern="[A-Za-z]+"
placeholder="Type here..."></textarea>
<div class="field-description" id="<id>-description"> Description or error message
</div>
</div>

面板

额外的属性

示例:

<fieldset class="panel-wrapper field-wrapper field-<name>" data-id="<id>"
name="<name>"
data-repeatable="true" data-index="0">
<legend class="field-label">Label</legend>
<!-- Nested fields here -->
<button type="button" class="add">Add</button>
<button type="button" class="remove">Remove</button>
<div class="field-description" id="<id>-description"> Description or error message
</div>
</fieldset>

单选按钮

额外的属性

示例:

<div class="radio-wrapper field-wrapper field-<name>" data-id="<id>"
data-required="true">
<label for="<id>" class="field-label">Label</label>
<input type="radio" id="<id>" name="<name>" value="opt1" required />
<div class="field-description" id="<id>-description"> Description or error message
</div>
</div>

单选按钮组

额外的属性

示例:

<fieldset class="radio-group-wrapper field-wrapper field-<name>" data-id="<id>"
data-required="true">
<legend class="field-label">Label</legend>
<div>
<input type="radio" id="<id>-0" name="<name>" value="opt1" required />
<label for="<id>-0">Option 1</label>
</div>
<div>
<input type="radio" id="<id>-1" name="<name>" value="opt2" />
<label for="<id>-1">Option 2</label>
</div>
<div class="field-description" id="<id>-description"> Description or error message
</div>
</fieldset>

复选框组

额外的属性

示例:

<fieldset class="checkbox-group-wrapper field-wrapper field-<name>" data-id="<id>"
data-required="true" data-minItems="1"
data-maxItems="3">
<legend class="field-label">Label</legend>
<div>
<input type="checkbox" id="<id>-0" name="<name>" value="opt1" required />
<label for="<id>-0">Option 1</label>
</div>
<div>
<input type="checkbox" id="<id>-1" name="<name>" value="opt2" />
<label for="<id>-1">Option 2</label>
</div>
<div class="field-description" id="<id>-description"> Description or error message
</div>
</fieldset>

图像

额外的属性

示例:

<div class="image-wrapper field-wrapper field-<name>" data-id="<id>">
<picture>
<img src="..." alt="..." />
<!-- Optimized sources -->
</picture>
</div>

标题

额外的属性

示例:

<div class="heading-wrapper field-wrapper field-<name>" data-id="<id>">
<h2 id="<id>">Heading Text</h2>
</div>

有关更多详细信息,请参阅 blocks/form/form.jsblocks/form/util.js 中的实施。

recommendation-more-help
fbcff2a9-b6fe-4574-b04a-21e75df764ab