elementUI 组件使用分析

elementUI 事件传参:##

<el-input v-model="form.input1" placeholder="请输入内容" size="mini" @change="(val) => handleValueChange(val,'xxxx')"></el-input>

handleValueChange(val,newVal){
  console.log('默认参数:'+val,'自定义参数:'+newVal)
}

//ps: 多个参数同理,其它组件事件同理

elementUI 组件参数说明(Page)

Slot:自定义内容,需要在 layout 中列出 slot

<el-pagination
  background
  layout="prev, pager, next,slot"
  :total="1000">
	<span>我是自定义内容哦,无所谓什么标签,样式可以自定义<i class="el-icon-search"></i></span>
</el-pagination>

/* ps: 主要是在layout属性中加入slot,组件中的元素才可显示,
原理应该与vue中slot插槽同理,其它组件方式使用同理例如Step */

<el-steps :active="1">
	// 官网默认提供方式
	<el-step 
		 title="步骤 1"  
		 description="描述" 
		 icon="el-icon-picture">
	</el-step>
	
	// 想要自定义样式
	<el-step>
		<i slot="icon" class="el-icon-search"></i>
		<h3 s
<think>我们正在使用 Vue 2 和 Element UI 进行开发。目标是将弹窗(Dialog)中的表单(Form)抽离成一个独立的组件,以提高代码复用性和开发效率。 引用[1]提到配置化表单可以提升效率,引用[3]则涉及Element UI表单验证规则。因此,在抽离过程中需要特别注意表单验证的配置。 具体步骤: 1. 分析现有弹窗组件,识别表单部分(包括表单字段、验证规则等) 2. 创建独立的表单子组件使用Element UI的表单组件) 3. 定义子组件的props(用于接收父组件传递的数据,如初始值、验证规则等)和事件(用于向父组件提交数据) 4. 在子组件中实现表单验证(参考引用[3]中Element UI的表单验证机制) 5. 在父组件(弹窗)中使用组件,并处理子组件的事件(如提交表单) 6. 处理样式和配置(注意引用[2]提到的CDN引入问题,但我们的情况是组件库已全局引入,所以无需额外处理) 详细步骤: 步骤1:分析现有弹窗组件 - 假设我们有一个弹窗组件(比如UserDialog.vue),里面包含一个表单,用于创建或编辑用户信息(如用户名、邮箱等)。 - 表单使用Element UI的el-form,并且有相应的验证规则(rules)。 步骤2:创建表单子组件 - 在components目录下新建一个文件,比如UserForm.vue。 步骤3:定义子组件的props和事件 - 子组件需要接收的props可能包括: formData: 表单的初始数据(Object) formRules: 表单验证规则(Object)[可选,也可以直接在子组件内定义] - 子组件需要触发的事件: submit: 当表单验证通过并提交时触发,将表单数据作为参数传递给父组件。 步骤4:在子组件中实现表单验证 - 使用Element UI的el-form,并设置rules属性(可以来自props或内部定义)。 - 在提交表单时,使用el-form的validate方法进行验证。 步骤5:在父组件(弹窗)中使用组件 - 在弹窗组件中引入并注册表单子组件。 - 通过props将初始数据和验证规则传递给子组件。 - 监听子组件的submit事件,在事件处理函数中处理表单数据(如发送请求)。 代码示例: 1. 子组件(UserForm.vue): ```vue <template> <el-form :model="formData" :rules="formRules" ref="userForm" label-width="100px"> <el-form-item label="用户名" prop="username"> <el-input v-model="formData.username"></el-input> </el-form-item> <el-form-item label="邮箱" prop="email"> <el-input v-model="formData.email"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> </template> <script> export default { props: { // 初始表单数据 initialData: { type: Object, default: () => ({ username: '', email: '' }) }, // 验证规则(也可以直接在子组件内定义,但为了灵活性,这里通过props传递) formRules: { type: Object, default: () => ({ username: [ { required: true, message: '请输入用户名', trigger: 'blur' } ], email: [ { required: true, message: '请输入邮箱', trigger: 'blur' }, { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] } ] }) } }, data() { return { formData: { ...this.initialData } }; }, watch: { // 如果父组件更新了初始数据,同步到表单数据 initialData: { handler(newVal) { this.formData = { ...newVal }; }, deep: true } }, methods: { submitForm() { this.$refs.userForm.validate(valid => { if (valid) { // 验证通过,触发submit事件,并传递表单数据 this.$emit('submit', this.formData); } else { console.log('表单验证失败'); return false; } }); } } }; </script> ``` 2. 父组件(弹窗组件,比如UserDialog.vue): ```vue <template> <el-dialog :visible="visible" @close="closeDialog" title="用户信息"> <!-- 使用表单子组件,传递初始数据和验证规则,并监听提交事件 --> <user-form :initial-data="currentUser" :form-rules="rules" @submit="handleSubmit" /> </el-dialog> </template> <script> import UserForm from '@/components/UserForm.vue'; export default { components: { UserForm }, props: { visible: Boolean, // 控制弹窗显示 userData: Object // 从父组件传递过来的用户数据(用于编辑) }, data() { return { // 当前表单数据,可能是新建(空)或编辑(传入的数据) currentUser: this.userData || { username: '', email: '' }, // 验证规则(也可以直接在子组件定义,但这里为了父组件可以统一管理规则,所以通过props传递) rules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' } ], email: [ { required: true, message: '请输入邮箱', trigger: 'blur' }, { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] } ] } }; }, watch: { // 如果父组件传递的userData变化(比如切换到不同用户编辑),更新currentUser userData: { handler(newVal) { this.currentUser = { ...(newVal || { username: '', email: '' }) }; }, deep: true } }, methods: { closeDialog() { this.$emit('update:visible', false); }, handleSubmit(formData) { // 处理提交逻辑,例如发送API请求 console.log('提交表单数据:', formData); // 提交后关闭弹窗 this.closeDialog(); } } }; </script> ``` 注意点: - 表单验证规则(rules)可以放在子组件内,也可以由父组件传递(如示例)。后者更灵活,适合多个地方使用相同表单但验证规则不同的情况。 - 初始数据通过props传入子组件,并在子组件内部维护一份拷贝(避免直接修改父组件数据)。当父组件传入的初始数据变化时,通过watch更新子组件内部数据。 - 在弹窗关闭时,可能需要重置表单。可以在子组件中暴露一个重置方法,父组件通过ref调用。或者每次打开弹窗时,父组件传递新的初始数据(如示例通过watch更新)。 扩展:如果需要在打开弹窗时重置表单,可以在父组件中监听visible的变化,当visible变为true时,重置currentUser(如果是新建,则设为空对象;如果是编辑,则设为传入的userData)。或者,在子组件中定义一个重置方法,父组件通过ref调用: - 在子组件中添加方法: resetForm() { this.$refs.userForm.resetFields(); } - 父组件中,当弹窗打开时(visible为true),通过ref调用子组件的resetForm方法(注意:需要在弹窗打开后,表单已经渲染,所以可以在nextTick中调用)。 通过以上步骤,我们成功将表单从弹窗中抽离,实现了组件的复用。这样,在多个弹窗使用相同表单时,只需引入同一个表单组件即可[^1][^3]。 §§相关问题§§ 1. 在Element UI中,表单验证规则有哪些常见配置? 2. 如何实现弹窗打开时自动重置表单? 3. 在Vue2中,如何优雅地处理表单组件的重置功能?</think>### 在 Vue 2 + Element UI 项目中抽离弹窗表单组件的具体步骤 #### 步骤 1: 分析现有弹窗结构 - **识别表单元素**:找出弹窗中所有表单字段(如输入框、选择器等)和验证规则 - **确定数据流**: - 父组件传递给表单的初始数据(如编辑时的预填数据) - 表单提交时需要回传的数据结构 - **示例场景**:用户管理弹窗包含用户名、邮箱等字段[^1] #### 步骤 2: 创建独立表单组件 ```vue <!-- components/UserForm.vue --> <template> <el-form :model="formData" :rules="formRules" ref="userForm" label-width="120px" > <el-form-item label="用户名" prop="username"> <el-input v-model="formData.username" /> </el-form-item> <el-form-item label="邮箱" prop="email"> <el-input v-model="formData.email" /> </el-form-item> <!-- 更多表单项... --> </el-form> </template> <script> export default { props: { // 接收父组件传递的初始数据 initialData: { type: Object, default: () => ({ username: '', email: '' }) } }, data() { return { formData: { ...this.initialData }, // 拷贝初始数据 formRules: { // 验证规则 username: [ { required: true, message: '请输入用户名', trigger: 'blur' } ], email: [ { required: true, message: '请输入邮箱', trigger: 'blur' }, { type: 'email', message: '邮箱格式不正确', trigger: ['blur', 'change'] } ] } } }, methods: { // 暴露给父组件的验证方法 validate() { return this.$refs.userForm.validate() }, // 暴露给父组件的获取数据方法 getFormData() { return { ...this.formData } } } } </script> ``` #### 步骤 3: 重构弹窗组件 ```vue <!-- UserDialog.vue --> <template> <el-dialog :visible.sync="visible" title="用户信息" @closed="handleClose" > <!-- 使用抽离的表单组件 --> <user-form ref="userForm" :initial-data="currentUser" /> <div slot="footer"> <el-button @click="visible = false">取消</el-button> <el-button type="primary" @click="handleSubmit">提交</el-button> </div> </el-dialog> </template> <script> import UserForm from '@/components/UserForm' export default { components: { UserForm }, props: { userData: Object // 父组件传入的用户数据 }, data() { return { visible: false, currentUser: { ...this.userData } // 本地拷贝 } }, methods: { // 打开弹窗方法(可被父组件调用) open(user) { this.currentUser = user ? { ...user } : { username: '', email: '' } this.visible = true }, // 提交处理 async handleSubmit() { try { // 调用子组件验证 await this.$refs.userForm.validate() // 获取表单数据 const formData = this.$refs.userForm.getFormData() // 提交到父组件 this.$emit('submit', formData) this.visible = false } catch (e) { console.log('表单验证失败', e) } }, // 关闭时重置 handleClose() { this.$refs.userForm.resetFields && this.$refs.userForm.resetFields() } } } </script> ``` #### 步骤 4: 父组件调用示例 ```vue <!-- ParentComponent.vue --> <template> <div> <el-button @click="openDialog">添加用户</el-button> <user-dialog ref="userDialog" @submit="handleSubmit" /> </div> </template> <script> import UserDialog from '@/components/UserDialog' export default { components: { UserDialog }, methods: { openDialog() { this.$refs.userDialog.open() // 打开空表单 }, // 处理编辑场景 editUser(user) { this.$refs.userDialog.open(user) // 传入用户数据 }, handleSubmit(formData) { // 提交到API this.$api.saveUser(formData).then(() => { this.$message.success('保存成功') }) } } } </script> ``` #### 关键优化点 1. **验证规则抽离**: ```js // utils/validationRules.js export const usernameRule = [ { required: true, message: '请输入用户名', trigger: 'blur' } ] // 在表单组件中引入 import { usernameRule } from '@/utils/validationRules' ``` 2. **动态规则配置**: ```vue <script> export default { props: { rules: Object // 允许父组件覆盖默认规则 }, computed: { mergedRules() { return { ...this.defaultRules, ...this.rules } } } } </script> ``` 3. **表单重置优化**: ```js // 在表单组件中添加 methods: { resetForm() { this.formData = { ...this.initialData } this.$refs.form.resetFields() } } ``` #### 注意事项 1. **数据隔离**:始终使用 `{ ...source }` 进行对象拷贝,避免直接修改 prop[^3] 2. **验证机制**:Element UI 通过 `prop` 属性关联验证规则和表单项[^3] 3. **性能优化**:复杂表单使用 `v-if` 控制渲染,避免不必要的 DOM 操作 4. **样式覆盖**:使用深度选择器处理弹窗内表单样式: ```css /* 在弹窗组件中 */ :deep(.el-form-item) { margin-bottom: 18px; } ``` 通过这种抽离方式,相同表单可在不同弹窗中复用,开发效率提升显著[^1]。表单验证逻辑集中管理,代码可维护性增强[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值