element Plus form组件二次封装

记录一下最近封装的组件,之前有二次封装过这个组件但是后来需求更新的比较多导致组件比较乱,趁着这次的新项目重新封装了一个

<template>
	<div class="layout-padding">
		<div class="layout-padding-auto layout-padding-view">
			<el-row class="ml10" v-show="showSearch">
				<c-form
					:model="formField"
					:inline="true"
					:form-data="formData"
					:form-field="formField"
					:tools-config="{
						leftBtnS: [
							{
								text: '新增',
								onClick: () => {
									dialogVisible = true;
								},
								auths: ['merchant_export'],
							},
						],
						rightBtnS: [
							{
								text: '搜索',
								onClick: getDataList,
							},
							{
								text: '重置',
								onClick: resetQuery,
								type: 'default',
							},
						],
					}"
				/>
			</el-row>
			<c-table
				:data="state.dataList"
				@selection-change="handleSelectionChange"
				style="width: 100%"
				row-key="postId"
				border
				:cell-style="tableStyle?.cellStyle"
				:header-cell-style="tableStyle?.headerCellStyle"
				:columns="columns"
			/>
			<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination" />
		</div>
		<!-- 导入excel -->
		<el-dialog v-model="dialogVisible" :title="dialogTitle" width="30%">
			<c-form
				:loading="loading"
				ref="dataFormRef"
				:model="addField"
				:form-data="formData"
				:form-field="addField"
				:tools-config="{ noToolsShow: true }"
				:rules="rules"
			/>
			<template #footer>
				<div class="dialog-footer">
					<el-button @click="dialogVisible = false">取消</el-button>
					<el-button type="primary" @click="onSub"> 确定 </el-button>
				</div>
			</template>
		</el-dialog>
	</div>
</template>

HTML部分主要是通过传入的formData参数遍历formItem内部的表单类型,目前内部有写了常用的input textArea switch select treeSelect等组件,并且有一个插槽可在配置的时候传入slotName去绑定关联,并且将当前配置的表单项所有的参数进行传参,方便特殊样式的需求,在formitem同级有个插槽,也可根据项目需求单独书写,目前不是太完善,未来会将这个插槽再进行更好的封装,目前只能用一次,某些项目可能不太够,对象的switch也封装了相对于的事件等,通过透传属性可无需对form固有属性进行单独传参,

import { defineProps, ref } from 'vue';
import { Hide } from '@element-plus/icons-vue';
const formRef = ref();
const passwordHide = ref(true);
const props: any = defineProps({
	formField: { type: Object, default: () => {} },
	formData: { type: Array, default: () => [] },
	loading: { type: Boolean, default: false, required: false },
	isColumns: { type: Boolean, default: false, required: false },
	addClick: { type: Function },
	toolsConfig: { type: Object, default: () => {}, required: false },
	customClass: { type: String, default: '', required: false },
	formWrapperClass: { type: String, default: '', required: false },
});
const { toolsConfig, formWrapperClass, customClass } = props;
defineExpose({
	formRef,
});

js部分内容比较少

.c_form {
	width: 100%;
	margin-bottom: 16px;
	.tools {
		display: flex;
		justify-content: space-between;
	}
}

.modalFormItem {
	width: 50%;
	justify-content: flex-end;
	align-items: center;

	:deep(.el-form-item__content) {
		width: 3.95rem;
		flex: none;

		.el-select,
		.el-input-number,
		.el-input {
			width: 3.95rem;
			height: 0.5625rem;

			.el-input-number__decrease,
			.el-input-number__increase {
				height: 50%;
			}
		}

		.avatar-uploader .avatar {
			width: 178px;
			height: 178px;
			display: block;
		}

		.avatar-uploader .el-upload {
			border: 1px dashed var(--el-border-color);
			border-radius: 6px;
			cursor: pointer;
			position: relative;
			overflow: hidden;
			transition: var(--el-transition-duration-fast);
		}

		.avatar-uploader .el-upload:hover {
			border-color: var(--el-color-primary);
		}

		.el-icon.avatar-uploader-icon {
			font-size: 28px;
			color: #8c939d;
			width: 1.175rem;
			height: 1.175rem;
			text-align: center;
		}
	}
}

css部分预封装了双栏表单样式可配置isColumns为true展示

使用示例
简单的使用示例

<c-form
				:model="addField"
				:form-data="formData"
				:form-field="addField"
				:tools-config="{ noToolsShow: true }"
			/>	
const formData = [
		{ label: '姓名', type: 'input', prop: 'name' },
	];
const addField = ref({name:""})

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我来尝试给您讲解一下如何基于若依框架使用vue3+element-plus去二次封装一个el-dialog: 1. 首先,在使用vue3+element-plus进行开发前,需要先安装对应的依赖。可以通过以下命令进行安装: ``` npm install vue@next npm install element-plus --save ``` 2. 接下来,我们需要创建一个新的dialog组件。可以在`components`文件夹下新建一个`dialog.vue`文件,然后在该文件中定义我们的dialog组件。 ```vue <template> <el-dialog :visible.sync="visible" :title="title" :width="width" :before-close="beforeClose"> <slot></slot> </el-dialog> </template> <script> import { defineComponent } from 'vue' import { ElDialog } from 'element-plus' export default defineComponent({ name: 'Dialog', components: { ElDialog, }, props: { visible: { type: Boolean, default: false, }, title: { type: String, default: '', }, width: { type: String, default: '50%', }, beforeClose: { type: Function, default: () => {}, }, }, }) </script> ``` 在`dialog`组件中,我们使用了`<el-dialog>`组件,并且对其进行了二次封装。我们将`visible`、`title`、`width`和`beforeClose`四个属性绑定到`<el-dialog>`组件上,同时在`<slot>`中插入了组件传递进来的内容。 3. 接下来,我们需要在使用dialog的页面中引入该组件,并且传递需要的参数。 ```vue <template> <div> <el-button @click="showDialog">打开dialog</el-button> <dialog :visible="dialogVisible" :title="dialogTitle" :beforeClose="beforeClose"> <el-form> <el-form-item label="姓名"> <el-input v-model="name"></el-input> </el-form-item> <el-form-item label="年龄"> <el-input v-model="age"></el-input> </el-form-item> </el-form> </dialog> </div> </template> <script> import { defineComponent, ref } from 'vue' import Dialog from '@/components/dialog.vue' export default defineComponent({ name: 'Page', components: { Dialog, }, setup() { const dialogVisible = ref(false) const dialogTitle = ref('示例dialog') const name = ref('') const age = ref('') const showDialog = () => { dialogVisible.value = true } const beforeClose = (done) => { if (name.value && age.value) { done() } else { this.$message.warning('请输入完整信息') } } return { dialogVisible, dialogTitle, name, age, showDialog, beforeClose, } }, }) </script> ``` 在`Page`页面中,我们引入了刚才定义的`<dialog>`组件,并且传递了需要的参数。在点击打开dialog的按钮时,我们通过`showDialog`方法来显示dialog。在dialog关闭前,我们通过`beforeClose`方法来进行校验,只有当输入完整信息时才能关闭dialog。 至此,我们就完成了基于若依框架使用vue3+element-plus去二次封装一个el-dialog的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值