刷刷题50(vue3)

1. Vue3 的响应式系统如何实现深度监听和自定义 Reactive 转换器?

  • 深度监听 ‌:reactive 默认递归代理嵌套对象,而 shallowReactive 仅代理第一层属性,适用于性能敏感场景‌。

  • 自定义转换器 ‌:通过 toRaw 获取原始对象,或使用 markRaw 标记对象跳过响应式处理,例如:

    ini 复制代码
    const rawData = { id: 1 };
    const reactiveData = reactive(markRaw(rawData)); // rawData 不会被代理‌:ml-citation{ref="3,4" data="citationList"}。

2. 如何利用 effectScope 管理组合式 API 中的副作用(Side Effects)?

effectScope 用于集中管理 watchcomputed 等副作用,避免内存泄漏:

ini 复制代码
import { effectScope } from 'vue';
const scope = effectScope();
scope.run(() => {
  const count = ref(0);
  watch(count, () => console.log('值变化'));
});
scope.stop(); // 停止所有副作用‌:ml-citation{ref="2,4" data="citationList"}。

场景‌:动态组件卸载时自动清理关联副作用‌。


3. 如何实现 Vue3 响应式数据的"序列化安全"?

  • 问题 ‌:直接序列化 reactive 对象可能导致循环引用或冗余元数据。
  • 解决方案 ‌:使用 toRefs 解构响应式对象,或通过 JSON.stringify(reactiveObj) 前调用 toRaw 获取原始数据‌34。

4. Vue3 如何通过 v-bind 在 CSS 中绑定动态值?如何处理组件作用域样式的穿透问题?

  • 动态 CSS 值 ‌:在 <style> 中使用 v-bind 绑定响应式变量:

    xml 复制代码
    <script setup>
    const color = ref('red');
    </script>
    <style>
    .text { color: v-bind(color); }
    </style>
  • 样式穿透 ‌:使用 :deep() 修改子组件样式:

    ruby 复制代码
    :deep(.child-class) { color: blue; } /* 穿透到子组件‌:ml-citation{ref="2,6" data="citationList"} */

5. 如何利用自定义渲染器实现 Vue3 在 Canvas 或 WebGL 中的渲染?

通过 createRenderer 自定义节点操作逻辑:

scss 复制代码
const { createApp } = createRenderer({
  createElement: (tag) => canvas.createShape(tag),
  patchProp: (el, key, val) => el.setAttribute(key, val),
});
createApp(MyComponent).mount('#canvas-container');

应用场景‌:游戏界面、数据可视化大屏‌。


6. Vue3 的编译时性能优化策略有哪些?如何利用 @vue/compiler-sfc 进行自定义模板编译?

  • 优化策略‌:

    • 静态节点提升(Hoist Static)为常量,跳过 Diff 比对‌。
    • 动态标记(Patch Flags)标识节点类型,减少运行时判断‌。
  • 自定义编译 ‌:通过 compiler-sfc 解析 .vue 文件,修改 AST 实现自定义逻辑(如添加全局样式)‌。


7. 如何通过 watchEffectonInvalidate 参数实现副作用清理?

onInvalidate 在副作用重新执行或组件卸载时触发清理逻辑:

scss 复制代码
watchEffect((onInvalidate) => {
  const timer = setTimeout(() => {}, 1000);
  onInvalidate(() => clearTimeout(timer)); // 清理定时器‌:ml-citation{ref="3,4" data="citationList"}。
});

8. Vue3 如何通过 defineExpose 控制组件暴露的属性和方法?

<script setup> 中,defineExpose 指定父组件可访问的内容:

ruby 复制代码
<script setup>
const internalData = ref('secret');
defineExpose({ publicData: 'exposed' }); // 仅暴露 publicData‌:ml-citation{ref="2,6" data="citationList"}。
</script>

9. 如何结合 TypeScript 泛型与 reactive 实现强类型响应式对象?

通过泛型定义响应式对象结构:

ruby 复制代码
interface User {
  id: number;
  name: string;
}
const user = reactive<User>({ id: 1, name: 'Alice' }); // 类型安全‌:ml-citation{ref="2,4" data="citationList"}。

10. Vue3 的异步组件加载如何结合 Suspense 实现错误边界(Error Boundary)?

通过 SuspenseonErrorCaptured 钩子捕获异步组件错误:

xml 复制代码
vueCopy Code
<template>
  <Suspense @error-captured="handleError">
    <AsyncComponent />
    <template #fallback>Loading...</template>
  </Suspense>
</template>
<script setup>
const handleError = (err) => { console.error(err); };
</script>

场景‌:统一处理接口请求失败或组件加载异常‌。

相关推荐
孤狼warrior1 小时前
爬虫进阶 JS逆向基础超详细,解锁加密数据
javascript·爬虫
꒰ঌ 安卓开发໒꒱2 小时前
RabbitMQ面试全解析:从核心概念到高可用架构
面试·架构·rabbitmq
前端炒粉2 小时前
18.矩阵置零(原地算法)
javascript·线性代数·算法·矩阵
listhi5202 小时前
利用React Hooks简化状态管理
前端·javascript·react.js
杨筱毅2 小时前
【C++】【常见面试题】最简版带大小和超时限制的LRU缓存实现
c++·面试
一点一木2 小时前
🚀 2025 年 10 月 GitHub 十大热门项目排行榜 🔥
前端·人工智能·github
华仔啊2 小时前
这个Vue3旋转菜单组件让项目颜值提升200%!支持多种主题,拿来即用
前端·javascript·css
非凡ghost3 小时前
Adobe Lightroom安卓版(手机调色软件)绿色版
前端·windows·adobe·智能手机·软件需求
BestAns3 小时前
Postman 平替?这款轻量接口测试工具,本地运行 + 批量回归超实用!
前端
CsharpDev-奶豆哥3 小时前
JavaScript性能优化实战大纲
开发语言·javascript·性能优化