玩转 Vue 3 全家桶
大圣
前百度前端架构师
38321 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
玩转 Vue 3 全家桶
15
15
1.0x
00:00/00:00
登录|注册

22|表单:如何设计一个表单组件?

提供校验方法给form组件
通过async-validator校验输入是否合法
从input获取用户输入内容
从form组件获取校验规则
管理每一个具体输入的校验
通知执行校验
监听所有的输入项
负责显示交互组件
执行全部输入项的校验规则
管理输入对象model和校验规则rules的配置
负责表单的容器
表单组件设计是否能通过Vue 2时代的event-bus来实现
使用provide或inject进行跨组件通信
提供给父组件的方法
提供给子组件的数据
内部交互逻辑
form-item组件
input类组件
el-form组件
思考题
组件设计考虑因素
表单组件设计
作者:大圣
标题:表单:如何设计一个表单组件?
总结
参考文章
表单组件设计与实现

该思维导图由 AI 生成,仅供参考

你好,我是大圣。
上一讲我们详细讲解了如何使用 Jest 框架对组件库进行测试,TypeScript 和 Jest 都为我们的代码质量和研发效率保驾护航。之前我们实现的 Container 和 Button 组件都是以渲染功能为主,可以根据不同的属性渲染不同的样式去实现布局和不同格式的按钮。
那么今天我再带你实现一个非常经典的表单组件,这个组件除了要渲染页面组件之外,还得支持很好的页面交互,下面我们先从 Element3 的表单组件开始讲解。

表单组件

