跳到正文
册页

表单

Textarea - 多行输入

多行文本输入,只能纵向拉伸。

用法

TSX
import { Textarea } from '@misoto22/folio'

说明

多行文字输入。

只能纵向调整大小:允许横向调整,读者就能把控件拖过版心,拖出页面自己的边距。

结构

Textarea anatomy
部件说明
控件盒子必填那个 <textarea>,和 Input 站在同一个 CONTROL_BASE 上,另加一条 min-h-24 的下限。这条下限压在 rows 底下,不是盖在它上面:rows={2} 渲染出来仍然是六个 rem 高。
拉伸角浏览器自带的那个角上的手柄,被限制成 resize-y——读者可以把盒子拉长,但拉不宽到超出行长,也拉不出页面的边距。
错误边框和 Input 上 isInvalid 认的是同一对:invalid 属性,或者一个 aria-invalid——包括 Field 有 error 时替它设上的那个。

实践建议

推荐

  • rows 按你期待的答案来设。它是唯一能把静止高度顶到六 rem 以上的东西,而这个盒子的大小,是页面上关于「该写多长」说得最清楚的一句话。
  • 有长度上限,就既设 maxLength,又在 hint 里把它说出来:maxLength 会不作解释地吞掉按键,而多出一个字符的粘贴会被悄悄截断。
  • Enter 就让它是换行。按 Enter 就提交的 textarea,抢走的正是这个控件存在的意义所系的那个键,而读者会丢掉写到一半的那一段。

避免

  • 它不会自动长高。高度就是 rows 和 min-h-24 谈出来的那个数,永远不跟着内容走,所以调用处不另作交代的话,一段长回答是隔着一个六 rem 的窗口被检查的。
  • 不要把必须遵守的格式只写在 Field 的 hint 里:hint 和 error 共用一个位置,所以字段一出错,格式就消失了——而那正是唯一有人需要它的时刻。

示例

default

一个静止的、四行高的框。rows 是唯一能把它抬离六 rem 下限的东西,而这个框的高度,是一整页上关于「预期答案有多长」这件事最清楚的信号——所以把它设成你预期的那个长度。这里没有自动增高:高度永远不会跟着内容走,而一个留在默认值上的长答案,是透过一个六 rem 的窗口被审阅的。它只在竖直方向可调,因为一个横向的把手,会让读者把控件拖过版心、拖出页面的留白。

rows and limits

rows 定框的大小,maxLength 给它封顶,而提示把这件事说出来。maxLength 单独用,会把按键悄悄吞掉、不作任何解释,还会把一次只多出一个字符的粘贴无声地截断,所以下面那个计数不是装饰——它是读者在这个框开始拒收之前,唯一能拿到的警告。这里 Enter 仍然是换行,也应该是:一个按 Enter 就提交的多行输入框,等于夺走了这个控件存在的意义所在的那一个键。

183 characters left of 280.

invalid

出错的样子,以及为什么那条消息要把规则重说一遍。hint 和 error 共用一个槽位,所以一个只写在提示里的格式,会在字段出错的那一瞬间消失——而那正是唯一有人需要它的时刻。Field 的 error 同时也就是整个 invalid 状态:它会在 textarea 上设 aria-invalid,而那正是那圈危险边框所读的拼法,所以没有什么需要传第二遍。

Open with a line starting Added, Fixed or Changed — that first word groups the entry in the changelog.