知前端学习资料库阅读 · 理解 · 练习返回资料库

A WEEK WITH VUE

Vue 7 天复习计划

把知识点讲清楚,把关键代码写出来。
每天 2 小时,从响应式一路走到项目与面试。

Vue 3 · Composition API适合有 Vue 使用经验的面试复习
本周进度0 / 7 天

0 / 28 项任务完成

约 14 小时 · 一个逐步完善的小项目

一周贯穿一个项目:Vue 面试题复习台。 从题库筛选出发,逐步加入收藏、详情路由、状态管理与异步加载;最后用它练习项目表达。

DAY 01 / 07

基础归位:用状态描述界面

Vue 3 · script setup · 模板与列表

约 2 小时
今天的目标

面向已经用过 Vue 的面试复习者,先找出遗忘点,再搭起“Vue面试题复习台”的第一版。今天只做题库展示与答案展开。

按这四步复习 完成后勾选

  1. 15 分钟

    不查资料,写出 ref、reactive、v-model、v-if、v-for/key 各解决什么问题。画出“点击查看答案 → 修改状态 → 模板更新”的流程,并圈出两个最不确定的点。

    完成标准留下 5 个术语的个人解释、1 张三步数据流图和 2 个待验证问题。
  2. 30 分钟

    先读本地“理解Vue的响应式思维”,再按需查看官方响应式基础、条件渲染与列表渲染。用 script setup 写计数器、答案显隐、带唯一 id 的列表;在 JS 和模板中分别使用 ref。不要通读整份指南。

    完成标准三个实验均能运行;能演示 JS 中的 .value、解释 v-if 与 v-show 的取舍,并说出稳定 key 的作用。
  3. 50 分钟

    在自己的练习目录使用现有 Vue 3 工程,或按官方快速上手创建项目并预选 Router、Pinia。准备至少 8 道题,每题包含唯一 id、title、topic、answer;用 v-for 渲染,点击题目显示答案。加上关键词输入和主题选择框,先绑定状态,筛选留到明天。

    完成标准开发页面可打开,8 道题可见;点击任意题显示对应答案;表单值随输入变化;控制台没有运行错误或重复 key 警告。
  4. 25 分钟

    调换两题顺序,检查当前选中题仍由 id 定位;反复展开、关闭答案。录一段不超过 90 秒的说明,讲清数据结构、状态变化和 DOM 更新,再完成下面三道自测。

    完成标准保存第一版可运行代码;顺序调整不串题;三道题先独立作答,再把答错的原因记入复习笔记。
今日交付

给「Vue 面试题复习台」添一块拼图

Vue面试题复习台 v1:8 道本地题、稳定 id、答案展开和已绑定的筛选控件;附一份基础薄弱点清单。

先口述,再看答案

每题用自己的话回答 1–2 分钟,点开核对关键点。

01ref 只能保存基本类型吗?为什么 JS 里通常需要 .value?

不是,ref 也能保存对象。ref 用 .value 的访问与赋值承载响应式追踪;对象值默认会获得深层响应性。模板中的顶层 ref 通常会自动解包,数组、集合等情况仍要注意解包边界。

02答案面板应该用 v-if 还是 v-show?

v-if 根据条件创建或销毁内容,适合较少切换的区块;v-show 保留 DOM,通过 CSS 切换显示,适合频繁显隐。选择应依据切换频率、初始化成本以及是否需要保留内部状态。

03为什么筛选、排序后的题目列表不宜用数组下标作 key?

下标会随位置变化,可能让原有 DOM 或组件状态被复用给另一道题。稳定且唯一的题目 id 能表达同一项的身份,尤其适用于包含输入框或局部状态的列表。

相关阅读

先按需看资料,再回到练习。

下次打开时,笔记和勾选记录会保留在当前浏览器。

DAY 02 / 07

响应式建模:筛选、收藏与派生状态

ref / reactive · computed · watch

约 2 小时
今天的目标

把原始状态、派生值和副作用分开,完成题库筛选与内存中的收藏;能够解释为什么这样选 API。

