Textarea 多行输入框
受控值约定同 Input:value + ptChange,每次输入都触发,不是失焦才触发; 需要「提交时」语义请监听 ptBlur。
基础用法
受控值同 pt-input:value + ptChange,每次输入都触发。rows 决定初始行数。
<pt-textarea placeholder="写点什么" rows="3"></pt-textarea>自动增高
auto-resize 随内容增高、不出内部滚动条,rows 此时只决定最小高度;配 max-height 封顶,超过后才出滚动条。
<pt-textarea auto-resize rows="2" placeholder="多打几行试试"></pt-textarea>
<pt-textarea auto-resize max-height="120" rows="2" placeholder="最高 120px"></pt-textarea>状态
只读能聚焦、能选中复制,值照常随表单提交;禁用则什么都不能做,也不提交。
<pt-textarea invalid value="格式不对" rows="2"></pt-textarea>
<pt-textarea readonly value="只读" rows="2"></pt-textarea>
<pt-textarea disabled placeholder="禁用" rows="2"></pt-textarea>自动增高
auto-resize 随内容增高、不出现内部滚动条,此时 rows 只决定最小高度。 配 max-height(px)封顶:超过后才出滚动条,0 表示不限制。
自动增高模式下原生的拖拽手柄会被去掉:高度已经由内容决定,留着手柄会让用户拖一下、 下次输入又被算回去,像 bug。
高度在每次输入和程序改 value 时自动重算。容器宽度变了导致折行数变化这种外部原因组件感知不到, 调一次 resize()。
表单参与
同 Input:组件是 form-associated 的,参与原生表单的提交、重置与校验,重置时回到初始值。 required 为空时报 valueMissing,invalid 报 customError。
maxlength 透传给原生 textarea,超出后浏览器不再接受键入 —— 但它不进宿主的表单校验状态, 那里只看 required / invalid。
API
属性
| 属性 | Attribute | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
ariaLabelText | aria-label | string | undefined | — | 无障碍名称:原生 HTML 里写 aria-label,React / Vue / Angular 包装层里属性名是 ariaLabelText。 没有可见 label 时必须给。 |
autoResize | auto-resize | boolean | false | 随内容自动增高,不出现内部滚动条 |
disabled | disabled | boolean | false | 禁用。只反映使用方自己写的值:外层原生 `<fieldset disabled>`、pt-field / pt-field-set 的禁用另经继承通道生效,不改写它 |
inheritedDisabled | inherited-disabled | boolean | false | 外层 pt-field / pt-field-set 下发的禁用。内部继承通道:由它们以 attribute 维护,不建议使用方直接写。 有效禁用是 `disabled` 与它的并集;父元素只写这一条、不碰 `disabled`,读 `el.disabled` 得到的始终是使用方自己写的值 |
inheritedInvalid | inherited-invalid | boolean | false | 外层 pt-field 下发的出错态。内部继承通道:由 pt-field 维护,不建议使用方直接写。有效出错是 `invalid` 与它的并集 |
inheritedRequired | inherited-required | boolean | false | 外层 pt-field 下发的必填。内部继承通道:由 pt-field 维护,不建议使用方直接写。有效必填是 `required` 与它的并集 |
invalid | invalid | boolean | false | 出错态。校验信息由使用方展示,组件只负责视觉、aria-invalid 与表单校验状态(customError) |
maxHeight | max-height | number | 0 | auto-resize 时的最大高度(px),超过后才出滚动条。0 表示不限制 |
maxlength | maxlength | number | undefined | — | 最大字符数,透传给原生控件:超出后浏览器不再接受键入,程序赋的 value 不受限。 它不进宿主的表单校验状态(那里只看 required / invalid)。 |
name | name | string | undefined | — | 提交表单时的字段名 |
placeholder | placeholder | string | undefined | — | 占位文案 |
readonly | readonly | boolean | false | 只读:能聚焦、能选中复制,不能改。与 disabled 不同,值照常随表单提交 |
required | required | boolean | false | 必填:值为空时表单校验报 valueMissing,并标注 aria-required |
rows | rows | number | 3 | 初始行数。开启 auto-resize 后它只决定最小高度 |
value | value | string | '' | 当前值 |
事件
| 事件 | detail 类型 | 说明 |
|---|---|---|
ptBlur | void | 内部控件失去焦点。需要「提交时」语义的场景监听它,而不是把 ptChange 改成失焦才发 |
ptChange | string | 值变化。每次输入都会触发,不是失焦才触发,详见组件说明 |
ptFocus | void | 内部控件获得焦点 |
方法
| 方法 | 说明 |
|---|---|
resize() => Promise<void> | 重新计算高度。 先把 height 清成 auto 再读 scrollHeight —— 不清零的话 scrollHeight 永远不小于当前高度,文本删短了框也缩不回去。 |
setFocus(options?: FocusOptions) => Promise<void> |
可定制的内部元素(::part())
| part | 说明 |
|---|---|
base | 外层描边容器(与 field 同一元素) |
field | 外层描边容器 |
textarea | 内部的 textarea 元素 |
CSS 变量
| 变量 | 说明 |
|---|---|
--pt-textarea-border-width | 描边宽度,默认 1px。组合进输入组时设 0 由外层容器统一描边 |
--pt-textarea-focus-ring | 聚焦时描边容器的 box-shadow,默认 1px 焦点色。输入组里设 none,由外层容器画焦点环 |
--pt-textarea-padding-inline | 描边容器的左右内边距,默认 12px。输入组里设 0,由外层容器留白 |
--pt-textarea-radius | 圆角,默认 --pt-radius-md |