vue封装一个通用的表单组件
时间: 2023-11-02 22:05:22 浏览: 149
vue3 封装一个全局通用弹窗提示组件(利用js调用 类似于element)
5星 · 资源好评率100%
好的,下面是一个简单的示例。这个组件可以根据传入的属性动态生成表单项,支持表单验证,并且可以自定义表单项的样式。
```vue
<template>
<form>
<div v-for="(field, index) in fields" :key="index">
<label :for="field.name">{{ field.label }}</label>
<input
:type="field.type"
:name="field.name"
:placeholder="field.placeholder"
:value="formData[field.name]"
@input="updateFormData(field.name, $event.target.value)"
:class="{ 'is-invalid': errors[field.name] }"
/>
<div class="invalid-feedback">{{ errors[field.name] }}</div>
</div>
</form>
</template>
<script>
export default {
props: {
fields: {
type: Array,
required: true,
},
submitText: {
type: String,
default: 'Submit',
},
},
data() {
return {
formData: {},
errors: {},
};
},
methods: {
updateFormData(field, value) {
this.formData[field] = value;
},
validateForm() {
let isValid = true;
this.errors = {};
// 验证每个表单项是否有值
this.fields.forEach((field) => {
if (!this.formData[field.name]) {
this.errors[field.name] = `${field.label} is required`;
isValid = false;
}
});
return isValid;
},
submitForm() {
if (this.validateForm()) {
// 提交表单
console.log(this.formData);
}
},
},
};
</script>
<style>
.is-invalid {
border-color: red;
}
.invalid-feedback {
color: red;
}
</style>
```
在父组件中使用这个通用表单组件,只需要传入一个包含表单项的数组和一个提交按钮的文本即可:
```vue
<template>
<div>
<my-form :fields="fields" :submit-text="submitText" />
</div>
</template>
<script>
import MyForm from '@/components/MyForm.vue';
export default {
components: {
MyForm,
},
data() {
return {
fields: [
{
name: 'name',
label: 'Name',
type: 'text',
placeholder: 'Enter your name',
},
{
name: 'email',
label: 'Email',
type: 'email',
placeholder: 'Enter your email',
},
{
name: 'password',
label: 'Password',
type: 'password',
placeholder: 'Enter your password',
},
],
submitText: 'Create Account',
};
},
};
</script>
```
这样就可以在父组件中动态定义表单项,并且实现表单验证和提交。当然,这只是一个简单的示例,你可以根据实际需求进行修改和扩展。
阅读全文