目录
- 前言
- 一、Vue的跨越性变革
-
- [Vue2 → Vue3 的变革](#Vue2 → Vue3 的变革)
-
- **`响应式系统重写`**
- [**`Composition API 引入`**](#
Composition API 引入
) - **`性能优化`**
- 二、React的跨越性变革
-
- [1. React 16.8之前 → 之后的变革](#1. React 16.8之前 → 之后的变革)
-
- **`从Class组件到函数组件+Hooks`**
-
- [React 16.8之前 (Class组件)](#React 16.8之前 (Class组件))
- [React 16.8之后 (函数组件+Hooks)](#React 16.8之后 (函数组件+Hooks))
- **`逻辑复用方式变革`**
- 三、Vue和React的对比
-
- [1. 设计理念差异](#1. 设计理念差异)
-
- [**`响应式 vs 不可变`**](#
响应式 vs 不可变
) - [**`模板 vs JSX`**](#
模板 vs JSX
)
- [**`响应式 vs 不可变`**](#
- [2. 学习曲线对比](#2. 学习曲线对比)
- [3. 生态系统对比](#3. 生态系统对比)
- 四、如何选择?
前言
深入对比Vue和React两大框架的重大版本变革,用最直白的语言讲清楚它们之间的区别与联系
📢最终建议:
不要纠结"哪个更好",而要想"哪个更适合"
想快速交付选Vue
想灵活架构选React
两个都学,技多不压身
提示:以下是本篇文章正文内容,下面案例可供参考
一、Vue的跨越性变革
Vue2 → Vue3 的变革
响应式系统重写
大白话: Vue2像是个热心过度的管家,什么都帮你盯着;Vue3像是个更聪明的管家,只盯真正需要的东西
Vue2 (Object.defineProperty)
javascript
// Vue2 的响应式原理
data() {
return {
message: 'Hello' // Vue会递归遍历所有属性,全部变成响应式
}
}
Vue3 (Proxy)
javascript
// Vue3 的响应式原理
const state = reactive({
message: 'Hello' // 只有真正被用到的属性才会被代理,性能更好
})
Composition API 引入
大白话: Vue2是按功能把代码分开写(选项式),Vue3是按功能把代码放一起写(组合式)
Vue2 (选项式API)
javascript
export default {
data() {
return { count: 0 }
},
methods: {
increment() {
this.count++
}
},
mounted() {
console.log('组件挂载了')
}
}
Vue3 (组合式API)
javascript
import { ref, onMounted } from 'vue'
export default {
setup() {
const count = ref(0)
const increment = () => {
count.value++
}
onMounted(() => {
console.log('组件挂载了')
})
return { count, increment }
}
}
性能优化
大白话: Vue3打包体积小了40%,渲染快了55%,更新快了133%
javascript
// Vue3的Tree-shaking:只打包你用到的功能
import { ref, computed } from 'vue' // 没用到的不打包
二、React的跨越性变革
1. React 16.8之前 → 之后的变革
从Class组件到函数组件+Hooks
React 16.8之前 (Class组件)
javascript
class Counter extends React.Component {
constructor(props) {
super(props)
this.state = { count: 0 }
this.increment = this.increment.bind(this)
}
increment() {
this.setState({ count: this.state.count + 1 })
}
componentDidMount() {
console.log('组件挂载了')
}
render() {
return (
<div>
<p>{this.state.count}</p>
<button onClick={this.increment}>+1</button>
</div>
)
}
}
React 16.8之后 (函数组件+Hooks)
javascript
import { useState, useEffect } from 'react'
function Counter() {
const [count, setCount] = useState(0)
const increment = () => {
setCount(count + 1)
}
useEffect(() => {
console.log('组件挂载了')
}, [])
return (
<div>
<p>{count}</p>
<button onClick={increment}>+1</button>
</div>
)
}
逻辑复用方式变革
大白话: 以前复用逻辑要靠"套娃"(HOC/Render Props),现在直接"抽出来用"(自定义Hook)
之前 (高阶组件HOC)
javascript
// 定义一个高阶组件
const withLogger = (WrappedComponent) => {
return class extends React.Component {
componentDidMount() {
console.log('组件挂载了')
}
render() {
return <WrappedComponent {...this.props} />
}
}
}
// 使用高阶组件
const EnhancedComponent = withLogger(MyComponent)
之后 (自定义Hook)
javascript
// 定义一个自定义Hook
function useLogger() {
useEffect(() => {
console.log('组件挂载了')
}, [])
}
// 使用自定义Hook
function MyComponent() {
useLogger()
// ...其他逻辑
}
三、Vue和React的对比
1. 设计理念差异
响应式 vs 不可变
大白话: Vue是"自动挡" - 数据变了UI自动更新;React是"手动挡" - 需要你手动setState告诉它要更新
Vue (自动响应式)
javascript
const count = ref(0)
count.value++ // UI自动更新!
React (不可变更新)
javascript
const [count, setCount] = useState(0)
setCount(count + 1) // 必须手动调用setCount
模板 vs JSX
大白话: Vue像写HTML加了点魔法(指令),React像在JS里写HTML(JSX)
Vue (模板语法)
javascript
<template>
<button @click="increment">{{ count }}</button>
</template>
React (JSX)
javascript
<button onClick={increment}>{count}</button>
2. 学习曲线对比
Vue:渐进式学习
大白话: 就像玩手游,一开始系统送你装备,慢慢教你技能,上手容易
学习路径:
- 先学模板和指令 (v-if, v-for)
- 再学选项式API (data, methods)
- 最后学组合式API (ref,
reactive)
React:概念先行
大白话: 就像玩PC游戏,先要看半小时教程,但一旦学会就能玩出各种花样
学习路径:
- 先学JSX和组件概念
- 再学状态管理和生命周期
- 最后学Hooks和高级模式
3. 生态系统对比
状态管理
大白话: Vue有"官方指定"的Pinia,React有"社区公认"的Redux
Vue (Pinia)
javascript
// store/counter.js
export const useCounterStore = defineStore('counter', {
state: () => ({ count: 0 }),
actions: {
increment() {
this.count++
}
}
})
React (Redux Toolkit)
javascript
// features/counterSlice.js
export const counterSlice = createSlice({
name: 'counter',
initialState: 0,
reducers: {
increment: state => state + 1
}
})
路由解决方案
大白话: Vue有"亲儿子"Vue Router,React有"干儿子"React Router
Vue (Vue Router)
javascript
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
]
React (React Router)
javascript
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
四、如何选择?
根据项目需求选择
选择Vue的情况
✅ 需要快速上手和开发
✅ 团队前端经验较少
✅ 需要更细致的官方文档指导
✅ 喜欢"开箱即用"的体验
选择React的情况
✅ 项目复杂度高,需要灵活架构
✅ 团队有较强JavaScript基础
✅ 需要更大规模的生态系统
✅ 喜欢"一切皆JavaScript"的哲学
根据团队情况选择
小团队/初创项目
大白话: Vue像宜家家具 - 组装简单,说明书详细,马上能用
大团队/复杂项目
大白话: React像乐高积木 - 自由度极高,能搭建任何东西,但需要更多设计