Element 表单组件的页面里,我们能看到表单种类的组件类型有很多,我们常见的输入框、单选框和评分组件等都算是表单组件系列的。
下面这段代码是 Element3 官方演示表单的 Template,整体表单页面分三层:
el-form 组件负责最外层的表单容器;
el-form-item 组件负责每一个输入项的 label 和校验管理;
内部的 el-input 或者 el-switch 负责具体的输入组件。
<el-form
:model="ruleForm"
:rules="rules"
ref="form"
label-width="100px"
class="demo-ruleForm"
>
<el-form-item label="活动名称" prop="name">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label="活动区域" prop="region">
<el-select v-model="ruleForm.region" placeholder="请选择活动区域">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="即时配送" prop="delivery">
<el-switch v-model="ruleForm.delivery"></el-switch>
</el-form-item>
<el-form-item label="活动性质" prop="type">
<el-checkbox-group v-model="ruleForm.type">
<el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
<el-checkbox label="地推活动" name="type"></el-checkbox>
<el-checkbox label="线下主题活动" name="type"></el-checkbox>
<el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="特殊资源" prop="resource">
<el-radio-group v-model="ruleForm.resource">
<el-radio label="线上品牌商赞助"></el-radio>
<el-radio label="线下场地免费"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="活动形式" prop="desc">
<el-input type="textarea" v-model="ruleForm.desc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>立即创建</el-button
>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何设计和实现一个复杂的表单组件,通过讲解Element3的表单组件实现过程,展示了表单组件的工作模式和实现方法。文章首先介绍了表单组件的基本结构,包括el-form、el-form-item和内部的输入组件,以及数据绑定和校验规则的使用。接着详细讲解了表单组件的实现过程,包括el-form组件的容器管理和validate方法的对外暴露,以及el-form-item组件的管理和校验逻辑的实现。此外,还介绍了组件之间的通信机制,包括父子组件通信和祖先元素和后代元素通信的实现方法。最后,文章提供了相关类型的定义和通过provide和inject实现数据传递的方法。 通过具体的代码示例和详细的讲解,读者可以了解如何设计和实现一个表单组件,展现了其技术特点和实际应用。文章总结了表单组件的设计过程,包括el-form提供表单的容器组件、input类组件负责显示交互组件、form-item组件管理具体输入的校验等内容。读者可以通过本文了解组件通信、输入类组件的实现,并对组件设计中如何使用TypeScript有了更深入的理解。最后,留下了一个思考题,引发读者对表单组件设计的思考。 整体来说,本文内容丰富,适合技术人员学习和参考,对于理解表单组件的设计和实现具有很好的指导作用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《玩转 Vue 3 全家桶》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • Geek_fcdf7b
    大圣老师,请教一下,3.2版本之后,是不是定义响应式数据都可以用ref一把梭?我看有的文章是这样说的,ref在3.2之后性能进行了大幅度提升,所以建议使用ref,不管简单数据还是复杂数据都可以用ref,没必要用reactive

    作者回复: 现在ref确实是比reactive优先级更高一些,直接建议ref + toRefs一把梭,我碰到必须有reactive的场景的话会写个加餐对比

    2021-12-12
    6
  • 小胖
    我总觉得这章的代码和表述有点对不上。 比如这段:“然后就是具体的 input 实现逻辑,在下面的代码中,input 的核心逻辑就是对 v-model 的支持,这个内容我们在评级组件那一讲已经实现过了。” 我的理解之后应该是要贴上Input或者elInput的代码的,可以后面只有FormItem的代码。 而且,每段代码其实是不是第一行可以添加一个文件名的注释。 同时,这章节的代码在github也没有看见。

    作者回复: 这里对input的封装并没有做type的判断,为了更好的展示git hook这一节独立一个github的repo,可以看这里 https://github.com/shengxinjing/ailemente/blob/main/src/components/form/Input.vue

    2021-12-12
    3
    3
  • 风一样
    老师,问一个基础的问题 export type FormItem = { validate: () => Promise<Values> } 这个类型声明中,=> 是什么意思呢?函数返回的类型,应该是“:”啊?

    作者回复: 你好,type类型别名可以使用 type NameResolver = () => string 来定义一个函数类型,直接function需要用function(a:string):string来定义 interface需要使用下面的语法,写法不同 interface SearchFunc { (source: string, subString: string): boolean; }

    2022-01-20
    2
  • 喵喵酱~
    大圣老师你好,请教一个问题:element3 表单验证组件中,有一个现象,一个必填项鼠标focus再blur后,并没有提示“请输入xxx”, 而是在点击确定后统一提示的错误信息,统一提示错误信息后再在必填项里输入数据,此时的必填项错误信息也没有消失。我是在你的文档里测试的。elementui就不是这样

    作者回复: 我看下,看来是element3的bug

    2021-12-27
  • 酱汁
    有该demo的源码吗老师

    作者回复: https://github.com/shengxinjing/ailemente和https://github.com/hug-sun/element3 可以看到

    2021-12-12
  • 180620
    import { emitter } from "../../emitter" 这段断码的意思是什么

    作者回复: 这里我引入了emitter,是一个event-bus的实现,可以看这里https://github.com/shengxinjing/ailemente/blob/main/src/emitter.ts

    2021-12-11
    2
  • 海阔天空
    表单组件在设计在element中实现原理是通过 Vue 2 时代流行的 event-bus 来实现的,不过他们自己封装了emit和watch方法。vue3这实现更方便更简单了啊。

    作者回复: 其实复杂的也得自己封装一下 只不过vue3没有内置了

    2021-12-10
  • 江南烟雨时
    感觉还是视频课好一些啊
    2022-04-22
    4
    5
  • 幺叁叁
    大圣老师,有个问题请教下怎么处理: ```html <el-form :form="form" :rules="rules"> <el-form-item label="账号" prop="username"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input v-model="form.password"></el-input> </el-form-item> </el-form> ``` 在form-item组件中,使用emitter.on 监听了 validate事件;当在账号的输入框中触发validate事件,其他的form-item组件也会触发validate事件,请问下要如何避免呢?
    2022-01-26
    1
    1
  • 落风
    form-item 负责中间的数据和规则管理,以及显示具体的报错信息。 基于这个描述,rules 配置应该也是放在 FormItem 组件的,而不是在 Form 中通过 provide 传递下来,Form 不需要感知具体某个 FormItem 的规则,只需要感知 FormItem 的校验结果
    2022-04-13
    1
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部