我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue3element的Form表单用法实例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue3element的Form表单用法实例

引言

最近在做一系列后台管理系统,其中用的最多的就是表单和表格了。这里讲一下我最近对表单封装的思考。 以下是我的设计思路以及具体实现,我使用的是vue3+element-plus,因此这个组件也是以这两个库为基础。

已上传npm www.npmjs.com/package/@we…

设计目标

配置化

我们希望把表格的内容,验证规则,甚至于表单的样式,格式都能更规则化,配置化,这样后续我们可以通过构造json去实现一个表单,甚至可用实现拖拽式的构造表单。

参数简单

尽量减少json的层级,减少json的参数,字段更加语义化。

自由度

json其实是一套自由度的很少的规则,但是vue则我们提供更多的自由度,比如h函数,比如动态组件,利用这些方法我们可以实现更高的自由度。

实现过程

表单项的格式设计

首先第一步,我们先设计一个基础的格式,在这个JSON里,字段名都是很简单的英文单词,我专门把验证的规则rule放到每个子项里来,这也比较符合直观。

 const oneItem = {
          key: 'title',
          title: '小说名',
          component: 'el-input',
          props: { placeholder: '请输入姓名' },
          rule: [{ required: true, trigger: 'blur', message: '必填项' }],
}

在这个格式里面,比较重要的主要是2个,keycomponentkey其实就是你表单里数据的字段名,而component则是你指定的编辑组件,在这里我们可以直接使用字符串,但其实这里可以通过vue的动态组件实现更灵活的应用,比如我们换一个组件库的input组件

import { Input } from '@varlet/ui' 
import '@varlet/ui/es/input/style/index.js'
const oneItem = {  component:  Input }

这时候,我们就需要动态组件去渲染它,因此我们可以这样写去渲染,当component是一个字符串,比如el-input的时候,我们渲染elementinput组件,至于v-model这些我就省略了

<el-form-item v-for="item in items" :key="item.key">
  <el-input v-if="item.component === 'el-input'" />
  <component v-else :is="item.component" />
</el-form-item>

v-bind的妙用

每个组件库的组件参数都不一样,而且有些属性我们可能并不使用,比如el-input有这个属性prefix-icon,是一个前缀图标,别的组件库不一定有啊,那到我们需要把所有组件库的所有属性都写在json? 我在之前的json中设计了以个props字段,这里面就是存放的是组件库的属性,或者是我们需要给组件传的值. 这时候,vue给我们提供了一个很方便的功能,直接使用v-bind传入一个对象,他就自动会帮我们把属性绑定。 比如这样写

const props = {a:1,b:2}
 <el-input v-if="item.component === 'el-input'" v-bind="props" />

vue就会自动处理为下面这种, 这就是v-bind的妙用。当然运用renderFunction也可以实现这个效果,诸君可以自己尝试一下

 <el-input v-if="item.component === 'el-input'" v-bind:a="props.a" v-bind:a="props.b"/>

computed的妙用:实现v-model

下面我们来看一下数据的问题,vue中提供了方便v-model,方便我们修改的值能实时响应,并且我们可以自己实现一自定义v-model。 它的基本原理是这样,我们先父传子,然后子再通过事件告诉父组件修改这个值。大概实现就是这样

<script>
    <button>+1</button>
</script>
export default{
    props:[
    'modelValue', //v-model
    'a' //v-model:a
    ],
    emits:['update:modelValue','update:a'],
    methods:{
        add(){
            this.$emit('update:modelValue',this.modelValue++)
            this.$emit('update:a',this.a++)
        }
    }
}

但是这个代码里有一个问题,在vue中我们其实是无法修改props的,也就是说this.modelValue++会报错,那么如何解决这个问题呢,答案就是computed,computed其实也可以修改的,我们可以指定它的set方法,这样就躲避了修改props的问题,从而实现了v-model

{
    computed:{
        num:{
            get(){
                return this.modelValue
            },
            set(val){
                 this.$emit('update:modelValue',val)
            }
        }
    }
}

useAttrs的妙用

在我的组件中有这样一个功能,上传。这就涉及到了回调函数的问题,也就是说我上传完,甚至包括方法的名字,这样才更灵活,比如我们在json中新增一个字段,

{
 uploader: {
     emits: 'handleUploadCover',
 }
}

然后我在渲染的时候会给它绑上这个事件,那么我们如何获取到这个事件的函数,并调用呢?

<zForm @handleUploadCover="xxx" />

在vue3中,我使用了useAttrs,需要注意的是vue3这里似乎与vue2有些不同。vue3中,attrs获取到的是没有注册的值,比如你如果在emits里声明了,在这里就取不到了,不过这也正合我意,我们可以随意指定事件名。

const attrs = useAttrs()

可以看到这里能获取事件,只是名字略有不同,这里大家处理一下就行了

表单验证

表单里最重要的就是验证.首先在我之前的设计中,表单验证的规则是分布在每一个子项中,因此我们需要整合一下,这一块我就不赘述了,也很简单。

