基于el-form封装一个依赖 json 动态渲染的表单控件(一)

简介: 先介绍功能,然后演示功能,最后介绍思路和编码方式。

01

nf-form 表单控件的功能


基于 el-form 封装了一个表单控件,包括表单的子控件。既然要封装,那么就要完善一些,把能想到的功能都要实现出来,不想留遗憾。毕竟UI库提供的功能都很强大了,不能浪费了对吧。

  • 依赖 json 动态创建表单
  • 可以多行多列
  • 可以调整布局
  • 可以自定义子控件(插槽和动态组件)
  • 可以扩展表单子控件
  • 数据验证
  • 数据联动
  • 组件联动
  • 依据 json 自动创建 model


02

功能演示


看一下功能动态演示:


55.png


活链接

接下来,具体看看实现方法。

  • 单列表单
    这个比较基础,直接贴图。

56.png


单列表单

  • 多列表单
    有时候需要双列或者三列的表单,这个也是要支持

57.png

双列表单

58.png

三列表单

因为采用的是 el-col 实现的多列,所以理论上最多支持 24 列,当然要看屏幕的宽度了。

  • 调整布局 看上面的图片,可以发现个问题,改变列数之后,表单页面变得不好看了,这时候需要我们做一些调整,比如让某个组件占用两份空间,调整一下组件的先后顺序。

单列中的合并

59.png

单列的合并组件位置

调整之后,页面可以更紧凑。可以两个组件占一行,也可以三个组件占一行,具体看屏幕的宽度和一个组件的大小。

多列里的占一行

60.png


多列里面一个组件占用两个位置

  • 自定义子控件
    如果表单提供的子控件不能满足需求,那么怎么办?我们可以自己来定义一个子控件。
  1. 使用插槽
    使用插槽比较简单和灵活,可以在表单控件外部完全控制,适合临时的情况,插槽里可以有多个组件。

61.png


用插槽实现自定义组件

  1. 使用动态组件 插槽的方式虽然灵活,但是不便于复用,如果需要在多个地方使用的话,可以先做成一个组件,然后用动态组件的方式加入表单。

63.png


动态组件实现自定义子控件

这里使用动态组件的方式加入了 element 的穿梭控件,也可以加入其它各种组件。

  • 数据验证 可以直接使用 el-form 提供的验证功能,在json里面设置好验证规则即可。

64.png



表单验证

  • 数据联动
  1. 一个组件内的联动 这个可以使用 el-cascader 来实现。
  2. 多个组件的联动 可以用简单来实现。
  • 组件联动 可以根据某个组件的值,设置其他组件是否显示。

65.png

文本类

66.png

选择类


封装表单子控件


表单控件需要很多子控件,所以要先封装一下子控件,然后才方便封装表单控件。

定义接口,统一规范

表单子控件有一个相同的需求,都需要实现属性和 v-model 数据交换,因为 element 把 value 给封装成了v-model,所以无法直接绑定组件的属性,必须建立一个内部变量来绑定。所以需要一个转换的方式,这里采用自定义ref来实现,顺便实现了一下防抖功能。

虽然在表单控件里面并不需要防抖功能,但是查询的时候需要,而表单子控件是可以通用到查询控件里面的。

定义一个 v-model 和 my-change

// 自定义 ref 
/**
 * 自定义的ref,实现属性和内部变量的数据转换
 * @param { reactive } props 组件的属性
 * @param { object } context 组件的上下文
 * @param { number } delay 延迟刷新的时间,单位:毫秒,默认:0
 * @param { string } name 要对应的属性名称,默认:modelValue
 * @returns 自定义的ref
 */
export const debounceRef = (props, context, delay = 0, name = 'modelValue') => {
  let _value = props[name]
  // 计时器
  let timeout
  // 是否输入状态。输入时取 value;输入完毕取 modelValue 属性
  let isInput = false
  return customRef((track, trigger) => {
    return {
      get () {
        track()
        if (isInput) {
          // console.log(isInput)
          return _value
        } else {
          // console.log(isInput)
          return props[name]
        }
      },
      set (newValue) {
        isInput = true
        _value = newValue // 绑定值
        trigger() // 组件内部刷新模板
        clearTimeout(timeout) // 清掉上一次的计时
        timeout = setTimeout(() => {
          // 修改 modelValue 属性
          context.emit(`update:${name}`, newValue) // 提交给父组件
          // 用于区分是哪个组件触发的事件。
          context.emit('my-change', newValue, props.controlId, props.colName)
          isInput = false
        }, delay)
      }
    }
  })
}



相关文章
|
1月前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
6月前
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
525 1
|
1月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
387 0
|
4月前
|
JSON Java fastjson
Spring Boot返回Json数据及数据封装
本文详细介绍了如何在Spring Boot项目中处理JSON数据的传输 Spring Boot默认使用Jackson作为JSON处理器,并通过`spring-boot-starter-web`依赖自动包含相关组件。文章还展示了如何配置Jackson处理null值,使其转换为空字符串。此外,文章比较了Jackson和FastJson的特点,并提供了FastJson的配置示例,展示了如何处理null值以适应不同应用场景。
|
5月前
|
机器学习/深度学习 JSON 移动开发
详细解读BootStrap智能表单系列八表单配置json详解
详细解读BootStrap智能表单系列八表单配置json详解
35 0
|
5月前
|
JSON JavaScript 数据格式
1.js动态的往json数据添加新属性和值 2.JSON 和 JS 对象互转 3.对象转化为数组
1.js动态的往json数据添加新属性和值 2.JSON 和 JS 对象互转 3.对象转化为数组
53 0
|
2月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
47 1
|
1月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
18天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
22天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。