百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

从 React 过渡到 Vue 3:开发者的实践指南

ztj100 2025-06-12 19:08 9 浏览 0 评论

在前端开发领域,React 和 Vue 是两个非常受欢迎的框架。如果你已经熟悉 React 的开发模式,但想要尝试 Vue 3,这篇文章将帮助你快速上手,并通过代码示例展示两者的异同。

目录

简介

  1. 核心概念对比
  2. 项目结构对比
  3. 组件定义方式
  4. 状态管理
  5. 生命周期钩子
  6. 事件处理
  7. 条件渲染与列表渲染

总结

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编程:如何使用python代码绘制出哪些常见的机器学习图像?

专栏推荐...

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Ⅰ持证人岗位:数据分析师行业:大数据...

取消回复欢迎 发表评论: