一、使用上的区别
react
React 采用 JSX 语法,这是一种 JavaScript 的语法扩展,允许在 JavaScript 代码中直接编写类似 HTML 的结构。这种设计体现了 React "All in JavaScript" 的哲学理念。
状态管理特点:
- 单向数据流:数据从父组件流向子组件,通过 props 传递
- 不可变数据:状态更新必须通过
setState或状态更新函数,返回全新的状态对象 - 手动触发更新:开发者需要显式调用更新函数来驱动界面变化
代码示例对比:
// React - 不可变更新
const [user, setUser] = useState({ name: 'John', age: 25 });
// 必须创建新对象
setUser(prev => ({ ...prev, age: 26 }));
// 直接修改不会触发更新
user.age = 26; // ❌ 错误的方式
Vue:模板驱动的渐进式框架
Vue 使用基于 HTML 的模板语法,通过 .vue 单文件组件将 模板(Template)、逻辑(Script)、样式(Style) 有机地组织在一起,这种结构对传统前端开发者更加友好。
状态管理特点:
- 响应式数据:基于 ES6 Proxy(Vue 3)或 Object.defineProperty(Vue 2)实现自动依赖追踪
- 可变数据:可以直接修改数据,框架会自动检测变化并更新视图
- 双向数据绑定:通过
v-model指令简化表单处理
代码示例对比:
<template>
<input v-model="user.name">
<button @click="user.age++">增加年龄</button>
</template>
<script setup>
const user = reactive({ name: 'John', age: 25 });
// 直接修改,自动更新
user.age = 26; // ✅ Vue 会自动处理更新
</script>
二、设计思想
React:函数式与组合的思想
React 的设计哲学深受 函数式编程 影响,强调:
- 纯函数组件:相同的 props 输入总是得到相同的 JSX 输出
- 不可变性:避免副作用,使状态变化更可预测
- 组合优于继承:通过组件组合构建复杂界面
- 显式数据流:数据流动路径清晰,便于调试
演进历程:
- 类组件时代:面向对象思维,生命周期方法
- Hook 革命:函数式思维,逻辑复用和能力增强
设计影响:
// React 的函数式思维
const UserList = ({ users, onUserClick }) => (
<div>
{users.map(user => (
<UserCard
key={user.id}
user={user}
onClick={onUserClick}
/>
))}
</div>
);
// 纯函数:相同的 users 和 onUserClick 总是渲染相同结果
Vue:响应式与渐进式的智慧
更深入的解读: Vue 的核心哲学是 渐进式 和 响应式:
- 渐进式采用:可以从简单的页面交互逐步扩展到复杂单页应用
- 响应式系统:数据变化自动驱动视图更新,减少样板代码
- 约定优于配置:提供合理的默认值,降低决策成本
API 演进:
- 选项式 API:按选项组织代码,适合简单场景
- 组合式 API:按功能逻辑组织代码,适合复杂组件
设计影响:
<template>
<!-- 声明式模板:做什么,而不是怎么做 -->
<div :class="{ active: isActive }">
{{ filteredUsers.length }} 用户
</div>
</template>
<script setup>
// 响应式思维:关注数据关系,而不是更新时机
const isActive = ref(false);
const users = ref([]);
const filteredUsers = computed(() =>
users.value.filter(user => user.isActive)
);
</script>