你是否见过这样的代码?组件间状态乱飞、副作用神出鬼没、单元测试如走钢丝……函数式编程就像代码界的“断舍离大师”,教你用纯函数、不可变数据和高阶魔法,让Vue代码变得干净、稳定且充满艺术感!
本文不仅会揭秘函数式编程的核心心法,还会手把手教你:
✅ 如何用Composition API实现函数式优雅
✅ 高阶函数与柯里化的实战妙用
✅ Vue 3函数式组件性能优化秘籍
✅ 配套工具链与设计模式大全
定义:输入相同,输出永远相同,且无副作用(就像榨汁机,放苹果必出苹果汁)。
反面教材:
let count = 0;
const impureAdd = (a, b) => {
count++; // 偷偷修改外部变量!
return a + b;
};
纯函数示范:
const pureAdd = (a, b) => a + b;
Vue中的典型应用:
computed
属性核心理念:数据一旦创建永不修改,只能生成新版本。
Vue实现方案:
import { reactive, readonly } from "vue";
const origin = reactive({ score: 90 });
// 生成只读副本,修改会触发警告!
const protectedCopy = readonly(origin);
定义:可接收函数为参数,或返回函数的函数。
Vue场景:
map
/filter
处理列表// 高阶Hook示例:计数器工厂
function useCounter(initialValue) {
const count = ref(initialValue);
const increment = () => count.value++;
return { count, increment };
}
典型场景:过滤列表、数据格式化
优势:
步骤:
// useFetch.js
import { ref } from "vue";
export default function useFetch(url) {
const data = ref(null);
const fetchData = async () => {
data.value = await fetch(url).then(res => res.json());
};
return { data, fetchData };
}
组件调用:
Vue 3新写法(告别):
import { h } from "vue";
const FunctionalBanner = (props, { slots }) => {
return h("div", { class: "banner" }, [
h("h1", props.title),
h("p", props.content),
slots.default?.()
]);
};
性能优势:
基础示例:
// 普通函数
const multiply = (a, b) => a * b;
// 柯里化版本
const curriedMultiply = a => b => a * b;
const double = curriedMultiply(2);
double(3); // 6
Vue事件处理妙用:
Vue解决方案:watchEffect
+ 清理机制
import { watchEffect } from "vue";
// 自动追踪依赖
const stop = watchEffect((onCleanup) => {
const timer = setInterval(() => {
console.log("心跳检测");
}, 1000);
// 组件卸载时自动清理
onCleanup(() => clearInterval(timer));
});
错误示范:
const obj = reactive({ a: { b: 1 } });
obj.a.b = 2; // 原数据被污染!
正确姿势:
const newObj = reactive({
...obj,
a: { ...obj.a, b: 2 }
});
import { pipe, map, filter } from "lodash/fp";
const processData = pipe(
filter(n => n > 10),
map(n => n * 2)
);
processData([5, 20, 30]); // [40, 60]
工具库 | 核心能力 | 典型场景 |
---|---|---|
VueUse | useDebounceFn 防抖 |
搜索框输入联想 |
Immer | 不可变数据便捷操作 | 复杂状态更新 |
RxJS | 事件流编程 | WebSocket/拖拽交互 |
Ramda | 函数式工具大全 | 数据转换管道 |
// 看似纯函数,实则访问了外部变量!
const getTime = () => new Date().getTime();
const arr = reactive([1, 2]);
arr.push(3); // 修改了原数组!
维度 | 函数式 | 面向对象 |
---|---|---|
数据管理 | 不可变数据 | 可变状态 |
核心要素 | 纯函数+高阶组合 | 类+继承 |
适用场景 | 数据流处理、高并发 | 复杂业务模型 |
函数式编程不是银弹,但当你在Vue中:
computed
替代模板内计算你会发现,代码逐渐变得像乐高积木——模块清晰、组合自由、维护轻松。
行动号召:
今天起,尝试将一个组件改造成函数式风格。遇到问题时,记住三个锦囊:
期待在评论区看到你的函数式编程实践故事!
资源附录