按这四步复习 完成后勾选

  1. 15 分钟

    闭卷解释昨天两个薄弱点。列出题库、关键词、主题、收藏 id、可见题目、结果数量,分别标为原始状态或派生值;把日志或持久化另列为副作用。

    完成标准六项状态完成归类;能说明为什么不需要同时手动维护“可见题目数组”和“结果数量”。
  2. 30 分钟

    阅读本地 Composition API 章节及官方 computed。实验一:解构普通 reactive 对象的数字属性后再修改原对象;用 toRef 或保留对象访问修复。实验二:临时用 console.count 观察 computed getter 的调用,不修改响应式状态,比较依赖不变和变化时的读取;实验三:用 watch 监听关键词记录日志。

    完成标准保留两个最小对照例子;能区分 reactive 原始值属性的解构问题、computed 缓存和 watch 副作用,并注明 Vue 3.5+ 的 defineProps 响应式解构是编译器支持的特例。
  3. 50 分钟

    在复习台加入 keyword、topic、favoriteIds 和 onlyFavorites。用 computed 得到 visibleQuestions 与数量;支持关键词和主题共同筛选、收藏与取消收藏、只看收藏及空结果提示。收藏只存 id,暂时不持久化;不要在 computed getter 内改状态。

    完成标准同一题连续收藏两次不会产生重复 id;关键词、主题和只看收藏可组合;取消收藏后相关列表及数量立即一致;无结果时显示清晰提示。
  4. 25 分钟

    检查空关键词、首尾空格、不同大小写、不存在的主题组合、收藏为空五种情况。完成三道自测,并用项目中各一个例子解释 ref、computed、watch 的职责。

    完成标准五种用例留下结果;筛选采用一致的 trim/大小写处理;能在两分钟内讲清状态来源、派生过程和副作用边界。
今日交付

给「Vue 面试题复习台」添一块拼图

Vue面试题复习台 v2:关键词 × 主题 × 收藏的组合筛选,带数量与空状态;收藏与列表使用同一份源状态。

先口述,再看答案

每题用自己的话回答 1–2 分钟,点开核对关键点。

01题目筛选为什么优先用 computed,而不是用 watch 反复给数组赋值?

筛选结果由题库和筛选条件推导而来,computed 能声明这种关系并缓存结果,减少重复维护状态。watch 更适合请求、存储、日志等副作用;两者不是谁全面替代谁。

02const { count } = reactive({ count: 0 }) 后,count 会持续跟随源对象吗?

这里取出的是当时的数字值,不会继续读取代理属性,所以不会跟随。可保留 state.count 访问,或用 toRef/toRefs 保持连接。解构出的对象引用仍可能是代理,不能概括为“所有解构都失去响应式”。另外,Vue 3.5+ 在 script setup 内对 defineProps 的响应式解构有编译器支持,应与普通 reactive 解构区分。

03watch 与 watchEffect 怎样选择?

watch 显式声明源,适合关心特定值的变化、需要新旧值或控制触发条件时。watchEffect 会立即运行并追踪同步执行时读取的响应式依赖,适合依赖与副作用紧密相关的逻辑;异步回调中 await 之后的新读取不会被它自动追踪。

相关阅读

先按需看资料,再回到练习。

下次打开时,笔记和勾选记录会保留在当前浏览器。

DAY 03 / 07

组件协作:明确输入、事件与状态归属

Props / Emits · 组件 v-model · 插槽

约 2 小时
今天的目标

把复习台拆成职责清楚的组件,保持单向数据流,能够解释组件 v-model 与直接修改 prop 的区别。

