Vue3组合式函数深度实战:构建高复用业务逻辑库
一、设计优势
组合式函数使业务逻辑复用率提升300%,代码量减少50%
二、核心实现
1. 基础计数器Hook
// useCounter.js
import { ref } from 'vue';
export function useCounter(initialValue = 0) {
const count = ref(initialValue);
const increment = () => count.value++;
const decrement = () => count.value--;
const reset = () => count.value = initialValue;
return {
count,
increment,
decrement,
reset
};
}
// 组件中使用
import { useCounter } from './useCounter';
export default {
setup() {
const counter = useCounter(10);
return { counter };
}
}
2. 异步状态管理Hook
// useAsync.js
import { ref } from 'vue';
export function useAsync(asyncFunction) {
const data = ref(null);
const error = ref(null);
const loading = ref(false);
const execute = async (...args) => {
loading.value = true;
try {
data.value = await asyncFunction(...args);
error.value = null;
} catch (err) {
error.value = err;
} finally {
loading.value = false;
}
};
return { data, error, loading, execute };
}
// 使用示例
const { data, execute, loading } = useAsync(fetchUserList);
三、高级应用
1. 表单验证Hook
// useFormValidation.js
import { reactive, computed } from 'vue';
export function useFormValidation(rules) {
const form = reactive({});
const errors = reactive({});
const validate = () => {
let isValid = true;
Object.keys(rules).forEach(key => {
const rule = rules[key];
const value = form[key];
if (rule.required && !value) {
errors[key] = rule.message || '必填字段';
isValid = false;
}
if (rule.pattern && !rule.pattern.test(value)) {
errors[key] = rule.message || '格式不正确';
isValid = false;
}
});
return isValid;
};
return { form, errors, validate };
}
// 使用示例
const { form, errors, validate } = useFormValidation({
username: { required: true },
email: { pattern: /^[^s@]+@[^s@]+.[^s@]+$/ }
});
2. 组合Hook实现复杂逻辑
// 组合多个Hook
export default {
setup() {
const counter = useCounter();
const { data: posts, execute: fetchPosts } = useAsync(fetchPostList);
const { form, validate } = useFormValidation({
title: { required: true }
});
const submit = async () => {
if (validate()) {
await fetchPosts({ page: counter.count });
}
};
return { counter, posts, form, submit };
}
}
四、完整案例
用户搜索系统
- {{ user.name }}
// useUserSearch.js
import { useAsync, useFormValidation } from './hooks';
export function useUserSearch() {
const { form, validate } = useFormValidation({
keyword: { required: true }
});
const {
data: searchData,
error: searchError,
loading: searchLoading,
execute: executeSearch
} = useAsync(searchUsers);
const search = async () => {
if (validate()) {
await executeSearch(form.keyword);
}
};
return {
searchForm: form,
searchData,
searchError,
searchLoading,
search
};
}
const { createApp, ref } = Vue;
function useCounter(initialValue = 0) {
const count = ref(initialValue);
const increment = () => count.value++;
const decrement = () => count.value–;
return { count, increment, decrement };
}
createApp({
setup() {
const counter = useCounter();
return { counter };
}
}).mount(‘#app’);