Skip to content

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类型默认值说明
ariaLabelTextaria-labelstring | undefined—无障碍名称:原生 HTML 里写 aria-label,React / Vue / Angular 包装层里属性名是 ariaLabelText。 没有可见 label 时必须给。
autoResizeauto-resizebooleanfalse随内容自动增高,不出现内部滚动条
disableddisabledbooleanfalse禁用。只反映使用方自己写的值:外层原生 `<fieldset disabled>`、pt-field / pt-field-set 的禁用另经继承通道生效,不改写它
inheritedDisabledinherited-disabledbooleanfalse外层 pt-field / pt-field-set 下发的禁用。内部继承通道:由它们以 attribute 维护,不建议使用方直接写。 有效禁用是 `disabled` 与它的并集;父元素只写这一条、不碰 `disabled`,读 `el.disabled` 得到的始终是使用方自己写的值
inheritedInvalidinherited-invalidbooleanfalse外层 pt-field 下发的出错态。内部继承通道:由 pt-field 维护,不建议使用方直接写。有效出错是 `invalid` 与它的并集
inheritedRequiredinherited-requiredbooleanfalse外层 pt-field 下发的必填。内部继承通道:由 pt-field 维护,不建议使用方直接写。有效必填是 `required` 与它的并集
invalidinvalidbooleanfalse出错态。校验信息由使用方展示,组件只负责视觉、aria-invalid 与表单校验状态(customError)
maxHeightmax-heightnumber0auto-resize 时的最大高度(px),超过后才出滚动条。0 表示不限制
maxlengthmaxlengthnumber | undefined—最大字符数,透传给原生控件:超出后浏览器不再接受键入,程序赋的 value 不受限。 它不进宿主的表单校验状态(那里只看 required / invalid)。
namenamestring | undefined—提交表单时的字段名
placeholderplaceholderstring | undefined—占位文案
readonlyreadonlybooleanfalse只读:能聚焦、能选中复制,不能改。与 disabled 不同,值照常随表单提交
requiredrequiredbooleanfalse必填:值为空时表单校验报 valueMissing,并标注 aria-required
rowsrowsnumber3初始行数。开启 auto-resize 后它只决定最小高度
valuevaluestring''当前值

事件

事件detail 类型说明
ptBlurvoid内部控件失去焦点。需要「提交时」语义的场景监听它,而不是把 ptChange 改成失焦才发
ptChangestring值变化。每次输入都会触发,不是失焦才触发,详见组件说明
ptFocusvoid内部控件获得焦点

方法

方法说明
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

Apache-2.0 协议开源