按这四步复习 完成后勾选

  1. 15 分钟

    把页面拆成 SearchBar、QuestionCard、QuestionDetail 三类组件。逐项写出每个组件接收哪些 props、向外发出什么事件,以及关键词、收藏和当前题目由谁持有。

    完成标准组件树上至少标出 keyword 更新、toggle-favorite 和 select 三条事件流;同一份收藏状态只有一个所有者。
  2. 30 分钟

    读本地模板与通信章节,结合官方 Props、组件事件和组件 v-model。先手写 modelValue prop 与 update:modelValue 事件的输入组件;如果工程为 Vue 3.4+,再对照 defineModel 写法。为题目卡片加一个操作区插槽。

    完成标准父组件修改关键词会更新输入框,输入框编辑会通知父组件;能说出宏对应的 prop/事件;插槽内容由父组件提供,子组件没有直接给 prop 赋值。
  3. 50 分钟

    完成三个组件并声明 props、emits。QuestionCard 通过事件请求收藏和选中;QuestionDetail 只接收题目与显示状态;SearchBar 通过 v-model 同步关键词。复用第二天的筛选逻辑,并用插槽放置一个“查看答案”操作。

    完成标准拆分后筛选、收藏、空状态、答案展开均可用;两张卡片互不串状态;组件不直接修改传入题目对象的收藏字段,也不偷偷维护第二份全局收藏。
  4. 25 分钟

    跑一遍“输入 → 筛选 → 收藏 → 查看答案 → 取消收藏”。检查组件接口是否只暴露必要信息,完成三道自测;用两分钟解释为什么没有把所有状态都交给子组件。

    完成标准完整链路通过;写出三条实际 prop/event 契约;能解释局部展开状态和跨组件收藏状态应如何分工。
今日交付

给「Vue 面试题复习台」添一块拼图

Vue面试题复习台 v3:可复用的搜索栏、题目卡片和详情组件,附组件树与明确的 props/emits 契约。

先口述,再看答案

每题用自己的话回答 1–2 分钟,点开核对关键点。

01子组件为什么不应直接修改 prop?对象 prop 的深层字段能改就代表应该改吗?

prop 表达父到子的输入,直接修改会破坏状态归属。对象或数组的深层字段技术上可能可变,但这会让父状态被隐式改变。一般由子组件发出事件,交给拥有状态的一方更新;有意共享的场景也应明确约定。

02组件上的默认 v-model 对应什么接口?defineModel 有版本要求吗?

默认对应 modelValue prop 和 update:modelValue 事件。defineModel 是便利宏,从 Vue 3.4 起官方推荐使用;更早的 Vue 3 可手写 prop/emit。它不是绕开父子数据流的任意双向修改。

03插槽与 prop 如何分工?

prop 传递数据或配置;插槽让父组件提供渲染内容。普通插槽表达式使用父级作用域;子组件要把内部数据提供给插槽内容时,用作用域插槽显式传出。

相关阅读

先按需看资料,再回到练习。

下次打开时,笔记和勾选记录会保留在当前浏览器。

DAY 04 / 07

应用组织:路由、共享状态与持久化

Vue Router · Pinia · localStorage

约 2 小时
今天的目标

让题目详情拥有可访问地址,把跨页面收藏放入 Pinia,并在刷新后恢复收藏;理解 URL 状态与应用状态的边界。

按这四步复习 完成后勾选

  1. 15 分钟

    列出 /questions、/questions/:id 两个路由。决定题目 id 进入 URL,收藏 id 进入 Store,输入过程中的局部状态留在组件;写出刷新页面时哪些数据需要恢复。

    完成标准留下路由表和三类状态表;不会为每个组件都建立 Store,也不会把整道题对象序列化到路由参数。
  2. 30 分钟

    阅读本地 Router/Pinia 章节及官方动态路由、定义 Store、State。用两个 id 验证同一详情组件可能复用;比较直接解构 Store 状态与 storeToRefs。查看 $subscribe 的持久化例子,决定只保存收藏 id 数组与版本号。

    完成标准能演示 id 变化后详情需要随之更新;Store 状态用 storeToRefs 解构仍会更新;能解释 action 可直接解构而 state/getter 不能照搬。
  3. 50 分钟

    创建列表、详情路由及 RouterLink/RouterView。把 favoriteIds、toggleFavorite 和收藏数量迁入 Pinia;两页共用。启动时读取固定 localStorage key,捕获 JSON 解析错误并校验 id 数组;在应用初始化处注册一次订阅保存更新。无须加入登录、后端或完整持久化插件。

    完成标准列表和详情中的收藏状态同步;刷新后收藏恢复;非法存储值会回退为空数组;重复进入页面不会叠加订阅;不存在的题目 id 有明确提示。
  4. 25 分钟

    直接打开一个详情 URL,再使用浏览器后退;连续切换两个 id;写入损坏的本地存储后刷新。完成三道自测。若用 Web History,在笔记中注明静态服务器须回退入口;不准备服务器配置时可先用 Hash History。

    完成标准四个交互检查均有结果;能说清生产环境刷新 404 与 Vue 组件逻辑报错的区别;收藏恢复失败不会让页面白屏。
