Form - 表单
表单是用户和网站交互最重要的一部分。
表单有很多控件,这里选了几个简单的模拟实现,就单独整理写到这里了. 表单包含 输入框
, 单选框
, 下拉选择
, 多选框
等用户输入的组件。 使用表单,您可以收集、验证和提交数据。
典型表单:
最基础的表单包括各种输入表单项,比如:
- input
- select
- radio
- checkbox
在每一个 form 组件中,你需要一个 form-item 字段作为输入项的容器,用于获取值与验证值。
按照原型图整理的简单需求:
- 自定义UI
- 整理可自定义
- 用户可自定义渲染多种类型的表单元素
- 用户可自定义提交区域内容
- 验证时机
- 表单元素默认blur时验证,可自定义
- 整个表单在点击提交时应全部验证
- 验证规则
- 每个input可配置多条规则
- 规则可自定义
组件结构设计
const formOptions = {
name: { key: 'name', value: '', rules: [], ... }
[otherKey]: { key: 'xxx', value: '', rules: [], ... }
}
<Form :options="formOptions" />
// 但这种用法过于繁杂,不灵活,在使用上体现不出结构,会让js臃肿,所以用slot的形式
<Form>
<FormItem label="label" name="name">
<Input />
</FormItem>
<FormItem label="label2" name="name2">
<Select />
</FormItem>
</Form>
开发步骤:
- 根据结构,实现基础布局,完成demo
- 添加初始化数据,绑定数据
- 添加验证
- 事件交互,验证等
- 不断完善
验证思路
验证类型:
- 表单Form整体验证
- 单个表单FormItem的验证
表单中每项循环验证一次 every 即为表单验证结果
单个验证实现思路:
- 从父组件Form获取对应option、value
- 在FormItem组件中实现
第三方库:async-validator
Input - 输入框
表单是用户和网站交互最重要的一部分
文档地址:
input: https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input
textarea: https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/textarea
需求分析
- 支持 input / textarea
- 支持不同大小
- 应可以一键清空
- 支持切换是否不可见(密码或敏感信息输入)
- 支持自定义前缀、后缀
分析出来需要添加的原生属性:
- disabled 已添加
- placeholder 当没有预设值时,出现的文字
- readonly 布尔值,若存在,其中的值不可编辑
- autocomplete 除了 checkbox、radio 和按钮外,表单自动填充特性提示
- autofocus 一个布尔属性,若存在,表示当页面加载完毕该 input 自动拥有焦点
- form 一个字符串,指定该输入与之相关的表单元素
TDD 开发遇到的一些小问题
在大部分情况下,它能很好地运行,但由于 jsdom 使用模拟 DOM 环境,会和浏览器真实环境有差别,在一些功能上出现问题
不必纠结完全一致。实际以 demo 浏览器上的表现即可
Switch
并不是一个标准的 Form 组件
- 功能类似 checkbox
- 样式独特
一开始 modelValue 只支持 boolean,但这不能满足一定的场景。这里为了扩展,我们增加 string 和 number 的类型支持
扩展 activeText 和 inactiveText
表单组件设计要特别注意和原生表单元素的配合,尽可能实现良好的可访问性
Select
需求分析
进阶版的Dropdown,Input组件和Tooltip组件的组合。类似原生Select,具有以下最基本功能:
- 点击展开下拉选项菜单
- 点击菜单中的某一项,下拉菜单关闭
- Select获取选中状态,并且填充对应的选项
其他扩展功能:
- 可清空选项:hover后 同Input
- 可自定义模版。可自定义下单菜单的选项格式
- 思路 使用render函数
- 这里我们用之前定义的 RenderVnode 即可 (e: SelectOption) => VNode
- 可筛选选项,可切换成Input允许输入并过滤下拉选项
- 支持远程搜索:类似联想,可根据输入字符发送请求,渲染返回的内容作为选项
实现筛选功能
思路:
- 在本地存储一个可变的响应式对象
- 在input时重新计算,渲染新的值
优化:
- 再次选择需要清空input
- 再次选择改善placeholder显示,显示当前选中的值
支持远程搜索
思路:
在input输入过程中,根据用户传入的remote处理方式,发请求并且渲染结果
优化:
- debounce防抖 (减少不必要的请求)