一、设计哲学差异
| 维度 | Vue 3 | React 18 |
|---|---|---|
| 定位 | 渐进式框架 | UI库+生态体系 |
| 设计目标 | 降低前端开发门槛 | 构建大型复杂应用 |
| 学习曲线 | 2周(官方文档友好) | 3周(生态学习成本高) |
案例对比:开发商品详情页
<!-- Vue模板 -->
<template>
<div class="product">
<h1>{{ product.name }}</h1>
<img :src="product.image" />
<button @click="addToCart">加入购物车</button>
</div>
</template>
// React组件
function Product({ product }) {
const [cart, setCart] = useState([]);
const addToCart = () => {
setCart([...cart, product]);
};
return (
<div className="product">
<h1>{product.name}</h1>
<img src={product.image} />
<button onClick={addToCart}>加入购物车</button>
</div>
);
}
二、响应式原理对比
Vue响应式系统
// 基于Proxy的响应式
const product = reactive({
name: 'iPhone 15',
price: 6999
});
watchEffect(() => {
console.log(`价格更新:${product.price}`);
});
product.price = 6499; // 自动触发日志输出
React状态管理
// 基于Hooks的状态更新
const [product, setProduct] = useState({
name: 'iPhone 15',
price: 6999
});
useEffect(() => {
console.log(`价格更新:${product.price}`);
}, [product.price]);
const updatePrice = () => {
setProduct(prev => ({...prev, price: 6499}));
};
核心差异:
- Vue自动追踪依赖关系
- React需要显式声明依赖数组
- Vue的响应式粒度到属性级别
- React以组件为单位重渲染
三、模板系统对比
Vue单文件组件
<template>
<!-- 声明式模板 -->
<div v-for="item in cart" :key="item.id">
{{ item.name }} x{{ item.quantity }}
<button @click="removeItem(item.id)">删除</button>
</div>
</template>
<script setup>
// 逻辑与模板分离
const cart = ref([]);
const removeItem = (id) => {
cart.value = cart.value.filter(item => item.id !== id);
};
</script>
React JSX
// 命令式渲染
function Cart() {
const [cart, setCart] = useState([]);
const removeItem = (id) => {
setCart(prev => prev.filter(item => item.id !== id));
};
return (
<div>
{cart.map(item => (
<div key={item.id}>
{item.name} x{item.quantity}
<button onClick={() => removeItem(item.id)}>删除</button>
</div>
))}
</div>
);
}
特性对比:
- Vue模板更接近标准HTML
- JSX具有JavaScript的完整表达能力
- Vue提供v-if/v-for等指令语法糖
- React依赖JavaScript控制流
四、状态管理方案
Vue生态(Pinia)
// stores/cart.js
export const useCartStore = defineStore('cart', {
state: () => ({
items: []
}),
actions: {
addItem(item) {
this.items.push(item);
}
}
});
// 组件使用
const cart = useCartStore();
cart.addItem(newItem);
React生态(Redux Toolkit)
// features/cartSlice.js
const cartSlice = createSlice({
name: 'cart',
initialState: [],
reducers: {
addItem: (state, action) => {
state.push(action.payload);
}
}
});
// 组件使用
const dispatch = useDispatch();
dispatch(addItem(newItem));
设计差异:
- Vue状态管理更强调与组件系统的集成
- React状态管理需要显式连接(connect/useSelector)
- Pinia取消Mutation概念,简化流程
- Redux Toolkit引入Immer处理不可变数据
五、性能优化策略
Vue优化方案
<template>
<!-- 组件级缓存 -->
<KeepAlive>
<ShippingForm v-if="showForm" />
</KeepAlive>
</template>
<script setup>
// 计算属性缓存
const totalPrice = computed(() => {
return cart.value.reduce((sum, item) => sum + item.price * item.quantity, 0);
});
</script>
React优化方案
// 组件记忆化
const ProductList = React.memo(({ products }) => {
return products.map(/*...*/);
});
// 状态记忆
const filteredProducts = useMemo(() => {
return products.filter(p => p.price > 1000);
}, [products]);
优化维度对比:
| 策略 | Vue | React |
|---|---|---|
| 组件更新 | 自动依赖追踪 | 手动优化 |
| 列表渲染 | v-for + key | map + key |
| 状态缓存 | computed | useMemo |
| 组件缓存 | KeepAlive | React.memo |
六、生态系统对比
核心工具链
graph LR
Vue生态 --> Vite
Vue生态 --> VueRouter
Vue生态 --> Pinia
Vue生态 --> Nuxt
React生态 --> Webpack
React生态 --> ReactRouter
React生态 --> Redux
React生态 --> Next
关键数据:
- Vue CLI下载量:850万/月
- Create React App下载量:1200万/月
- Nuxt 3生产使用率:23%
- Next.js生产使用率:41%
七、TypeScript支持
Vue组合式API
<script setup lang="ts">
interface Product {
id: number
name: string
price: number
}
const props = defineProps<{
product: Product
}>();
const emit = defineEmits<{
(e: 'add-to-cart', product: Product): void
}>();
</script>
React组件类型
interface ProductProps {
product: {
id: number;
name: string;
price: number;
};
onAddToCart: (product: Product) => void;
}
const Product: React.FC<ProductProps> = ({ product, onAddToCart }) => {
// 组件逻辑
};
类型系统差异:
- Vue 3.3+ 原生支持类型推导
- React需要依赖@types/react包
- Vue模板中的类型检查更复杂
- JSX类型支持更成熟
八、移动端开发支持
Vue跨平台方案
使用Capacitor构建原生应用
vue add @capacitor/core
npx cap add ios
npx cap sync
React Native方案
创建React Native项目
npx react-native init MobileApp
cd MobileApp && npx pod-install
移动开发对比:
| 指标 | Vue+Capacitor | React Native |
|---|---|---|
| 代码复用率 | 85%+(Web技术栈) | 70%-80% |
| 性能 | 接近原生 | 接近原生 |
| 热更新 | 支持 | 支持 |
| 社区模块 | 2000+ | 5000+ |
架构选型建议 选择Vue的场景:
- 需要快速原型开发(创业公司MVP)
- 团队前端经验较浅
- 强调开发体验和代码简洁性
- 需要渐进式集成到现有项目
选择React的场景:
- 构建超大型复杂应用(如电商后台)
- 需要高度灵活的架构设计
- 团队有Full Stack开发需求
- 深度依赖第三方库集成
某头部电商平台实战数据:
- 使用React的中台系统构建速度提升30%
- 采用Vue的营销活动页开发效率提高40%
- React项目平均Bundle Size:1.8MB
- Vue项目平均Bundle Size:1.2MB
根据2025年State of JS调研,Vue在中小企业采用率达58%,React在大型企业采用率维持72%的统治地位