今日交付

给「Vue 面试题复习台」添一块拼图

Vue面试题复习台 v4:列表/详情路由、Pinia 共享收藏与可靠的本地恢复,题目详情可通过 URL 定位。

先口述,再看答案

每题用自己的话回答 1–2 分钟,点开核对关键点。

01为什么从 /questions/1 切到 /questions/2 不能只依赖 onMounted 重新取题?

两个地址可能匹配同一个组件并复用实例,挂载钩子不一定再次执行。应使用响应式 props/computed,或侦听具体的 route.params.id,也可用路由更新守卫处理变化。

02为什么 Pinia 的 state/getters 通常用 storeToRefs 解构?

Store 是响应式对象,直接解构出普通值会失去持续访问 Store 的连接。storeToRefs 为状态和 getter 提取相应 ref,跳过方法和非响应式属性;action 可以直接从 Store 解构。

03Pinia 是否自动把状态存进 localStorage?恢复流程要注意什么?

不会自动持久化。本练习自行读取、校验并恢复收藏,再订阅后续变化写回。需要处理坏 JSON、旧结构和存储不可用;订阅只注册一次,避免重复写入。

相关阅读

先按需看资料,再回到练习。

下次打开时,笔记和勾选记录会保留在当前浏览器。

DAY 05 / 07

异步可靠性:生命周期与副作用清理

watch · 清理失效请求 · loading/error/empty

约 2 小时
今天的目标

给详情加入可控的异步加载,解决快速切题时旧结果覆盖新结果的问题,并能清理组件创建的计时器与监听。

按这四步复习 完成后勾选

  1. 15 分钟

    在纸上排列“请求 A 发出 → 请求 B 发出 → B 返回 → A 返回”的时间线。为复习台写出正确的最终显示内容,以及 loading、error 在这段时间中应由哪次请求控制。

    完成标准明确写出“最终保持 B”,并指出旧请求的成功、失败和 finally 都可能污染新状态。
  2. 30 分钟

    本地生命周期页主要是提纲,重点读官方生命周期、watch 的副作用清理与组合式函数。运行一个挂载时启动、卸载时停止的计时器。学习 watch 第三个参数 onCleanup;若用 onWatcherCleanup,注明它要求 Vue 3.5+ 且必须在 await 前的同步阶段注册。

    完成标准卸载演示组件后计时器不再打印;能区分卸载清理与每次侦听失效时的清理,并写出所用 API 的版本约束。
  3. 50 分钟

    建立异步 loadQuestion(id) 服务:从现有题库返回 Promise,可指定延迟并模拟失败。封装 useQuestion,用 watch 侦听详情 id 并立即加载,暴露 data/loading/error。通过清理回调的失效标记或请求序号保护成功、失败和 finally;若改用 fetch,可同时取消旧请求。加入重试和未找到题目的状态。

    完成标准A 延迟 800ms、B 延迟 100ms,快速 A→B 后始终显示 B;旧请求失败不覆盖 B;离开详情后不再写入失效结果;最新请求的成功、失败、重试、未找到四条路径可演示。
  4. 25 分钟

    分别跑慢 A 快 B、失败后重试、请求中离开、非法 id 四组操作。检查 loading 是否能结束,是否把正常取消当成错误;回答三道自测,并记录这次修复的最小时间线。

    完成标准四组操作均通过;能用两分钟说明竞态如何出现、为何仅加防抖不够,以及清理覆盖了哪些资源。
今日交付

给「Vue 面试题复习台」添一块拼图

