vue3 element-plus el-form的二次封装

这篇具有很好参考价值的文章主要介绍了vue3 element-plus el-form的二次封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

form表单的二次封装

vue3 element-plus el-form的二次封装文章来源地址https://www.toymoban.com/news/detail-539787.html

属性说明

属性名 类型 默认值 说明
data Array [] 页面展示数据内容
onChange Function false 表单事件
bindProps Object {} 表单属性
formRef Object {} 表单ref
ruleForm Object {} 数据

使用示例

	//形式一
	 <formCustom
        :data="searchHeaders"
        :bindProps="{ inline: true }"
        :ruleForm="searchRuleForm"
      ></formCustom>

	//形式二
	 <formCustom
      :data="formHeaders"
      :bindProps="{ 'label-width': '124px', 'scroll-to-error': true }"
      v-model:formRef="formRef"
      :ruleForm="ruleForm"
    ></formCustom>
// setup 形式下
import { ref,active } from 'vue'
import formCustom from "@/components/custom-form-v3/searchForm"
const formProps = {
  style: {
    marginBottom: "0",
    marginRight: "16px",
  },
};
const searchRuleForm = reactive({}); //搜索的数据

const ruleForm = reactive({}); //表单的数据
const formRef = ref()
const searchHeaders = reactive([
	{
		formProps,
		render: () => {
		return (
			<div class="flex-d-r-center">
			<div
				class="db-primary-button flex-d-r-center"
				onClick={() => addTools()}
			>
				<span class="iconfont icon-style icon-left">
				&#xe62d;
				</span>
				新增
			</div>
			</div>
		);
		},
	},
	{
		formProps: {
			style: {
				flex: 1,
				"margin-bottom": 0,
			},
		},
  	},
	{
		Component: "ElSelect",
		formProps,
		prop: "status",
		componentProps: {
			clearable:true,
			placeholder: "状态",
			style: {
				width: "101px",
			},
		},
		componentSlots: {
			default: () => {
				const data = [
				{
					label: "进行中",
					value: 1,
				},
				{
					label: "已结束",
					value: 2,
				},
				{
					label: "未开始",
					value: 3,
				},
				];
				return data.map((item) => {
					return (
						<el-option
						value={item.value}
						label={item.label}
						key={item.value}
						></el-option>
					);
				});
			},
		},
  	},
	{
		Component: "ElInput",
		formProps,
		prop: "title",
		componentProps: {
			placeholder: "请输入名称",
			style: {
				width: "205px",
			},
		},
  	},
	{
		formProps: {
			style: {
				marginBottom: "0",
				marginRight: "0",
			},
		},
		render: () => {
			return (
				<div
				class="db-primary-button flex-d-r-center"
				onClick={() => searchRes()}
				>
				<span class="iconfont icon-style icon-left">
					&#xe624;
				</span>
				查询
				</div>
			);
		},
  	},
])

const formHeaders = reactive([
	{
		label:"时间",
		prop: "times",
		span: 24,
		defaultValue: "",
		Component: "ElDatePicker",
		on: {
			change: () => {},
		},
		componentProps: {
			type: "datetimerange",
			"value-format": "YYYY-MM-DD HH:mm:ss",
			format: "YYYY-MM-DD HH:mm:ss",
			rangeSeparator: "-",
			startPlaceholder: "开始时间",
			endPlaceholder: "结束时间",
			disabled: computed(() => isDisabled(1)),
			style:{
				width: '340px'
			}
		},
		formProps: {
			rules: {
				required: true,
				trigger: "blur",
				validator: (rule, value, callback) => {
				if (value === "") {
					callback(new Error("请输入抢购时间"));
				}
				callback();
				},
			},
		},
  	},
	{
		label: "名称",
		prop: "name",
		Component: "ElInput",
		defaultValue: "",
		componentProps: {
			placeholder: "名称需2-30个字符(汉字占两个字符)",
			style: {
				width: "540px",
			},
		},
		formProps: {
			rules: {
				required: true,
				trigger: "blur",
				// message: "请输入讲师名称",
				validator: (rule, value, callback) => {
				if(value === '') {
					callback(new Error('请输入讲师名称'))
				}
				const len = strLength(value)
				if(len < 2 || len > 30) {
					callback(new Error('讲师名称需2-30个字符'))
				}
				callback()
				}
			},
		},
  	},
	{
		label: "状态",
		prop: "status",
		span: 24,
		Component: switchCons,
		defaultValue: 0,
		componentProps: {
			style: {
				width: "540px",
			},
		},
		formProps: {
			rules: {
				required: true,
				trigger: "blur",
			},
		},
  	},
])

const isDisabled = (type) => {
  const obj = {
    1: [1],
    2: [1,3]
  }
  return obj[type].includes(ruleForm.status)
}

