面试备战录

41 阅读2分钟

1、简单描述一下对 Vue 的理解

答:Vue 是一款用于构建用户界面的渐进式 JavaScript 框架。其核心功能包括声明式渲染响应性

  • 声明式渲染:Vue 基于 HTML 扩展了一套模版语法,可以使我们声明式地描述最终输出HTMLJS状态之间的关系。
  • 响应性:Vue 会自动跟踪 JS 状态并在其发生变化时,响应式的更新 DOM。

问题 1:渐进式是什么意思?React 不是渐进式的吗?

答:你可以逐步使用 Vue 的功能,根据项目需求“逐步引入”而不是一开始就全盘采用。(就是你可以一点一点、逐步的增加功能);

React 本质上是一个库,不是框架;具备一定的渐进性。React 从一开始就是一个专注于构建 UI 的 JavaScript 库,专注视图层,其他功能(如路由、状态管理)都由社区提供、独立维护。

问题 2:React 不具备响应性的特质吗?

答:React 有“状态驱动 UI”的能力,但它本质上不具备 Vue 式的响应性系统;

  • Vue 使用ref()/reactive()创建的对象,是通过Proxy实现自动依赖追踪的,Vue会记录哪些数据变了,自动更新DOM,无需额外通知。
  • React 没有响应性系统,它是“显示触发更新”,要修改状态必须通过setState(),不管修改哪个状态,必须重新执行整个组件(构建新的 Fiber 树)。

扩展:

  • React 是一个用于构建 Web 和原生交互界面(APP)的库。

2、Vue3 中为什么引入两个响应式 API

答:Vue3 引入两个响应式 API(ref() 和 reactive()),是为了分别处理不同类型的数据:

  • Vue3 响应式是通过 Proxy 实现的,但 Proxy 只能代理对象类型,不能代理基本类型(string、number、boole);
  • ref() API 是把基本类型包装成功一个对象{value : xxx}
  • 注意:reactive和ref 代理的对象不能直接解构,否则失去非响应式,可以使用 toRef、 toRefs 进行结构,但结构出来的属性,需要使用.value
// reactive 解构
const state = reactive({ count: 0, name: 'Tom' });
const { count } = state; // ❌ 失去响应性!
const countRef = toRef(state, 'count'); // 使用toRef把响应式对象的一个属性变成ref,保持响应性
const nameRef = toRef(state, 'name');
console.log(countRef.value); // 0
console.log(nameRef.value); // Tom

const { count, name } = toRefs(state); // toRefs 把响应式对象的每个属性都变成 ref,保持响应性
count.value++; // 响应式改变
console.log(state.count); // 会变

// ref 解构
const user = ref({ name: 'Tom', age: 18 });
const { name, age } = toRefs(user.value); // ✅ name 和 age 是 ref,可以响应式更新

问题 1:ref 也可以直接定义响应式数据类型,为什么不直接使用 ref?

答:虽然 ref() 可以定义对象类型,但它本质是把对象包进 .value 中的一层壳 —— 大多数场景下操作对象直接用 reactive() 更自然、体验更好。