Vue面试题复习台 v5:可复用的异步详情 composable,具备加载、错误、空内容、重试和过期结果保护。

先口述,再看答案

每题用自己的话回答 1–2 分钟,点开核对关键点。

01nextTick 是等待网络请求结束,还是等待什么?

它等待 Vue 当前批次的 DOM 更新完成。状态改变后若要读取更新后的 DOM,可 await nextTick;它不会替代网络请求的 await,也不等于等待所有图片或异步组件完成。

02watchEffect(async () => ...) 会追踪 await 后读到的所有响应式值吗?

不会,它只追踪同步执行阶段的读取。依赖需要明确控制时可用 watch 指定源,或在第一个 await 前读取相关值,避免误以为后面的读取会自动建立依赖。

03怎样防止旧请求覆盖最新题目?onWatcherCleanup 有什么限制?

在侦听失效时把旧请求标为过期,或取消旧请求,并在写入 data/error/loading 前确认仍是当前请求。onWatcherCleanup 需 Vue 3.5+ 且同步注册,不能放到 await 后;watch 参数提供的 onCleanup 也是可用的清理方式。

相关阅读

先按需看资料,再回到练习。

下次打开时,笔记和勾选记录会保留在当前浏览器。

DAY 06 / 07

性能与工程:先定位,再做最小优化

性能记录 · 列表规模 · 路由懒加载 · 构建

约 2 小时
今天的目标

用同一个复习台完成一次有证据的优化,区分加载慢与更新慢,留下可复现的前后对照,而不是背优化名词。

按这四步复习 完成后勾选

  1. 15 分钟

    为练习临时生成 2000 道唯一 id 的题目,在同一浏览器、数据量和构建模式下执行“打开列表 → 输入关键词 → 收藏一题”。记录可见卡片数、一次 Performance 轨迹和明显耗时步骤。

    完成标准留下数据量、操作步骤、测试环境与一份基线记录;明确主要瓶颈是资源加载、过滤计算还是大量 DOM 更新。
  2. 30 分钟

    阅读官方性能优化中的代码分割、Props 稳定性与大型列表,以及 Router 路由懒加载。本地性能场景题用于借鉴回答结构,其中 React 示例和示例数字不直接套用。为当前瓶颈选一个方案,并写出其成本。

    完成标准形成“证据 → 假设 → 改动 → 验证”的四行计划;能区分分页与虚拟列表,也能说明路由懒加载未必改善已经打开页面后的筛选耗时。
  3. 50 分钟

    默认给结果列表加每页 50 题的分页,并在筛选变化时回到第一页;题卡只接收自身需要的稳定状态,避免把全局变化值传给每张卡。将详情路由组件改为动态 import。运行项目构建脚本,用生成的生产产物预览并检查详情入口。若基线指向别处,说明理由后优先修复那个瓶颈。

    完成标准2000 道题不会一次渲染全部卡片;分页、收藏与筛选结果正确;详情代码形成独立加载边界;生产构建成功,列表到详情可用,没有新增控制台错误。
  4. 25 分钟

    保持与基线相同的数据、设备和构建模式,重跑同一操作至少三次,记录耗时与 DOM 数量,不混比开发和生产模式。写下实际改善、没有改善的部分及一个后续方向,然后完成自测。

    完成标准留下一张前后对照表与三次记录;数字来自本次测量;如果结果无改善,说明发现而非编造收益。
今日交付

给「Vue 面试题复习台」添一块拼图

Vue面试题复习台 v6:大题库下可用的列表、懒加载详情与可运行生产产物;附一次带环境、步骤和真实记录的性能小报告。

先口述,再看答案

每题用自己的话回答 1–2 分钟,点开核对关键点。

01列表卡顿时,分页、虚拟列表与 computed 分别解决什么问题?

分页限制一次显示的记录数量;虚拟列表只渲染视口附近内容,适合持续浏览长列表;computed 避免依赖不变时重复计算派生值。它们分别影响显示规模或计算,不能把 computed 当作减少全部 DOM 节点的手段。

02Vue Router 的路由懒加载与异步组件是同一个配置方式吗?

