1. Vue 和 React 的核心差异是什么?
- 设计哲学:
- Vue:渐进式框架,强调开箱即用(路由、状态管理集成度高),上手简单。
- React:库而非框架,更专注于 UI 层,依赖社区生态(如 Redux、React Router)。
- 响应式系统:
- Vue:基于依赖追踪的自动响应式(Proxy/Object.defineProperty),数据变化自动触发更新。
- React:手动触发更新(
setState
/useState
),依赖不可变数据和虚拟 DOM Diff。
- 模板 vs JSX:
- Vue:推荐模板语法(HTML 扩展),内置指令(如
v-if
、v-for
)。 - React:JSX(JavaScript 语法扩展),逻辑与 UI 混合编写。
- Vue:推荐模板语法(HTML 扩展),内置指令(如
- API 风格:
- Vue:Options API(Vue 2)与 Composition API(Vue 3)并存。
- React:函数组件 + Hooks(无历史包袱,统一逻辑复用方式)。
2. 什么是双向数据绑定?Vue 如何实现?
- 定义:数据变化自动同步到视图,视图输入变化自动更新数据(即
v-model
)。 - 实现原理:
- 语法糖:
v-model
等价于:value
+@input
的组合。 - 底层机制:
- 表单元素:通过监听
input
事件更新数据(如<input>
)。 - 自定义组件:通过
modelValue
属性和update:modelValue
事件实现。
- 表单元素:通过监听
- 语法糖:
- 示例:
<input v-model="message"> <!-- 等价于 --> <input :value="message" @input="message = $event.target.value">
3. 解释 Vue 的模板编译过程
模板编译将 .vue
文件的模板转换为渲染函数,分为三个阶段:
- 解析(Parse):
- 将模板字符串转换为 AST(抽象语法树),识别标签、属性、指令等。
- 优化(Optimize):
- 标记静态节点(无动态绑定的节点),避免重复 Diff。
- 静态提升(Hoist):将静态节点提取为常量,减少渲染函数体积。
- 生成(Generate):
- 将 AST 转换为可执行的渲染函数代码(字符串形式)。
- 最终输出类似
_createElement('div', { attrs: { id: 'app' } }, [...])
的代码。
4. Vue 的模板语法和 JSX 的优劣对比
模板语法 | JSX |
---|---|
优势: | 优势: |
- 更贴近 HTML,易读易维护。 | - 灵活,可任意组合 JavaScript 逻辑。 |
- 内置指令简化常见操作(如 v-for 、v-if )。 | - 类型安全(TypeScript 支持更友好)。 |
- 编译器优化静态内容(如静态提升)。 | - 适合复杂条件渲染或动态组件逻辑。 |
劣势: | 劣势: |
- 灵活性受限,复杂逻辑需用计算属性或方法。 | - 学习曲线较高(需熟悉 JSX 语法)。 |
- 类型支持较弱(Vue 3 + TS 有改进)。 | - 无编译器优化(需依赖 Babel 插件或手动优化)。 |
5. 是否了解 Vue 的源码实现(如虚拟 DOM Diff 算法)?
- Diff 算法核心逻辑:
- 同层级比较:仅对比同一层级的节点,不跨级(时间复杂度 O(n))。
- Key 的作用:通过
key
快速判断节点是否可复用,减少 DOM 操作。 - 双端对比:
- 新旧子节点数组的首尾交叉对比,快速定位差异位置。
- 若无匹配,则通过遍历查找可复用的节点。
- 优化策略:
- 静态节点跳过:编译阶段标记的静态节点不参与 Diff。
- 区块树优化(Vue 3):基于模板结构的动态标记,减少动态节点遍历范围。
总结建议
- 框架对比:强调场景选择(如 Vue 适合快速开发,React 适合复杂应用),避免主观评价优劣。
- 原理回答:结合源码逻辑(如 Diff 双端对比)体现技术深度,但避免陷入代码细节。
- 实践结合:举例说明如何利用模板优化或 JSX 灵活性解决实际问题(如动态表单生成)。
- 扩展思考:提及 Vue 3 新特性(如编译时优化、Block Tree)对性能的提升。