<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DOM操作 on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/dom%E6%93%8D%E4%BD%9C/</link><description>Recent content in DOM操作 on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/dom%E6%93%8D%E4%BD%9C/index.xml" rel="self" type="application/rss+xml"/><item><title>created与mounted钩子的差异与应用</title><link>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-09/</link><pubDate>Tue, 04 Mar 2025 07:00:27 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-09/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题主要考察候选人对Vue.js核心机制的理解深度及工程实践能力，重点评估：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>生命周期阶段认知&lt;/strong>：能否准确区分不同生命周期钩子的执行时机&lt;/li>
&lt;li>&lt;strong>响应式系统理解&lt;/strong>：数据初始化与DOM渲染的时序关系&lt;/li>
&lt;li>&lt;strong>框架整合能力&lt;/strong>：第三方库集成时的生命周期选择策略&lt;/li>
&lt;li>&lt;strong>SSR兼容意识&lt;/strong>：服务端渲染场景下的特殊处理&lt;/li>
&lt;/ol>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>生命周期时序 &amp;gt; DOM渲染机制 &amp;gt; SSR限制 &amp;gt; 第三方库初始化&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vue生命周期中：&lt;/p>
&lt;ul>
&lt;li>&lt;code>created&lt;/code>：组件实例创建完成，数据观测/计算属性/watch已配置，但尚未挂载DOM（&lt;code>$el&lt;/code>未创建）&lt;/li>
&lt;li>&lt;code>mounted&lt;/code>：组件挂载到真实DOM后触发，可通过&lt;code>$el&lt;/code>访问渲染结果&lt;/li>
&lt;/ul>
&lt;p>数据初始化应在&lt;code>created&lt;/code>阶段完成，因为此时已建立响应式数据但未触发渲染消耗。访问DOM必须等待&lt;code>mounted&lt;/code>，因Virtual DOM到真实DOM的挂载是异步过程。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>在&lt;code>created&lt;/code>中使用&lt;code>document.querySelector&lt;/code>获取组件DOM&lt;/li>
&lt;li>在服务端渲染(SSR)场景的&lt;code>created&lt;/code>中访问浏览器特有API&lt;/li>
&lt;li>将需要DOM操作的第三方库初始化放在&lt;code>created&lt;/code>&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;code>created&lt;/code>在组件实例创建后、DOM挂载前触发，用于数据初始化和非DOM相关操作；&lt;code>mounted&lt;/code>在DOM挂载完成后执行，用于DOM操作和需要元素存在的库初始化。典型应用：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>数据初始化&lt;/strong>：在&lt;code>created&lt;/code>中触发API请求，尽早获取数据&lt;/li>
&lt;li>&lt;strong>DOM访问&lt;/strong>：图表库(如ECharts)初始化必须在&lt;code>mounted&lt;/code>执行&lt;/li>
&lt;li>&lt;strong>第三方库整合&lt;/strong>：依赖CSS选择器的库(如jQuery插件)需等待&lt;code>mounted&lt;/code>&lt;/li>
&lt;li>&lt;strong>SSR兼容&lt;/strong>：避免在&lt;code>created&lt;/code>中使用&lt;code>window&lt;/code>等浏览器特有对象&lt;/li>
&lt;/ol>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="41e45c9" class="language-javascript ">
 &lt;code>export default {
 async created() {
 // 正确：数据初始化
 this.userData = await fetchUserData();
 
 // 错误示例：此时DOM未生成
 // document.querySelector(&amp;#39;.chart&amp;#39;) =&amp;gt; null
 },
 mounted() {
 // 正确：DOM相关初始化
 const chartEl = this.$el.querySelector(&amp;#39;.chart&amp;#39;);
 this.chart = echarts.init(chartEl);
 
 // 添加事件监听（需在beforeDestroy移除）
 window.addEventListener(&amp;#39;resize&amp;#39;, this.handleResize);
 },
 beforeDestroy() {
 window.removeEventListener(&amp;#39;resize&amp;#39;, this.handleResize);
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>优化建议&lt;/strong>：&lt;/p></description></item><item><title>子组件实例与DOM访问方法</title><link>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-23/</link><pubDate>Tue, 04 Mar 2025 07:00:27 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-23/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题目主要考查以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Vue响应式系统理解&lt;/strong>：掌握组件实例与DOM元素访问的正确姿势，避免直接操作DOM破坏响应式原则&lt;/li>
&lt;li>&lt;strong>组件通信机制&lt;/strong>：理解跨组件访问的官方推荐模式&lt;/li>
&lt;li>&lt;strong>组合式API适应能力&lt;/strong>：展示从选项式API到组合式API的迁移认知&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>ref属性的两种使用场景（DOM元素/组件实例）&lt;/li>
&lt;li>$refs集合的初始化时机与响应式特性&lt;/li>
&lt;li>组合式API中模板引用的处理方式&lt;/li>
&lt;li>expose()方法在组件封装中的作用&lt;/li>
&lt;li>TypeScript类型推导在模板引用中的应用&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>模板引用 &amp;gt; 组件实例方法暴露 &amp;gt; 组合式API适配&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>模板引用机制&lt;/strong>：通过&lt;code>ref&lt;/code>特殊属性创建直接访问入口。Vue在组件挂载时，将DOM元素/组件实例自动绑定到&lt;code>this.$refs&lt;/code>对象，该过程发生在&lt;code>mounted&lt;/code>生命周期后&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>响应式脱敏&lt;/strong>：&lt;code>$refs&lt;/code>本身并非响应式对象。当使用v-for时，引用会转换为数组形式，但数组元素仍保持非响应式特性&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>组合式API变化&lt;/strong>：&lt;/p>
&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="345e4ff" class="language-javascript ">
 &lt;code>// 声明与模板中ref同名的响应式引用
const childRef = ref(null)

// 必须return才能在模板中访问
return { childRef }&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>需注意：&lt;/p>
&lt;ul>
&lt;li>引用值在组件挂载后才可用&lt;/li>
&lt;li>需使用&lt;code>expose&lt;/code>显式暴露子组件方法&lt;/li>
&lt;li>模板引用与响应式ref共享命名空间&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>在created阶段尝试访问$refs&lt;/li>
&lt;li>误以为refs变化会触发视图更新&lt;/li>
&lt;li>v-for中使用索引访问动态引用未做空值校验&lt;/li>
&lt;li>组合式API中忘记return模板引用&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vue提供了两种安全方式访问子组件或DOM元素：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>ref属性&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>在DOM元素上使用&lt;code>&amp;lt;div ref=&amp;quot;domRef&amp;quot;&amp;gt;&lt;/code>，通过&lt;code>this.$refs.domRef&lt;/code>访问原生DOM&lt;/li>
&lt;li>在子组件上使用&lt;code>&amp;lt;Child ref=&amp;quot;childRef&amp;quot;&amp;gt;&lt;/code>，获取组件实例并调用其暴露的方法&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>$refs工作机制&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>在组件渲染后填充引用&lt;/li>
&lt;li>非响应式对象，不可用于模板绑定&lt;/li>
&lt;li>v-for循环中返回引用数组&lt;/li>
&lt;/ul>
&lt;p>组合式API变化要点：&lt;/p>
&lt;ol>
&lt;li>使用同名响应式ref变量替代this.$refs&lt;/li>
&lt;li>需通过&lt;code>expose&lt;/code>方法显式暴露子组件方法&lt;/li>
&lt;li>模板引用需在setup()中声明并return&lt;/li>
&lt;li>TypeScript需手动标注引用类型&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="选项式api示例">选项式API示例 &lt;a href="#%e9%80%89%e9%a1%b9%e5%bc%8fapi%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="cd20696" class="language-javascript ">
 &lt;code>// 子组件
export default {
 methods: {
 doSomething() {
 // 组件方法
 }
 }
}

// 父组件模板
&amp;lt;template&amp;gt;
 &amp;lt;ChildComponent ref=&amp;#34;child&amp;#34; /&amp;gt;
 &amp;lt;button ref=&amp;#34;btn&amp;#34;&amp;gt;Submit&amp;lt;/button&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
export default {
 mounted() {
 this.$refs.child.doSomething() // 访问子组件
 this.$refs.btn.focus() // 操作DOM
 
 // 动态引用处理
 if (Array.isArray(this.$refs.child)) {
 this.$refs.child[0].doSomething()
 }
 }
}
&amp;lt;/script&amp;gt;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="组合式api示例">组合式API示例 &lt;a href="#%e7%bb%84%e5%90%88%e5%bc%8fapi%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="8af5ca6" class="language-typescript ">
 &lt;code>// 子组件
import { defineComponent } from &amp;#39;vue&amp;#39;

export default defineComponent({
 setup(props, { expose }) {
 const doSomething = () =&amp;gt; {}
 
 // 显式暴露方法
 expose({ doSomething })
 
 return { doSomething }
 }
})

// 父组件
&amp;lt;template&amp;gt;
 &amp;lt;ChildComponent :ref=&amp;#34;(el) =&amp;gt; childRef = el&amp;#34; /&amp;gt;
 &amp;lt;button ref=&amp;#34;btnRef&amp;#34;&amp;gt;&amp;lt;/button&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup&amp;gt;
import { ref, onMounted } from &amp;#39;vue&amp;#39;

const childRef = ref&amp;lt;InstanceType&amp;lt;typeof ChildComponent&amp;gt; | null&amp;gt;(null)
const btnRef = ref&amp;lt;HTMLButtonElement | null&amp;gt;(null)

onMounted(() =&amp;gt; {
 childRef.value?.doSomething()
 btnRef.value?.focus()
})
&amp;lt;/script&amp;gt;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="边界处理建议">边界处理建议 &lt;a href="#%e8%be%b9%e7%95%8c%e5%a4%84%e7%90%86%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>使用可选链操作符避免未定义错误&lt;/li>
&lt;li>v-if控制的元素需在回调中重新获取引用&lt;/li>
&lt;li>动态组件使用keep-alive时注意引用更新时机&lt;/li>
&lt;/ol>
&lt;h3 id="性能优化">性能优化 &lt;a href="#%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>避免高频操作DOM引发重排&lt;/li>
&lt;li>复杂场景优先考虑状态驱动而非DOM操作&lt;/li>
&lt;li>使用防抖/节流控制DOM操作频率&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>为什么$refs不适合模板绑定？&lt;/strong>
由于引用非响应式，变更不会触发视图更新&lt;/p></description></item><item><title>自定义指令的典型应用场景</title><link>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-35/</link><pubDate>Tue, 04 Mar 2025 07:00:27 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-35/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Vue高级特性理解&lt;/strong>：是否掌握自定义指令的设计哲学及适用边界&lt;/li>
&lt;li>&lt;strong>DOM操作场景判断&lt;/strong>：能否区分指令与组件在逻辑封装维度的差异&lt;/li>
&lt;li>&lt;strong>性能优化意识&lt;/strong>：图片懒加载实现需考虑Intersection Observer等现代API的运用&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>指令与组件的场景选择标准&lt;/li>
&lt;li>指令生命周期钩子的正确使用&lt;/li>
&lt;li>交叉观察器（Intersection Observer）的运用&lt;/li>
&lt;li>资源加载的错误处理&lt;/li>
&lt;li>内存泄漏预防机制&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>指令生命周期 &amp;gt; Intersection Observer API &amp;gt; 加载状态管理&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>自定义指令(Directives)适用于需要直接DOM操作的原子级逻辑封装。当某个功能需要：&lt;/p>
&lt;ol>
&lt;li>与元素生命周期强绑定（如插入/移除DOM时自动执行）&lt;/li>
&lt;li>跨组件复用的基础行为&lt;/li>
&lt;li>对原生DOM进行增强式操作&lt;/li>
&lt;/ol>
&lt;p>相比组件封装，指令更擅长处理&lt;strong>与组件状态无关的DOM操作&lt;/strong>。组件更适合封装具有UI结构、样式和交互逻辑的完整功能模块。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>滥用指令处理业务逻辑（应保持指令功能原子化）&lt;/li>
&lt;li>未及时销毁观察器导致内存泄漏&lt;/li>
&lt;li>未处理网络请求异常情况&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>典型应用场景&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>DOM操作增强&lt;/strong>（如自动聚焦、滚动加载）：指令可直接访问原生DOM元素，无需组件模板结构&lt;/li>
&lt;li>&lt;strong>权限控制&lt;/strong>（如v-permission）：通过装饰器模式快速控制元素可见性，避免模板中条件判断污染&lt;/li>
&lt;li>&lt;strong>输入限制&lt;/strong>（如自动格式化）：需要实时操作输入元素的场景更符合指令的响应式特性&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>图片懒加载实现思路&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="9e97cf7" class="language-javascript ">
 &lt;code>// 注册指令
Vue.directive(&amp;#39;lazyload&amp;#39;, {
 inserted: (el, binding) =&amp;gt; {
 const observer = new IntersectionObserver((entries) =&amp;gt; {
 entries.forEach(entry =&amp;gt; {
 if (entry.isIntersecting) {
 // 替换真实图片地址
 const img = new Image()
 img.src = binding.value
 img.onload = () =&amp;gt; el.src = binding.value
 img.onerror = () =&amp;gt; el.classList.add(&amp;#39;error-fallback&amp;#39;)
 observer.unobserve(el) // 加载后解除观察
 }
 })
 }, { threshold: 0.01 })
 
 observer.observe(el)
 
 // 存储观察器实例以供卸载
 el._observer = observer
 },
 unbind: (el) =&amp;gt; {
 el._observer?.disconnect()
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>优化点&lt;/strong>：&lt;/p></description></item><item><title>Teleport组件的DOM传送场景</title><link>https://fe-interview.pangcy.cn/docs/framework/vue3/vue3-13/</link><pubDate>Tue, 04 Mar 2025 07:00:31 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue3/vue3-13/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>Vue框架特性理解（Teleport组件机制）&lt;/li>
&lt;li>CSS层叠上下文原理&lt;/li>
&lt;li>DOM渲染层级控制实战经验&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Teleport组件如何解决样式隔离问题&lt;/li>
&lt;li>堆叠上下文（Stacking Context）的形成与影响&lt;/li>
&lt;li>CSS选择器在动态DOM环境中的可靠性&lt;/li>
&lt;li>多层级组件间的z-index管理策略&lt;/li>
&lt;li>响应式系统与DOM操作执行的时序问题&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>堆叠上下文规则&lt;/strong> &amp;gt; &lt;strong>Teleport渲染机制&lt;/strong> &amp;gt; &lt;strong>CSS选择器穿透性&lt;/strong>&lt;/li>
&lt;li>&lt;strong>z-index生效条件&lt;/strong>：元素须处于同一堆叠上下文才可比较层级&lt;/li>
&lt;li>&lt;strong>目标容器稳定性&lt;/strong>：确保CSS选择器定位的DOM节点存在且稳定&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>当使用&lt;code>&amp;lt;Teleport to=&amp;quot;body&amp;quot;&amp;gt;&lt;/code>传送模态框时，组件将被渲染到&lt;code>&amp;lt;body&amp;gt;&lt;/code>末尾，脱离原组件树的渲染上下文。此时模态框的z-index直接与&lt;code>&amp;lt;body&amp;gt;&lt;/code>子节点比较，避免被父组件的低层级上下文覆盖。浏览器渲染时，&lt;strong>后出现的DOM节点默认层级更高&lt;/strong>，但需确保模态框的z-index值足够大（推荐2000+）以覆盖页面其他元素。&lt;/p>
&lt;p>&lt;strong>常见误区&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>错误认为提高z-index即可解决所有层级问题，忽视堆叠上下文隔离&lt;/li>
&lt;li>使用非稳定选择器（如&lt;code>.class&lt;/code>）可能导致目标容器意外变更&lt;/li>
&lt;li>未处理SSR场景下客户端注水时的DOM一致性&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>避免z-index问题&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>将模态框传送至&lt;code>&amp;lt;body&amp;gt;&lt;/code>末尾，脱离父级堆叠上下文&lt;/li>
&lt;li>设置模态框z-index为2000以上（超越常规元素）&lt;/li>
&lt;li>确保目标容器（如&lt;code>&amp;lt;body&amp;gt;&lt;/code>）未创建新的堆叠上下文（避免使用transform/opacity）&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>to属性注意事项&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>选择器应指向&lt;strong>稳定存在的DOM节点&lt;/strong>（推荐ID选择器）&lt;/li>
&lt;li>避免使用动态类名或复杂选择器，防止匹配元素变更&lt;/li>
&lt;li>服务端渲染时需确保客户端注水后目标节点存在&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="b23aee1" class="language-javascript ">
 &lt;code>// 安全使用Teleport的示例
&amp;lt;template&amp;gt;
 &amp;lt;Teleport to=&amp;#34;#modal-root&amp;#34;&amp;gt;
 &amp;lt;div class=&amp;#34;modal&amp;#34; :style=&amp;#34;{ zIndex: 2001 }&amp;#34;&amp;gt;
 &amp;lt;!-- 模态内容 --&amp;gt;
 &amp;lt;/div&amp;gt;
 &amp;lt;/Teleport&amp;gt;
&amp;lt;/template&amp;gt;

// 在public/index.html提前放置锚点
&amp;lt;body&amp;gt;
 &amp;lt;div id=&amp;#34;app&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;
 &amp;lt;div id=&amp;#34;modal-root&amp;#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- 专用容器 --&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>优化建议&lt;/strong>：&lt;/p></description></item><item><title>受控与非受控组件区别</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-09/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-09/</guid><description>&lt;h2 id="二考察点分析">二、考察点分析 &lt;a href="#%e4%ba%8c%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>React框架机制理解&lt;/strong>：检验对React数据流控制方式的掌握程度&lt;/li>
&lt;li>&lt;strong>组件设计能力&lt;/strong>：评估表单场景下的技术选型判断力&lt;/li>
&lt;li>&lt;strong>DOM操作认知&lt;/strong>：区分声明式编程与命令式编程的差异&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>数据绑定方式（单向vs双向）&lt;/li>
&lt;li>状态同步机制（主动更新vs被动获取）&lt;/li>
&lt;li>性能优化取舍（重渲染代价vsDOM操作消耗）&lt;/li>
&lt;li>表单验证实现路径（实时校验vs提交时校验）&lt;/li>
&lt;li>非受控组件Refs使用规范&lt;/li>
&lt;/ul>
&lt;h2 id="三技术解析">三、技术解析 &lt;a href="#%e4%b8%89%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>数据控制权 &amp;gt; 2. 更新时机 &amp;gt; 3. 访问方式&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>受控组件&lt;/strong>通过React state实现数据绑定，形成单向数据流。输入框的&lt;code>value&lt;/code>属性完全由React控制，通过&lt;code>onChange&lt;/code>事件更新state，触发组件重渲染。这种模式符合React声明式编程范式，保证组件状态与UI的强一致性。&lt;/p>
&lt;p>&lt;strong>非受控组件&lt;/strong>则将数据存储在DOM元素自身，通过&lt;code>ref&lt;/code>直接访问DOM节点值。使用&lt;code>defaultValue&lt;/code>设置初始值，表单数据仅在提交时通过DOM API获取。这种方式更接近传统HTML表单行为，适合集成非React代码。&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="464b1a7" class="language-javascript ">
 &lt;code>// 受控组件实现
function ControlledForm() {
 const [value, setValue] = useState(&amp;#39;&amp;#39;);
 
 return &amp;lt;input 
 value={value} 
 onChange={(e) =&amp;gt; setValue(e.target.value)}
 /&amp;gt;;
}

// 非受控组件实现
function UncontrolledForm() {
 const inputRef = useRef(null);
 
 const handleSubmit = () =&amp;gt; {
 console.log(inputRef.current.value);
 };

 return &amp;lt;input 
 defaultValue=&amp;#34;&amp;#34; 
 ref={inputRef} 
 /&amp;gt;;
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆&lt;code>defaultValue&lt;/code>与&lt;code>value&lt;/code>的用途&lt;/li>
&lt;li>在受控组件中使用&lt;code>ref.value&lt;/code>直接修改DOM&lt;/li>
&lt;li>高频输入场景未做防抖导致性能问题&lt;/li>
&lt;/ol>
&lt;h2 id="四问题解答">四、问题解答 &lt;a href="#%e5%9b%9b%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>核心区别在于数据控制权归属：&lt;/p></description></item><item><title>React Portal应用场景</title><link>https://fe-interview.pangcy.cn/docs/framework/react/react-22/</link><pubDate>Wed, 05 Mar 2025 12:28:17 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/react/react-22/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题目主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>React高级特性掌握&lt;/strong>：评估对Portal机制的理解程度，判断是否了解其设计初衷&lt;/li>
&lt;li>&lt;strong>DOM操作原理认知&lt;/strong>：考察对虚拟DOM与实际DOM关系的理解，特别是组件渲染位置控制&lt;/li>
&lt;li>&lt;strong>样式层叠问题处理&lt;/strong>：检验对CSS层叠上下文、z-index冲突等实际问题的解决方案&lt;/li>
&lt;li>&lt;strong>组件通信机制理解&lt;/strong>：验证对React事件冒泡机制在Portal场景中的特殊表现认知&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点包括：&lt;/p>
&lt;ul>
&lt;li>Portal解决样式隔离问题的原理&lt;/li>
&lt;li>createPortal的API使用规范&lt;/li>
&lt;li>Portal组件在React树中的上下文保持特性&lt;/li>
&lt;li>事件冒泡与实际DOM结构的解耦机制&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>DOM渲染隔离&lt;/strong> &amp;gt; &lt;strong>虚拟DOM位置&lt;/strong> &amp;gt; &lt;strong>合成事件系统&lt;/strong>&lt;/li>
&lt;li>&lt;strong>createPortal参数结构&lt;/strong>：ReactElement + DOM节点容器&lt;/li>
&lt;li>&lt;strong>组件生命周期管理&lt;/strong>：Portal节点的挂载/卸载时机&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Portal通过将React元素渲染到任意DOM节点，实现视觉层与逻辑层的解耦。其核心机制包括：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>双树结构&lt;/strong>：虚拟DOM树保持原有父子关系，实际DOM可独立渲染&lt;/li>
&lt;li>&lt;strong>事件代理&lt;/strong>：React使用事件委托机制，Portal内事件仍能冒泡到父组件&lt;/li>
&lt;li>&lt;strong>上下文穿透&lt;/strong>：Portal组件可访问创建时的React上下文（如Redux store）&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="6d02548" class="language-javascript ">
 &lt;code>// 类比：Portal类似机场VIP通道，物理空间（DOM结构）独立，
// 但服务标准（React上下文）仍按原舱等（组件层级）执行&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为Portal会丢失React上下文&lt;/li>
&lt;li>混淆实际DOM位置与事件冒泡路径&lt;/li>
&lt;li>遗漏Portal容器的生命周期管理&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>React Portal的核心价值在于解决组件物理渲染位置与逻辑层级解耦问题。典型场景包括：&lt;/p>
&lt;ol>
&lt;li>模态对话框需要突破父容器overflow:hidden限制&lt;/li>
&lt;li>全局通知提示需脱离当前布局上下文&lt;/li>
&lt;li>解决多个组件层级间的z-index战争问题&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="362b269" class="language-javascript ">
 &lt;code>import { createPortal } from &amp;#39;react-dom&amp;#39;;

const Modal = ({ children }) =&amp;gt; {
 const el = useMemo(() =&amp;gt; document.createElement(&amp;#39;div&amp;#39;), []);
 
 useEffect(() =&amp;gt; {
 document.body.appendChild(el);
 return () =&amp;gt; document.body.removeChild(el);
 }, [el]);

 return createPortal(
 &amp;lt;div className=&amp;#34;modal&amp;#34;&amp;gt;{children}&amp;lt;/div&amp;gt;,
 el
 );
};


// 使用示例
&amp;lt;App&amp;gt;
 &amp;lt;Modal&amp;gt; {/* 实际渲染到body末尾 */}
 &amp;lt;Content /&amp;gt;
 &amp;lt;/Modal&amp;gt;
&amp;lt;/App&amp;gt;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>与普通子组件的差异：&lt;/p></description></item><item><title>重排与重绘的优化策略</title><link>https://fe-interview.pangcy.cn/docs/network/network-03/</link><pubDate>Tue, 04 Mar 2025 09:31:00 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/network/network-03/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题目主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>浏览器渲染机制理解&lt;/strong>：考核对渲染流水线（Rendering Pipeline）各阶段（Layout、Paint、Composite）的掌握程度&lt;/li>
&lt;li>&lt;strong>性能优化意识&lt;/strong>：评估对关键渲染路径优化的实战经验及解决方案储备&lt;/li>
&lt;li>&lt;strong>DOM操作原理认知&lt;/strong>：检验对API调用与渲染引擎交互机制的了解&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>触发重排的CSS属性与DOM操作类型识别&lt;/li>
&lt;li>重绘与重排的本质区别及性能影响&lt;/li>
&lt;li>浏览器渲染队列合并机制及强制刷新条件&lt;/li>
&lt;li>现代框架虚拟DOM的优化原理映射&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>渲染队列合并 &amp;gt; 几何属性修改 &amp;gt; 合成层优化&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>浏览器采用增量式布局计算，将连续的重排请求存入队列（类似快递批量发货）。但当访问&lt;code>offsetTop&lt;/code>、&lt;code>scrollHeight&lt;/code>等布局属性时（相当于查询快递单号），会强制立即执行队列任务以保证数据准确性。&lt;/p>
&lt;p>重排触发条件（布局变更）：&lt;/p>
&lt;ul>
&lt;li>修改几何属性（width/height/margin）&lt;/li>
&lt;li>增删可见DOM元素&lt;/li>
&lt;li>窗口resize/字体加载&lt;/li>
&lt;li>获取布局属性值（触发强制同步布局）&lt;/li>
&lt;/ul>
&lt;p>仅重绘场景（样式变更）：&lt;/p>
&lt;ul>
&lt;li>color/background-color等外观属性变化&lt;/li>
&lt;li>visibility/radient变化（不改变布局）&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误将&lt;code>transform&lt;/code>归为重排操作（实际触发合成层重组）&lt;/li>
&lt;li>认为&lt;code>display: none&lt;/code>元素修改不会触发重排（隐藏元素修改后显示仍会导致布局变化）&lt;/li>
&lt;li>忽略&lt;code>getComputedStyle&lt;/code>等API的布局副作用&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>重排由几何属性变更触发（如修改宽高、偏移量），重绘仅影响外观属性（如颜色）。优化方案：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>批量DOM更新&lt;/strong>：使用&lt;code>document.createDocumentFragment&lt;/code>合并多次操作&lt;/li>
&lt;li>&lt;strong>离线处理&lt;/strong>：先&lt;code>display:none&lt;/code>修改元素再恢复显示&lt;/li>
&lt;li>&lt;strong>避免强制布局抖动&lt;/strong>：分离读写操作，避免修改后立即查询布局属性&lt;/li>
&lt;/ol>
&lt;p>浏览器通过渲染队列合并连续重排，但同步布局API会强制刷新队列。例如连续修改&lt;code>width&lt;/code>后立即获取&lt;code>offsetWidth&lt;/code>，将导致多次重排。&lt;/p>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="3426ad0" class="language-javascript ">
 &lt;code>// 批量DOM操作示例
const fragment = document.createDocumentFragment();
const list = document.getElementById(&amp;#39;list&amp;#39;);

// 创建10个节点（时间复杂度O(n)）
for(let i=0;i&amp;lt;10;i&amp;#43;&amp;#43;){
 const li = document.createElement(&amp;#39;li&amp;#39;);
 li.textContent = `Item ${i}`;
 fragment.appendChild(li); // 内存操作避免多次重排
}

list.appendChild(fragment); // 单次重排

// 读写分离示例（错误 vs 正确）
// 错误写法：触发多次重排
for(let i=0;i&amp;lt;boxes.length;i&amp;#43;&amp;#43;){
 boxes[i].style.width = boxes[i].offsetWidth &amp;#43; 10 &amp;#43; &amp;#39;px&amp;#39;;
}

// 正确写法：批量读取后统一写入
const widths = boxes.map(box =&amp;gt; box.offsetWidth);
boxes.forEach((box, i) =&amp;gt; {
 box.style.width = widths[i] &amp;#43; 10 &amp;#43; &amp;#39;px&amp;#39;;
});&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>复杂度优化&lt;/strong>：批量操作将n次重排降为1次，时间复杂度从O(n)优化至O(1)&lt;/p></description></item></channel></rss>