路由组件可直接配置为返回动态 import 的函数,由 Router 按导航需要加载。不要把路由组件一律包成 defineAsyncComponent;普通页面内异步组件有自己的适用场景。

03给所有题卡都传 activeId,和只传各自的 active 布尔值,有什么区别?

activeId 一变,每张卡片的该 prop 都变化;在父组件计算各项的 active,通常只会改变旧选中项和新选中项的输入。保持无关项 props 稳定可减少由这些输入引起的更新,但仍要结合实际依赖测量。

相关阅读

先按需看资料,再回到练习。

下次打开时,笔记和勾选记录会保留在当前浏览器。

DAY 07 / 07

模拟面试:讲清原理、选择与证据

闭卷回忆 · 场景追问 · 项目演示 · 查漏补缺

约 2 小时
今天的目标

把前六天连成一段真实、可追问的项目说明,完成一次完整回归并确定下一轮重点;七天完成一轮复习,不等于精通 Vue。

按这四步复习 完成后勾选

  1. 15 分钟

    不看答案,分别用一句话解释响应式、computed/watch、组件通信、Router、Pinia、异步清理、性能测量。给每项标记“能解释 / 能写例子 / 仍有疑问”,选择两个最弱点。

    完成标准完成七项自评分,不把看懂答案当作会答;留下两个具体问题,避免只写“响应式不熟”。
  2. 30 分钟

    每轮先用两分钟回答,再用五分钟写最小例子或画流程,最后三分钟自查。三轮分别讨论“筛选用 computed 还是 watch”“路由切题为什么会出现旧结果”“刷新后收藏如何恢复”。录音或保存逐字要点,先回答再翻资料。

    完成标准留下三份回答;每份均有具体机制、复习台中的代码位置和至少一个边界条件;错误处用官方文档校正。
  3. 50 分钟

    按顺序检查关键词+主题筛选、空结果、收藏去重、详情收藏同步、刷新恢复、非法 id、慢 A 快 B、失败重试八项。挑两处真实失败或理解薄弱处修复,再用同样步骤回归;若八项均通过,就去掉笔记,现场重写一段筛选和一段竞态保护逻辑。

    完成标准八项检查均有通过/失败记录;修复后原步骤可复测;没有用隐藏错误提示或删除功能来“通过”验收。
  4. 25 分钟

    用“需求 → 状态与组件设计 → 一个困难 → 方案与取舍 → 实测结果”讲解复习台。整理 README:启动方式、路由与 Store 结构、关键边界、已知限制;从自测中选三题安排后续复习。只陈述亲手完成的功能和实际测量的数据。

    完成标准五分钟内完成演示与解释;README 足够让自己重新运行项目;留下三道待强化题及各一个可验证的练习动作。
今日交付

给「Vue 面试题复习台」添一块拼图

Vue面试题复习台 v7:可演示的完整练习项目、八项回归记录、三段模拟面试回答和下一轮复习清单。

先口述,再看答案

每题用自己的话回答 1–2 分钟,点开核对关键点。

01面试官要求加入“只看收藏”,你会如何从需求讲到实现?

先明确收藏是否跨页面、是否刷新保留;把收藏 id 放进现有 Store,onlyFavorites 作为筛选条件,computed 组合题库与条件生成结果。补上取消收藏后列表变化、空状态和持久化的验收,不再手动维护另一份收藏题库。

02怎样说明一次性能优化是真实有效的?

讲清数据量、环境与可复现操作,展示原瓶颈证据和选择方案的理由,再在相同条件下重复测量,说明收益、成本和未解决问题。没有线上数据就说是本地练习结果,不套用资料里的百分比。

03如果只有两分钟介绍这个项目,最值得讲什么?

先说复习题库的具体使用路径,再说组件与状态归属,重点展开一次真实问题,例如快速切题竞态或大列表更新;说明修复方式、边界与验收结果。最后坦诚说明纯本地收藏、模拟接口等限制。

相关阅读

先按需看资料,再回到练习。

下次打开时,笔记和勾选记录会保留在当前浏览器。