vue有三个个表单的前6个formitem都一样,就最后两三个不一样,我该怎么封装成一个表单,代码展示一下谢谢
时间: 2024-05-13 10:21:06 浏览: 71
可以考虑使用动态组件和插槽来实现封装。
首先,在父组件中定义一个数组,包含三个表单项的配置信息:
```
data() {
return {
formItems: [
{ label: '用户名', prop: 'username', type: 'input' },
{ label: '密码', prop: 'password', type: 'password' },
{ label: '确认密码', prop: 'confirmPassword', type: 'password' },
// 省略其他配置项
]
}
}
```
然后在父组件的模板中,使用`v-for`遍历该数组,动态渲染表单项组件:
```
<el-form>
<el-form-item v-for="item in formItems" :label="item.label" :prop="item.prop">
<component :is="item.type" v-model="form[item.prop]" :placeholder="item.label"></component>
</el-form-item>
// 省略其他表单项
</el-form>
```
其中,`component`标签用于动态渲染组件,`:is`属性指定要渲染的组件类型,`v-model`和`placeholder`属性也是动态绑定的。
最后,在父组件中定义两个插槽,分别用于渲染最后两三个表单项:
```
<el-form>
<el-form-item v-for="item in formItems" :label="item.label" :prop="item.prop">
<component :is="item.type" v-model="form[item.prop]" :placeholder="item.label"></component>
</el-form-item>
<slot name="extra"></slot>
<slot name="submit"></slot>
</el-form>
```
在使用该组件时,只需要在父组件中定义最后两三个表单项,并通过插槽传递进去即可:
```
<my-form>
// 省略前面的表单项
<el-form-item label="性别" prop="gender">
<el-radio-group v-model="form.gender">
<el-radio label="male">男</el-radio>
<el-radio label="female">女</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="爱好" prop="hobby">
<el-checkbox-group v-model="form.hobby">
<el-checkbox label="reading">阅读</el-checkbox>
<el-checkbox label="music">音乐</el-checkbox>
<el-checkbox label="sport">运动</el-checkbox>
</el-checkbox-group>
</el-form-item>
<template #submit>
<el-button type="primary" @click="handleSubmit">提交</el-button>
</template>
</my-form>
```
通过使用动态组件和插槽,可以将三个表单项的公共部分封装起来,实现代码的复用和简化。
阅读全文