← 返回文档中心

React vs Vue 互动对比

同一个问题,两种解法 —— 但最终效果一样

1. 它们在解决什么问题?

传统方式(jQuery)vs 现代方式(React / Vue)

jQuery 时代的做法

2006
// 你的 tp-link.com/us 现在就是这样工作的

// 1. HTML 写好结构
<span id="price">$149.99</span>
<span id="qty">1</span>
<span id="total">$149.99</span>

// 2. JS 手动找到元素,手动改
$("#plus-btn").click(function() {
  qty = qty + 1;
  $("#qty").text(qty); // 手动改数量
  $("#total").text(qty * price); // 手动改总价
  if (qty > 10) {
    $("#warning").show(); // 手动显示提示
  }
});
问题
每改一个数据,要手动找到页面上所有相关的元素逐个更新。
页面越复杂,要手动同步的地方越多,越容易漏,越容易出 bug。

React / Vue 的做法

2013+
// 你只管改数据,页面自动更新

// 1. 声明数据
const qty = 1
const price = 149.99

// 2. 描述"数据怎么展示"
<span>{qty}</span>
<span>{qty * price}</span>
{qty > 10 && <Warning/>}

// 3. 改数据就行,页面自己更新
setQty(qty + 1) // 就这一行
// → 数量自动变
// → 总价自动算
// → 提示自动出现
核心差异
你只描述"数据和界面的关系",框架自动保持同步。
数据变 → 界面自动变。不用手动找元素、手动改。
一句话总结
jQuery:你是导演,每个演员的每个动作你都要喊。
React / Vue:你是编剧,写好剧本(数据↔界面的关系),演员自己演。

2. 同一个组件,两种写法

一个 TP-Link 产品卡片,分别用 React 和 Vue 写

React 写法

JSX 语法
function ProductCard({ name, price }) {
  // 声明状态
  const [qty, setQty] = useState(1)

  // 返回界面描述
  return (
    <div>
      <h3>{name}</h3>
      <p>${price}</p>
      <button onClick={() => setQty(qty - 1)}>-</button>
      <span>{qty}</span>
      <button onClick={() => setQty(qty + 1)}>+</button>
    </div>
  )
}

特点:HTML 写在 JS 里面(叫 JSX)。一切都是 JavaScript。

Vue 写法

SFC 语法
<!-- 结构 -->
<template>
  <div>
    <h3>{{ name }}</h3>
    <p>${{ price }}</p>
    <button @click="qty--">-</button>
    <span>{{ qty }}</span>
    <button @click="qty++">+</button>
  </div>
</template>

<!-- 逻辑 -->
<script setup>
const qty = ref(1)
</script>

特点:HTML、JS、CSS 分区写在一个文件里。更像传统网页结构。

对 PM 来说的区别
几乎没有。两种写法产出的页面效果完全一样,用户感知不到区别。
差异只在工程师的开发体验和团队技术栈偏好。选了 Next.js = 选了 React,不用再纠结这个。

3. "数据变 → 界面变" 是怎么做到的?

React 和 Vue 用不同的机制实现相同的效果

React:你喊一声"我变了"

调用 setState React 知道了 对比新旧界面 只更新变化的部分
// 你必须用 setQty 来改值
setQty(qty + 1) // ✅ React 知道了,会更新界面

qty = qty + 1 // ❌ React 不知道,界面不会变!

类比:你要按门铃(setState),React 才知道来开门。

Vue:它自己盯着你

直接改数据 Vue 自动感知 精确定位依赖 只更新用到这个数据的地方
// 直接改就行
qty.value++ // ✅ Vue 自动感知,界面自动更新

// Vue 在你定义 ref() 的时候
// 就已经在这个变量上装了"监控探头"

类比:家里装了智能摄像头,有人来了自动开门,不用按门铃。

4. 亲手试一下

同一个计数器,模拟 React 和 Vue 的工作方式

互动演示:计数器

点击按钮,观察两边的状态更新和渲染日志的差异

React useState + 重新渲染

界面
0
state = { count: 0 }
[初始化] 组件首次渲染 (render #1)

Vue ref + 精确更新

界面
0
count = ref(0)
[初始化] 组件挂载,count 收集依赖
观察日志的区别
React 每次改数据 → 整个组件函数重新执行(re-render)→ 对比差异 → 更新 DOM
Vue 每次改数据 → 只触发依赖这个数据的 DOM 节点更新

结果一样,但路径不同。实际性能差异在大多数场景下可以忽略不计。

5. 真实场景:购物车组件

展示组件如何组合,数据如何在组件间流动

互动购物车

改数量看总价自动变

组件树结构

数据从上往下流
<CartPage> ← 拥有所有数据(状态)
├── <CartItem name="Deco X50" qty=1/>
├── <CartItem name="Archer AXE75" qty=1/>
├── <CartItem name="Tapo C200" qty=1/>
└── <CartTotal total=$0/>
组件通信
数据从 父组件(CartPage) 通过 props 传给 子组件(CartItem)
子组件要改数据,通过回调函数通知父组件。
单向数据流:数据永远从上往下流,React 和 Vue 都是这个原则。
CartPage.state =
  { items: [
    { name: "Deco X50", qty: 1, price: 149.99 },
    { name: "Archer AXE75", qty: 1, price: 189.99 },
    { name: "Tapo C200", qty: 1, price: 29.99 }
  ] }

6. 选型对比总结

对于 TP-Link 项目,这个决策已经做了(Next.js = React),但理解差异有助于和团队沟通

维度 React Vue
诞生 2013 · Facebook 2014 · 尤雨溪(个人)
定位 UI 库(只管界面渲染) 渐进式框架(可大可小)
写法风格 JS 为中心(HTML 写在 JS 里) HTML 为中心(JS 写在 HTML 旁边)
状态更新 显式调用 setState 自动追踪依赖
全栈框架 Next.js(Vercel) Nuxt(社区)
生态规模 最大,npm 包最多 大,中文社区尤其活跃
大厂使用 Meta、Netflix、Airbnb、Shopify 阿里、小米、GitLab、Apple(部分)
学习曲线 中等(JSX 需要适应) 较低(更接近传统 HTML)
Shopify 支持 官方 Hydrogen 框架(基于 React) 社区方案,非官方
招聘市场(美国) 岗位最多 较少
对 TP-Link 项目的意义
React(Next.js)是正确选择,原因:
1. Shopify Hydrogen 官方基于 React,Headless 集成最顺畅
2. 美国市场 React 人才最多,招聘和外包都容易
3. Next.js 是目前 SSG/ISR 最成熟的方案,适合产品展示 + 电商的混合场景
4. Vercel 部署生态完善,CDN + 边缘计算一站搞定
React vs Vue 互动对比 · 为 TP-Link DTC 项目定制