Vue3指令篇 -- 通过实现Element Plus Form添加Tip提示

摘要

正常情况下,如果我们想实现给每个 Form Item 添加提示,一般的UI设计如下图,一般都是类似于这样的在 label 后面添加一个图标,hover 显示对应的 Tip 内容。这样的话具体的代码实现如下。如果 Form 表单很多,这样就会导致这个文件的代码过于冗长。以此为初衷,下面我们将实现通过指令的方式在所有表单页为所需的表单项添加 Tip 提示组件。

<el-form-item prop='test'>
	<template #label>
		Label Name
		<el-tooltip content="tipContent">
			<el-icon><WarningFilled /></el-icon>
		</el-tooltip>
	</template>
</el-form-item>

在这里插入图片描述

指令实现

import { h, createApp } from 'vue'
import { ElTooltip, ElIcon } from 'element-plus'
import { InfoFilled } from '@element-plus/icons-vue'
import formTips from '@/const/formTips'
import store from '@/store'

function render(target, tip, cleanModal) {
	const app = createApp({
		render: () => h(
			ElTooltip,
			{
				content: tip,
				placement: 'top',
				effect: 'dark',
				enterable: false,
				popperClass: 'common-tip-popper',
				showAfter: 100,
				hideAfter: 0,
			},
			{
				default: () => h(ElIcon, {}, () => [h(InfoFilled)]),
			},
		),
	})

	const div = document.createElement('div')
	div.classList.add('form-tip-icon')
	cleanModal ? div.classList.add('hide') : div.classList.remove('hide')

	app.mount(div)
	// 查找是否已经存在
	const exist = target.querySelector('.form-tip-icon')
	exist && target.removeChild(exist)
	target.appendChild(div)
}

export default {
	beforeUpdate(el, bind) {
		const { value } = bind
		const { cleanModal, language } = store.getters

		if (!value) return

		requestIdleCallback(() => {
			Array.from(el.children).forEach((item, index) => {
				const target = item.querySelector('.el-form-item__label')

				target && formTips[value][index] && render(target, formTips[value][index], cleanModal)
			})
		})
	},
}

指令使用

<el-form :model="drawerForm" label-position="top" v-addFormTips="'form1'">
</el-form>

FormTips 文件

按顺序添加表单项的Tip文本,如果没有请填写false,如果是TypeScript的话就填空字符串,以防做了校验。formTips 的 key 值为对应模块使用指令时传入的值.

const formTips = {
	form1: [],
	form2: [],
	form3: [],
}

export default formTips
Element Plus 是一套基于 Vue.js 的 UI 组件库,它提供了一套丰富的表单组件,可以方便地处理数据的输入、验证以及文件上传等功能。要实现Element Plus 中将表单数据和文件同时发送到后端,你可以按照以下步骤操作: 1. 安装依赖: 首先,确保你在项目中已经安装了 Vue CLI 和 Element Plus。如果还没有,可以在终端运行: ``` npm install vue@latest element-plus ``` 2. 创建表单: 在 Vue 组件中,导入需要的表单组件,如 `el-form`、`el-button` 和 `el-upload`(用于文件上传): ```html <template> <el-form :model="formData" ref="formRef"> <!-- 表单字段 --> <el-input v-model="formData.title" placeholder="标题"></el-input> <!-- 文件上传部分 --> <el-upload action="your-backend-api-url" <!-- 后端接收文件的 URL --> :on-success="handleFileSuccess" :auto-upload="false" <!-- 需手动触发上传 --> > <el-button type="primary">选择文件</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500KB</div> </el-upload> </el-form> </template> ``` 3. 数据绑定和方法实现- 初始化 formData 对象,包含其他非文件字段。 - 定义 handleFileSuccess 函数,在文件成功上传后更新 formData 或者添加文件信息,然后调用提交表单的函数。 ```js <script setup> import { ElForm, ElFormItem } from &#39;element-plus&#39;; const formData = reactive({ title: &#39;&#39;, // 其他表单字段... }); function handleFileSuccess(response) { formData.file = response.file; // 假设后端返回文件信息对象 } async function submitForm() { try { await yourFormSubmitMethod(formData); // 调用自定义的后端请求方法 alert(&#39;表单提交成功&#39;); } catch (error) { console.error(&#39;提交失败:&#39;, error); } } // 模拟表单提交,实际应用中替换为axios、fetch等 async function yourFormSubmitMethod(data) { // 发送包含 formData 和 file 的数据到后端 const formDataObj = new FormData(); Object.keys(data).forEach(key => formDataObj.append(key, data[key])); if (formData.file) formDataObj.append(&#39;file&#39;, formData.file); // 发起POST请求 // const res = await axios.post(&#39;/api/submit&#39;, formDataObj); // ...其他后端交互逻辑 } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值