根据您的请求,我将提供一个 Vue 3 高阶组件(HOC)的完整详细案例,这个案例将展示如何构建一个可复用的表单组件,以提升代码的复用性与可维护性。
实战案例:构建可复用的表单组件
1. 需求分析
假设我们需要开发一个通用的表单组件,它具备以下功能:
- 支持多种表单项类型(如输入框、下拉框等)。
- 自动表单验证。
- 提交表单时触发回调函数。
2. 设计高阶组件
我们设计一个 withForm
函数,它接收一个配置对象和基础组件,返回一个增强后的表单组件。
import { ref, reactive, provide } from 'vue';
function withForm(config, BaseComponent) {
return {
name: 'EnhancedForm',
components: { BaseComponent },
setup(props, { slots, emit }) {
const formData = reactive({});
const formErrors = reactive({});
// 初始化表单数据
Object.keys(config.fields).forEach((key) => {
formData[key] = config.fields[key].initialValue || '';
});
// 提供表单数据和错误信息
provide('formData', formData);
provide('formErrors', formErrors);
// 表单验证逻辑
const validate = () => {
// 验证逻辑...
return Object.keys(formErrors).length === 0;
};
// 提交表单
const handleSubmit = () => {
if (validate()) {
emit('submit', formData);
}
};
return () => (
<BaseComponent onSubmit={handleSubmit}>
{slots.default()}
</BaseComponent>
);
},
};
}
3. 使用高阶组件
定义一个基础表单组件,并使用 withForm
函数增强它。
<!-- BaseForm.vue -->
<template>
<form @submit.prevent="onSubmit">
<slot></slot>
</form>
</template>
<script>
export default {
name: 'BaseForm',
emits: ['submit'],
setup(props, { emit }) {
const onSubmit = () => {
emit('submit');
};
return { onSubmit };
},
};
</script>
import { h } from 'vue';
import BaseForm from './BaseForm.vue';
const EnhancedForm = withForm(
{
fields: {
username: { initialValue: '' },
password: { initialValue: '' },
},
},
BaseForm
);
export default EnhancedForm;
4. 在页面中使用增强表单组件
<!-- App.vue -->
<template>
<EnhancedForm @submit="handleFormSubmit">
<input type="text" v-model="formData.username" />
<input type="password" v-model="formData.password" />
<button type="submit">提交</button>
</EnhancedForm>
</template>
<script>
import EnhancedForm from './EnhancedForm.vue';
export default {
components: { EnhancedForm },
setup() {
const handleFormSubmit = (data) => {
console.log('表单提交:', data);
};
return { handleFormSubmit };
},
};
</script>
这个案例展示了如何通过 Vue 3 的高阶组件来提升代码的复用性和可维护性。通过 withForm
高阶组件,我们可以轻松地为不同的表单组件添加通用的表单处理逻辑,如数据管理和验证,而无需在每个组件中重复这些逻辑。这样不仅减少了代码的重复,也使得组件更加模块化和易于维护。