从 React 过渡到 Vue 3:开发者的实践指南
ztj100 2025-06-12 19:08 9 浏览 0 评论
在前端开发领域,React 和 Vue 是两个非常受欢迎的框架。如果你已经熟悉 React 的开发模式,但想要尝试 Vue 3,这篇文章将帮助你快速上手,并通过代码示例展示两者的异同。
目录
简介
- 核心概念对比
- 项目结构对比
- 组件定义方式
- 状态管理
- 生命周期钩子
- 事件处理
- 条件渲染与列表渲染
总结
React 是一个由 Facebook 维护的 JavaScript 库,而 Vue 是一个渐进式 JavaScript 框架,由尤雨溪创建。Vue 3 引入了 Composition API,这使得它在语法和架构设计上更接近 React Hooks 的风格,降低了从 React 切换到 Vue 的学习成本。
核心概念对比
概念 | React | Vue3 |
构建用户界面 | 函数组件 + JSX | 单文件组件(SFC)+ 模板语法 |
状态管理 | useState、useReducer、Redux/MobX | reactive、ref、Pinia/Vuex |
生命周期控制 | useEffect、useLayoutEffect | onMounted、onUpdated、onUnmounted |
组件通信 | Props、Context、自定义 Hook | Props、Emits、Provide/Inject |
项目结构对比
React 项目结构
Bash
my-react-app/
├── public/
├── src/
│ ├── components/
│ ├── App.js
│ └── index.js
├── package.json
Vue 3 项目结构(使用 Vite 创建)
Bash
my-vue-app/
├── public/
├── src/
│ ├── components/
│ ├── App.vue
│ └── main.js
├── package.json
组件定义方式
React 函数组件示例
Jsx
// ReactCounter.jsx
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
export default Counter;
Vue 3 Composition API 组件示例
Vue
<!-- VueCounter.vue -->
<template>
<div>
<p>Count: {{ count }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script setup>
import { ref } from 'vue';
const count = ref(0);
function increment() {
count.value++;
}
</script>
状态管理
React 中使用 Context API
Jsx
// ThemeContext.js
import React, { createContext, useState } from 'react';
export const ThemeContext = createContext();
export function ThemeProvider({ children }) {
const [darkMode, setDarkMode] = useState(false);
return (
<ThemeContext.Provider value={{ darkMode, setDarkMode }}>
{children}
</ThemeContext.Provider>
);
}
Jsx
// 使用 Context
import { useContext } from 'react';
import { ThemeContext } from './ThemeContext';
function ToggleTheme() {
const { darkMode, setDarkMode } = useContext(ThemeContext);
return (
<button onClick={() => setDarkMode(!darkMode)}>
{darkMode ? 'Light Mode' : 'Dark Mode'}
</button>
);
}
Vue 3 中使用 Provide / Inject
Vue
<!-- App.vue -->
<script setup>
import { provide, ref } from 'vue';
import ToggleTheme from './components/ToggleTheme.vue';
const darkMode = ref(false);
provide('theme', {
darkMode,
toggle: () => (darkMode.value = !darkMode.value),
});
</script>
<template>
<ToggleTheme />
</template>
Vue
<!-- ToggleTheme.vue -->
<script setup>
import { inject } from 'vue';
const theme = inject('theme');
</script>
<template>
<button @click="theme.toggle">
{{ theme.darkMode ? 'Light Mode' : 'Dark Mode' }}
</button>
</template>
生命周期钩子
React 中的 useEffect
Jsx
import React, { useEffect, useState } from 'react';
function LifecycleExample() {
const [data, setData] = useState(null);
useEffect(() => {
// ComponentDidMount & ComponentDidUpdate
fetchData();
return () => {
// componentWillUnmount
console.log('Cleanup');
};
}, []);
async function fetchData() {
const res = await fetch('https://api.example.com/data');
const json = await res.json();
setData(json);
}
return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>;
}
Vue 3 中的生命周期钩子
Vue
<script setup>
import { onMounted, onUpdated, onUnmounted, ref } from 'vue';
const data = ref(null);
onMounted(async () => {
const res = await fetch('https://api.example.com/data');
const json = await res.json();
data.value = json;
});
onUnmounted(() => {
console.log('Cleanup');
});
</script>
<template>
<div>{{ data ? JSON.stringify(data) : 'Loading...' }}</div>
</template>
事件处理
React 事件绑定
Jsx
function Button({ onClick }) {
return <button onClick={onClick}>Click Me</button>;
}
Vue 3 自定义事件
Vue
<!-- MyButton.vue -->
<template>
<button @click="$emit('click')">Click Me</button>
</template>
<script setup>
defineEmits(['click']);
</script>
使用组件:
Vue
<MyButton @click="handleClick" />
条件渲染与列表渲染
React 条件渲染与 map
Jsx
function List({ items }) {
return (
<ul>
{items.length > 0 ? (
items.map(item => <li key={item.id}>{item.name}</li>)
) : (
<li>No items found</li>
)}
</ul>
);
}
Vue 3 v-if 与 v-for
Vue
<template>
<ul>
<li v-if="items.length === 0">No items found</li>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</template>
<script setup>
const items = [];
</script>
总结
从 React 转向 Vue 3 并不困难,尤其是当你熟悉 React Hooks 后,Vue 3 的 Composition API 提供了非常相似的开发体验。两者都支持响应式数据、组件化开发、生命周期控制和高效的状态管理。
关键点回顾:
Vue 3 的 Composition API 风格与 React Hooks 类似。
Vue 的单文件组件(SFC)结构清晰,适合大型项目。
Vue 的模板语法简化了 DOM 操作,React 更加灵活但也需要更多手动操作。
Vue 的响应式系统是自动追踪依赖的,React 依赖于 useState 和 setState。
无论你是想尝试新框架,还是团队需要多技术栈支持,Vue 3 都是一个值得考虑的选择。希望这篇文章能帮助你顺利过渡!
相关推荐
- 再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)
-
在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...
- python创建分类器小结(pytorch分类数据集创建)
-
简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...
- matplotlib——绘制散点图(matplotlib散点图颜色和图例)
-
绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...
- python实现实时绘制数据(python如何绘制)
-
方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...
- 简单学Python——matplotlib库3——绘制散点图
-
前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...
- 数据分析-相关性分析可视化(相关性分析数据处理)
-
前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...
- 免费Python机器学习课程一:线性回归算法
-
学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...
- 用Python进行机器学习(2)之逻辑回归
-
前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...
- 【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂
-
一、拟合和回归的区别拟合...
- 推荐2个十分好用的pandas数据探索分析神器
-
作者:俊欣来源:关于数据分析与可视化...
- 向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- 用Python进行机器学习(11)-主成分分析PCA
-
我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...
- 神经网络基础深度解析:从感知机到反向传播
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- Python实现基于机器学习的RFM模型
-
CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)