从 React 过渡到 Vue 3:开发者的实践指南
ztj100 2025-06-12 19:08 35 浏览 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 都是一个值得考虑的选择。希望这篇文章能帮助你顺利过渡!
相关推荐
- 其实TensorFlow真的很水无非就这30篇熬夜练
-
好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...
- 交叉验证和超参数调整:如何优化你的机器学习模型
-
准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...
- 机器学习交叉验证全指南:原理、类型与实战技巧
-
机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...
- 深度学习中的类别激活热图可视化
-
作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...
- 超强,必会的机器学习评估指标
-
大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...
- 机器学习入门教程-第六课:监督学习与非监督学习
-
1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...
- Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置
-
你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...
- 神经网络与传统统计方法的简单对比
-
传统的统计方法如...
- 自回归滞后模型进行多变量时间序列预测
-
下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...
- 苹果AI策略:慢哲学——科技行业的“长期主义”试金石
-
苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...
- 时间序列预测全攻略,6大模型代码实操
-
如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)