【框架演进】Vue与React的跨越性变革:从Vue2到Vue3,从Class到Hooks

目录


前言

深入对比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:渐进式学习

大白话:​​ 就像玩手游,一开始系统送你装备,慢慢教你技能,上手容易
学习路径:​​

  1. 先学模板和指令 (v-if, v-for)
  2. 再学选项式API (data, methods)
  3. 最后学组合式API (ref,
    reactive)

React:概念先行

大白话:​​ 就像玩PC游戏,先要看半小时教程,但一旦学会就能玩出各种花样
学习路径:​​

  1. 先学JSX和组件概念
  2. 再学状态管理和生命周期
  3. 最后学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像乐高积木 - 自由度极高,能搭建任何东西,但需要更多设计

相关推荐
渣哥3 小时前
从 AOP 到代理:Spring 事务注解是如何生效的?
前端·javascript·面试
toobeloong3 小时前
Electron 从低版本升级到高版本 - 开始使用@electron/remote的改造教程
前端·javascript·electron
悠哉摸鱼大王3 小时前
前端获取设备视频流踩坑实录
前端·javascript
铅笔侠_小龙虾3 小时前
深入理解 Vue.js 原理
前端·javascript·vue.js
你的眼睛會笑3 小时前
vue3 使用html2canvas实现网页截图并下载功能 以及问题处理
前端·javascript·vue.js
无光末阳4 小时前
vue 环境下多个定时器的创建与暂停的统一封装
前端·vue.js
Hilaku4 小时前
技术Leader的“第一性原理”:我是如何做技术决策的?
前端·javascript·面试
慧一居士4 小时前
src/App.vue 和 public/index.html 关系和区别
前端·vue.js