const saveForm = () => {
  formRef.value.validate(async (valid) => { // 提交数据时验证表单
    if(valid) {
      
    }
  })
};

const addTools = () => {
  router.push({
    path: "/add"
  });
};
const searchRes = () => {
  useTableRef.value.getRequestRes("firstPage"); //刷新表格
};


//也可以注册到全局 页面中直接使用不需要import
// main.ts文件
import App from '@/App.vue'
import formCustom from "@/components/custom-form-v3/searchForm"
const app = createApp(App)
app.component('formCustom', formCustom)

到了这里,关于vue3 element-plus el-form的二次封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • element plus el-form双列布局及拓展任意布局

    一般表单我们直接默认布局,也就是单列布局,突然有个人员信息表单,需要双列布局的需求,简单实现并拓展下 直接无脑div+flex布局实现 这样的无脑实现实在是对不起付出的时间,不嫩复用是最大问题 封装el-form,增加slot // Form.vue // index.vue 依然不够通用,因为布局是固定

    2024年01月25日
    浏览(34)
  • vue3+element-plus+el-image实现点击按钮预览大图

    需求:点击某个按钮实现el-image中预览大图的效果 官方文档:以下是官方的写法,并不能达到我们的要求,官方实现的功能是点击图片达到预览大图的效果。如果你的按钮就是图片,也可以达到目前的功能 el-image-viewer组件是element官方的组件,只是文档中没有写出来,这个组

    2024年02月12日
    浏览(42)
  • Vue3 element-plus el-select 无法选中,又不报错

    html 结构 js 代码 点击下拉选项,输入框无法选中 原因:ref=“conditionForm” 和 :model=“conditionForm” 冲突了, 4-1. 再Vue2里面 :model=“conditionForm” 绑定的是 conditionForm 变量, ref=“conditionForm” 绑定的是conditionForm字符串 v-model=“conditionForm.personnel” 绑定的 conditionForm 变量下属性

    2023年04月27日
    浏览(29)
  • vue3.0 element-plus 不同版本 el-popover 循环优化

    表格内循环el-popover  渲染以后的页面,数据量很大的时候页面会卡,生成的代码: 解决思路: 将el-popover提出来,不参与循环,让el-popover只渲染一次   1、以1.1.0-beta.24版为例(低版本) 红色下划线部分是关键点     v-popover的值与el-popover的ref值要一致 2、以2.3.9版为例(当前

    2024年02月12日
    浏览(34)
  • 【踩坑笔记】vue3 element-plus el-input 无法输入问题

    原因是 el-form 的 v-model=\\\"loginForm\\\" ref=\\\"loginForm\\\" 在vue3中值不能相同 把ref去掉或者改名即可 这是js的代码( 对象记得用reactive,不然也会无法输入 ) 这个是可以输入的 这是无法输入的 就改了个ref

    2024年02月11日
    浏览(40)
  • vue3使用element-plus 树组件(el-tree)数据回显

    html搭建结构 js 非常好用,拿过来修改一下check事件,ref获取就直接可以使用了 

    2024年04月09日
    浏览(37)
  • 【Element Ui】 vue3中修改el-form的rules后不触发自动校验,再次修改rules时清除验证信息

    项目要求:类型为“业务备货”的时候,“客户”为必填项 效果如下: 代码如下: 重点:

    2024年04月12日
    浏览(38)
  • Vue - Element el-form 表单对象多层嵌套校验

    针对el-form的数据源是对象嵌套对象,在进行数据绑定和校验时和单层的对象有一点区别, 具体是下面两部分: 数据源: 1、 给 el-form-item 的 prop 设为: prop=\\\"health.height\\\" 。 v-model 设为: v-model=\\\"fromData.health.height\\\" 2、校验规则 rules 对象对应的key设置为数据源内部的值: \\\'health.heig

    2024年02月14日
    浏览(42)
  • el-form 动态表单增减项 (vue+element ui)

    1、点击”+“,弹出弹窗,新增一项,点击”-“,删除当前项 代码展示: html代码: 注意: el-form-item(表单项)循环,绑定的数组写在form当中 表单: 新增参数弹框: data: methods: 1、点击新增,弹出新增弹窗,添加表单项 2、点击”-“,删除当前表单项

    2024年02月02日
    浏览(37)
  • Vue+Element(el-upload+el-form的使用)+springboot

    目录 1、编写模板  2、发请求调接口  3、后端返回数据 1.编写实体类 2.Controller类  3、interface接口(Service层接口)  4.Service(接口实现) 5、interface接口(Mapper层接口) 6、xml 7、goods.sql 8、goods_img 4、upload相关参数   说明(该案例是一个el-form和el-upload结合的,逻辑是:需要

    2024年01月25日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包