form组件的封装(element ui ) 简单版本
当你使用Vue.js构建Web应用时,封装可复用组件是提高开发效率和代码可维护性的关键之一。在这篇文章中,我们将探讨如何使用Vue.js来创建一个通用的表单组件,以及如何将它封装成一个可配置的组件。
实现思路
- 拿下表单模板
- 一个个的改造(文本,下拉,单选,复选等)
- 按钮
- 默认值的设定
- rules规则的处理
创建通用的form组件
这段代码是一个Vue.js组件,用于创建一个动态表单。以下是对代码的简要解释:
1. 在模板部分,使用`<el-form>`创建一个表单,绑定了`ruleForm`对象作为数据模型和`rules`对象作为验证规则。
2. 使用`v-for`循环遍历`data.items`,根据每个`item`的类型创建不同的表单元素,如输入框、选择框、开关、多选框、单选框、文本域、日期选择器和时间选择器。
3. 在`<el-form-item>`内部,根据`item.type`的不同,使用Vue指令`v-if`来渲染不同的表单元素。
4. 在脚本部分,定义了一个Vue组件,接受一个`data`对象作为属性传递进来,初始化了`ruleForm`和`rules`对象。
5. 在`created`生命周期钩子中,调用`init`方法初始化表单的默认值和验证规则。
6. `init`方法根据每个`item`的类型,将默认值设置到`ruleForm`中。
7. 定义了`callSeif`方法,用于处理按钮的点击事件,包括提交表单和重置表单。
8. `submitForm`方法通过`validate`函数验证表单的有效性,如果通过验证,则执行回调函数。
9. `resetForm`方法用于重置表单,根据不同的表单元素类型清空表单字段。
这段代码用于创建一个可配置的动态表单,通过传入不同的配置数据,可以生成不同类型的表单,并在用户交互时执行相应的操作。这是一个强大的工具,可用于快速构建各种表单页面。如果需要更详细的文章,请提供具体的方向或问题。
<template><el-form :model="ruleForm" :rules="rules" ref="ruleForm" :label-width="data.width"><el-form-item :label="item.label" :prop="item.prop" v-for="(item, k) in data.items" :key="k"><el-input v-if="item.type == 'Input'" v-model="ruleForm[item.prop]" :placeholder="item.placeholder":style="{ width: item.width }"></el-input><el-select v-model="ruleForm[item.prop]" v-if="item.type == 'Select'" :placeholder="item.placeholder":style="{ width: item.width }"><el-option v-for="(o, i) in item.options" :label="o.label" :value="o.value" :key="i"></el-option></el-select><el-switch v-model="ruleForm[item.prop]" v-if="item.type == 'Switch'"></el-switch><el-checkbox-group v-model="ruleForm[item.prop]" v-if="item.type == 'Checkbox'"><el-checkbox :label="o.value" v-for="(o, i) in item.options" :key="i">{{item.label}}</el-checkbox></el-checkbox-group><el-radio-group v-model="ruleForm[item.prop]" v-if="item.type == 'Radio'"><el-radio :label="o.value" v-for="(o, i) in item.options" :key="i">{{item.label}}</el-radio></el-radio-group><el-col :span="item.span || 11"><el-input v-if="item.type == 'Textarea'" v-model="ruleForm[item.prop]" :placeholder="item.placeholder"type="textarea"></el-input></el-col><el-col :span="item.span || 5"><el-date-picker type="date" style="width: 100%" v-model="ruleForm[item.prop]" :placeholder="item.placeholder"v-if="item.type == 'Date'"></el-date-picker></el-col><el-col :span="item.span || 5"><el-time-picker style="width: 100%" v-model="ruleForm[item.prop]" :placeholder="item.placeholder"v-if="item.type == 'Time'"></el-time-picker></el-col><el-col :span="item.span || 5"><el-date-picker type="datetime" style="width: 100%" v-model="ruleForm[item.prop]" :placeholder="item.placeholder"v-if="item.type == 'Datetime'"></el-date-picker></el-col></el-form-item><el-form-item><el-button :type="b.type" @click="callSeif('ruleForm', b.action, b.call)" v-for="(b, k) in data.buttons" :key="k">{{b.label }}</el-button></el-form-item></el-form>
</template>
<script>
export default {props: {data: Object,},name: "Form",data() {return {ruleForm: {},rules: {},};},created() {this.init();},methods: {init() {let form = {};let box = [];this.data.items.forEach((item) => {switch (item.type) {case "Checkbox":if (item.default) {if (Array.isArray(item.default)) {box = box.concat(item.default);} else {box.push(item.default);}}form[item.prop] = box;break;case "Datetime":if (item.default) {form[item.prop] = new Date(item.default);}break;case "Time":if (item.default) {form[item.prop] = new Date(item.default);}break;case "Date":if (item.default) {form[item.prop] = new Date(item.default);}break;default:form[item.prop] = item.default;break;}});this.ruleForm = form;console.log(form);this.rules = this.data.rules},callSeif(formName, action, callback) {if (action == "submit") {this.submitForm(formName, callback);} else if (action == "reast") {this.resetForm(formName);} else {callback && callback();}},submitForm(formName, callback) {this.$refs[formName].validate((valid) => {if (valid) {callback && callback(this.ruleForm);} else {console.log("error submit!!");return false;}});},resetForm(formName) {console.log("重置",);let form = {};this.data.items.forEach((item) => {switch (item.type) {case "Checkbox":form[item.prop] = [];break;default:form[item.prop] = '';break;}});this.ruleForm = form;this.$refs[formName].resetFields();console.log(this.ruleForm);},},
};
</script>
如何使用这个组件
现在,让我们看看如何在Vue.js应用中使用这个通用的表单组件。首先,你需要导入这个组件并注册它,然后可以在模板中使用它。
<template><div class="table-page"><Form :data="formData"></Form></div>
</template>
<script>
import Form from "./componentsdemo/form.vue";
export default {name: "Index",components: {Form,},data() {return {formData: {width: "180px",items: [{type: "Input",label: "活动名称",prop: "name",width: "100px",placeholder: "请输入活动区域",default: "请",},{type: "Select",placeholder: "请选择活动区域",prop: "region",label: "活动区域",options: [{label: "区域一",value: "shanghai",},{label: "区域二",value: "beijing",},],default: "shanghai",},{type: "Switch",label: "即时配送",prop: "delivery",default: true,},{type: "Checkbox",label: "活动性质",prop: "type",options: [{label: "线下主题活动",value: "1",},{label: "单纯品牌曝光",value: "2",},],default: ["1", "2"],},{type: "Radio",label: "特殊资源",prop: "resource",options: [{label: "线下主题活动",value: "a",},{label: "单纯品牌曝光",value: "b",},],default: 'a',},{type: "Textarea",label: "活动形式",prop: "desc",placeholder: "请输入活动形式",span: 10,default: '活动',},{type: "Date",label: "活动日期",prop: "data1",placeholder: "请输入活动日期",span: 10,default: '2023-08-21',},{type: "Time",label: "活动时间",prop: "data2",placeholder: "请输入活动时间",span: 10,default: '2023-08-21 12:00:00',},{type: "Datetime",label: "活动日期时间",prop: "data3",placeholder: "请输入活动日期时间",span: 10,default: '2023-08-21 12:00:00',},],buttons: [{label: "确定",type: "text",action: "submit",call: (Form) => {console.log(Form);},},{label: "重置",type: "text",action: "reast",call: () => {console.log("reast");},},],rules: {// name: [// { required: true, message: "请输入活动名称", trigger: "blur" },// { min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" },// ],region: [{ required: true, message: "请选择活动区域", trigger: "change" }],date1: [{ type: "date", required: true, message: "请选择日期", trigger: "change" },],date2: [{ type: "date", required: true, message: "请选择时间", trigger: "change" },],type: [{type: "array",required: true,message: "请至少选择一个活动性质",trigger: "change",},],resource: [{ required: true, message: "请选择活动资源", trigger: "change" }],desc: [{ required: true, message: "请填写活动形式", trigger: "blur" }],}},};},methods: {},
};
</script>
在上述示例中,我们首先导入了通用下拉选择框组件,然后在模板中使用它,并将需要的数据传递给它。当选择项发生变化时,我们可以通过@change事件来处理选择结果。
结语
通过封装通用组件,我们可以在Vue.js应用中轻松地实现重复使用的功能,提高开发效率并减少重复工作。通用表单组件是一个很好的例子,它可以根据不同的需求进行配置,使其适用于多种情况。希望本文对你理解如何创建和使用Vue.js组件有所帮助!
相关文章:
form组件的封装(element ui ) 简单版本
当你使用Vue.js构建Web应用时,封装可复用组件是提高开发效率和代码可维护性的关键之一。在这篇文章中,我们将探讨如何使用Vue.js来创建一个通用的表单组件,以及如何将它封装成一个可配置的组件。 实现思路 拿下表单模板一个个的改造&#x…...
树形DP杂题
引 对老师布置的题目稍微记录一下吧 也算对树形 D P DP DP 的巩固 T1 Ostap and Tree 题目传送门 由于有 距离 k 距离k 距离k 的限制,设计二维 d p dp dp 设计状态: f i , j : i 的子树内,离 i 最近的染色点与 i 距离为 j 且若 j <…...
Webpack使用plugin插件自动在打包目录生成html文件
我们使用html-webpack-plugin插件可以自动在打包代码目录生成html文件 使用步骤: 一、安装依赖 在控制台中输入如下代码: npm i -D html-webpack-plugin 二、在webpack.config.js中配置插件 const HTMLPlugin require("html-webpack-plugin&q…...
图像处理与计算机视觉--第一章-计算机视觉简介-10问
第一章-计算机视觉简介-10问 1.CV与AI的关系是什么? CV(Computer Vision)是Al的子领域,它致力于使计算机能够理解和解释图像和数据,CV借助AI技术,比如深度学习/机器学习,实现目标识别,分析和处理任务。AI提供了CV所需要的算法…...
LeetCode 80. 删除有序数组中的重复项 II
文章目录 一、题目二、Java 题解 一、题目 给你一个有序数组 nums,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用…...
【前端面试题】浏览器面试题
文章目录 前言一、浏览器面试问题1.cookie sessionStorage localStorage 区别2.如何写一个会过期的localStorage,说说想法2.如何定时删除localstorage数据2.localStorage 能跨域吗2.memory cache 如何开启2.localstorage的限制2.浏览器输入URL发生了什么2.浏览器如何…...
PHP 生成 PDF文件
参考官网 Example 009 : Image() TCPDF laravel 可以使用 composer 安装 tecnickcom/tcpdf 进行使用 //require_once("../app/Extend/tcpdf/tcpdf.php"); $pdf new TCPDF();// 设置文档信息$pdf->SetCreator(懒人开发网);$pdf->SetAuthor(懒人开发网);$…...
讲讲项目里的仪表盘编辑器(一)
需求 要做一个仪表盘系统,要求有: ① 设计功能(包括布局、大小、排列) ② 预览功能 ③ 运行功能 布局选择 做编辑器,肯定要先选择布局。 前端有几种常用布局。 静态布局 也叫文档布局。默认的网页形式…...
解决方案 | 如何构建市政综合管廊安全运行监测系统?
如何构建市政综合管廊安全运行监测系统?WITBEE万宾城市生命线智能监测仪器,5年免维护设计,集成10多项结构与气体健康监测指标,毫秒级快速响应,时刻感知综合管廊运行态势...
JCEF中js与java交互、js与java相互调用
jcef中js与java相互调用,java与js相互调用,chrome与java相互调用,java与chrome相互调用、jcef与java相互调用 前提:https://blog.csdn.net/weixin_44480167/article/details/133170970(java内嵌浏览器CEF-JAVA、jcef、…...
9.20 校招 实习 内推 面经
绿泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、校招丨智行者2024年校园招聘正式启动啦 校招丨智行者2024年校园招聘正式启动啦 2、校招 | 乐动机器人2024校园招聘 校招 | 乐动机器人2024校园招聘 3、校招丨小天才2024届秋季校园招聘 …...
基于JAVA+SpringBoot+Vue+协同过滤算法+爬虫的前后端分离的租房系统
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着城市化进程的加快…...
【Android Framework系列】第16章 存储访问框架 (SAF)
1 概述 Android 4.4(API 级别 19)引入了存储访问框架 (Storage Access Framework)。SAF让用户能够在其所有首选文档存储提供程序中方便地浏览并打开文档、图像以及其他文件。 用户可以通过易用的标准 UI,以统一方式在所有应用和提供程序中浏…...
Antdesign 4中让分页组件居中显示的方法
在Ant Design 4中分页组件默认是最右边显示的,而这个没有设置位置的属性的 解决办法: 在pagination的属性中增加: style: {textAlign: "center"} 在Ant Design 5中可以让pagination使用align: center来实现分页组件居中...
【笔记】ubuntu 20.04 + mongodb 4.4.14定时增量备份脚本
环境 ubuntu 20.04mongodb 4.4.14还没实际使用(20230922)后续到10月底如果有问题会修改 原理 只会在有新增数据时生成新的备份日期目录备份恢复时,如果恢复的数据库未删除,则会覆盖数据 准备 准备一个文件夹,用于…...
c++实现的一个定时器实例
/* * author: hjjdebug * date : 2023年 09月 23日 星期六 11:52:29 CST * description: 用std::thread 实现了一个定时器,深刻理解一下定时器是怎样工作的. * 参考Timer.h, Timer.cpp */ $ cat main.cpp #include "Timer.h" #include <unis…...
Python线程和进程
1、深度解析Python线程和进程 一篇文章带你深度解析Python线程和进程 - 知乎使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计。如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮…...
算法 寻找峰值-(二分查找+反向双指针)
牛客网: BM19 题目: 寻找数组峰值,可能多个返回任一个,每个值满足nums[i] ! nums[i 1] 思路: 双指针 left 0, right n-1, 相向而行,取中间位置mid, nums[mid]与nums[mid1]比较,如果nums[mid] < nums[mid1],说明…...
【数据结构】—交换排序之快速排序究极详解,手把手带你从简单的冒泡排序升级到排序的难点{快速排序}(含C语言实现)
食用指南:本文在有C基础的情况下食用更佳 🔥这就不得不推荐此专栏了:C语言 ♈️今日夜电波:靴の花火—ヨルシカ 0:28━━━━━━️💟──────── 5:03 …...
【c#-Nuget 包“在此源中不可用”】 Nuget package “Not available in this source“
标题c#-Nuget 包“在此源中不可用”…但 VS 仍然知道它吗? (c# - Nuget package “Not available in this source”… but VS still knows about it?) 背景: 今日从公司svn 上拉取很久很久以前的代码,拉取下来200报错,进一步发…...
【数据结构】二叉树之堆的实现
🔥博客主页:小王又困了 📚系列专栏:数据结构 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、二叉树的顺序结构 📒1.1顺序存储 📒1.2堆的性质…...
电工-三极管输入输出特性曲线讲解
三极管特性曲线是反映三极管各电极电压和电流之间相互关系的曲线,是用来描述晶体三极管工作特性曲线,常用的特性曲线有输入特性曲线和输出特性曲线。这里以下图所示的共发射极电路来分析三极管的特性曲线。 输入特性曲线 该曲线表示当e极与c极之间的电…...
深入解析容器与虚拟化:技术、对比与生态
深入解析容器与虚拟化:技术、对比与生态 文章目录 深入解析容器与虚拟化:技术、对比与生态容器和虚拟化的基本概念和原理容器的定义和特点虚拟化的定义和特点 容器使用场景容器和虚拟机的对比虚拟化技术的四个特点容器实现虚拟化的原理常见容器引擎和容器…...
制作游戏demo的心得
制作这个游戏demo出来的心得 https://www.bilibili.com/video/BV1cF411m7Dh/ 制作游戏demo的心得 制作游戏demo,主要是为了表现自己的技术,那就一门心思想着如何提高表现力就行了,在整体的画面渲染风格方面或许没有什么可选择的,…...
Web Tour Server窗口闪现
1.打开该文件所在位置 2.右击选择编辑,在最后一行加上pause,保存后重新打开Server窗口 3.重新打开后,若出现以下情况: 以管理员身份打开cmd命令行,输入命令netstat -aon|findstr “1080”,查看1080端口占用…...
Linux下的基本指令
目录 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令(重要): 06.rmdir指令 && rm 指令(重要): 07.man指令(重要): 08mv指令ÿ…...
随机数生成器代码HTML5
代码如下 <!DOCTYPE html> <html> <head> <title>随机数生成器</title> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <style> body { text-align: center; bac…...
正确理解redux Toolkits中createSlice的action.payload
使用redux Toolkits中的createSlice编写extraReducers经常看到使用action.payload来更新state状态值: 那么action.payload指的到底是什么? 让我们看看action的定义部分: 注意: action.payload不是上面ajax请求的返回内容&#x…...
YOLOv8快速复现 官网版本 ultralytics
YOLOV8环境安装教程.:https://www.bilibili.com/video/BV1dG4y1c7dH/ YOLOV8保姆级教学视频:https://www.bilibili.com/video/BV1qd4y1L7aX/ b站视频:https://www.bilibili.com/video/BV12p4y1c7UY/ 1 平台搭建YOLOv8 平台:https://www.a…...
Haproxy搭建 Web 群集实现负载均衡
目录 1 Haproxy 1.1 HAProxy的主要特性 1.2 HAProxy负载均衡策略 1.3 LVS、Nginx、HAproxy的区别 2 Haproxy搭建 Web 群集 2.1 haproxy 服务器部署 2.1.1 关闭防火墙 2.1.2 内核配置(实验环境可有可无) 2.1.3 安装 Haproxy 2.1.4 Haproxy服务…...
武汉模板建站代理/如何推广网页
中文说明:专业增强版 文件名称:ProPlus2021Retail.img 下载地址:http://officecdn.microsoft.com/pr/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-cn/ProPlus2021Retail.img 中文说明:专业版 文件名称:Profession…...
网站的版面布局/什么是核心关键词
在这篇由两部分组成的文章中,Elliotte Rusty Harold 与您一起探讨经典java.lang.Math 类中的“新”功能。第 1 部分主要讨论比较单调的数学函数。第 2 部分将探讨专为操作浮点数而设计的函数。有时候您会对一个类熟悉到忘记了它的存在。如果您能够写出 java.lang.Fo…...
移动端高端网站开发/网络推广协议合同范本
这是一道比较经典的题目。我先是在百度的在线笔试中遇到,然后发现剑指Offer上有原题。当然题目并不完全一样不过大致相同。 百度笔试是给你两个根节点判断第棵树是不是第一棵树的子树。剑指Offer是问你第二颗数是不是第一棵树的子结构(也就是说可是是第一…...
教育网站建设的素材/怎样进行seo推广
所有题目均有五种语言实现。C实现目录、C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录...
深圳做网站优化费用/广州网站优化公司排名
【摘 要】随着人们生活水平的不断提高,家用轿车保有量每年都在不断的攀升,导致城市交通问题日益突出。为缓解城市停车难的问题,本文提出了基于android平台下开发的共享停车系统app,意在帮助用户在高峰期劈开停车难的问题ÿ…...
做网站代理工作安全吗/优化关键词排名推广
问题解决方法问题原因 问题 编译安装redis时出现报错zmalloc.h zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory zmalloc.h:55:2: error: #error "Newer version of jemalloc required" make[1]: *** [adlist.o] Error 1 解决方法 mak…...