验证方法我是直接使用的el-form的验证,只是封装了一下罢了。 需要注意的是,如果你用的是script setup,需要使用defineExpose导出这个方法

const validate = ()=> new Promise((resolve) => {
        this.$refs.form.validate((isValid) => resolve(isValid));
      })
 defineExpose({
     validate
 })     

上传文件

上传文件这里我其实截取了一下element的上传,只使用了它选择的文件的功能,这块其实可以自己实现的。 因为我上传中间还要加很多参数,还有验证,因此我使用了before-upload方法,并主动reject.

 <el-upload
        v-if="item.uploader"
        style="margin-top: 10px"
        :before-upload="(file) => beforeUpload(file, item)"
        :show-file-list="false"
        v-bind="item.uploader.props"
      >
        <el-button type="primary">点击上传</el-button>
 </el-upload>
 const beforeUpload = (rawFile, { key, uploader }) => {
     
     return Promise.reject()
 }

代码总结

我把demo放到了这里,后续有时间我整理一下发个npm包。 stackblitz.com/edit/vue-m8…

这次封装这个组件,我学到了很多东西,一些比较细微的vue3知识点,比如v-bind。但我也知道这也封装也有一些问题或者叫争论。

到底应不应该使用json

之前看过一篇封装el-table的文章,里面就反对使用json,原因无非2点:json结构过于庞大,json结构不利于接手代码的人使用。

  • 先说第二点,我觉得通过一个好的结构定义是可以缓解这个问题的,但是难道你函数式封装就没有学习成本了?我觉得json封装其实每次就是复制黏贴,反而学习成本更低,但是开发成本会更高,你需要处理各种错误的值,错误的结构,因此结构越简单越好,甚至可以拍平。
  • json并不庞大,庞大的是我们的表单,如果你表单里几百个条目,你怎么样写都只会庞大,因此还是建议分割表单,及时上报。

需不需要v-model

在我这次封装中,我把数据通过v-model实时返回了,但是当我写到结尾的时候,我觉得表单的数据并不需要实时,因为我们需要的不是实时的数据,而是验证后的正确数据。因此我觉得我们可以暴露出一个getData方法,返回验证正确的数据。

性能问题

实际使用中,我发现这样封装似乎有点卡,目前暂时不知道是哪里的问题,有待研究

以上就是vue3 element的Form表单用法实例的详细内容,更多关于vue3 element Form表单的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue3element的Form表单用法实例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue3element的Form表单用法实例

这篇文章主要为大家介绍了vue3中element的Form表单用法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

html form表单的概述和用法

这篇文章主要介绍“html form表单的概述和用法”,在日常操作中,相信很多人在html form表单的概述和用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html form表单的概述和用法”的疑惑有所
2023-06-20

el-form表单验证的一些实用方法总结

表单校验是注册环节中必不可少的操作,表单校验通过一定的规则来确保用户提交数据的有效性,下面这篇文章主要给大家介绍了关于el-form表单验证的一些实用方法,需要的朋友可以参考下
2023-01-04

使用js提交form表单的两种方法

使用JavaScript提交表单有两种常见的方法:1. 使用`submit()`方法:可以在表单元素上调用`submit()`方法来提交表单。例如:```document.getElementById("myForm").submit();
2023-09-17

Springboot接收 Form 表单数据的示例详解

这篇文章主要介绍了Springboot接收 Form 表单数据的实例代码,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

SpringSecurity自定义Form表单使用方法讲解

这篇文章主要介绍了SpringSecurity自定义Form表单使用方法,虽然SpringSecurity提供了默认的登录表单,实际项目里肯定是不可以直接使用的,当然SpringSecurity也提供了自定义登录表单的功能
2023-01-17

JS的Form表单转JSON格式如何实现

今天小编给大家分享的是JS的Form表单转JSON格式如何实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目录一、serialize()方法二、serializeArray()方法
2023-07-06

如何使用 Golang 实现 Form 表单文件上传?

go 语言使用 form 表单实现文件上传包括以下步骤:在 html 中设置 enctype="multipart/form-data" 属性,创建表单。在 go 中使用 r.parsemultipartform() 处理表单请求。使用 r
如何使用 Golang 实现 Form 表单文件上传?
2024-05-13

ajax提交form表单数据的方法有哪些

有以下几种方法可以使用Ajax提交form表单数据:1. 使用`FormData`对象:可以使用`FormData`对象来收集form表单中的数据,然后通过Ajax提交。示例代码如下:```javascriptvar form = docu
2023-08-08

php获取form表单数据的方法有哪些

在PHP中,有以下几种方法可以获取form表单数据:1. 使用$_POST数组:$_POST是一个预定义的全局变量,用于收集通过POST方法提交的表单数据。可以通过$_POST['name']来获取表单中name属性对应的值。2. 使用$_
2023-08-17

编程热搜

目录