| 维度 | 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单文件组件
<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生态(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优化方案
<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组合式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跨平台方案
使用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的场景:
选择React的场景:
某头部电商平台实战数据:
根据2025年State of JS调研,Vue在中小企业采用率达58%,React在大型企业采用率维持72%的统治地位
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有