1、简单描述一下对 Vue 的理解
答:Vue 是一款用于构建用户界面的渐进式 JavaScript 框架。其核心功能包括声明式渲染和响应性;
- 声明式渲染:Vue 基于 HTML 扩展了一套模版语法,可以使我们声明式地描述最终输出
HTML和JS状态之间的关系。 - 响应性: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() 更自然、体验更好。