<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Vue API on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/vue-api/</link><description>Recent content in Vue API 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/vue-api/index.xml" rel="self" type="application/rss+xml"/><item><title>Vue 如何解决对象新增属性不触发视图更新的问题？</title><link>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-02/</link><pubDate>Tue, 04 Mar 2025 07:00:27 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-02/</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>：Vue数据绑定的底层实现机制&lt;/li>
&lt;li>&lt;strong>框架特性掌握&lt;/strong>：对Vue响应式系统局限性的认知&lt;/li>
&lt;li>&lt;strong>问题解决能力&lt;/strong>：动态属性更新的场景处理方案&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>&lt;code>Object.defineProperty&lt;/code>的监听局限性&lt;/li>
&lt;li>&lt;code>Vue.set&lt;/code>/&lt;code>$set&lt;/code>的实现机制&lt;/li>
&lt;li>对象引用替换的更新原理&lt;/li>
&lt;li>Vue 2.x 与 3.x 响应式方案差异&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; &lt;code>Object.defineProperty&lt;/code> 限制 &amp;gt; &lt;code>Vue.set&lt;/code>原理 &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 2.x 使用 &lt;code>Object.defineProperty&lt;/code> 实现响应式，其局限性在于：&lt;/p>
&lt;ol>
&lt;li>初始化时递归转换属性 &lt;code>getter&lt;/code>/&lt;code>setter&lt;/code>&lt;/li>
&lt;li>无法检测属性新增/删除（对象属性变更检测阈值为±1ms）&lt;/li>
&lt;li>数组变异方法&lt;code>hack&lt;/code>处理&lt;/li>
&lt;/ol>
&lt;p>动态添加属性未触发更新的根本原因是新属性缺少 &lt;code>getter&lt;/code>/&lt;code>setter&lt;/code> 拦截器，导致依赖追踪失效。&lt;code>Vue.set&lt;/code>通过以下方式解决：&lt;/p>
&lt;ol>
&lt;li>向响应式对象添加新属性&lt;/li>
&lt;li>触发依赖通知（Dep.notify）&lt;/li>
&lt;li>子属性递归响应化&lt;/li>
&lt;/ol>
&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>push&lt;/code>/&lt;code>pop&lt;/code>等可以直接触发更新（需使用变异方法）&lt;/li>
&lt;li>混淆&lt;code>Vue.set&lt;/code>和直接赋值的区别&lt;/li>
&lt;li>误用&lt;code>delete&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;strong>原因&lt;/strong>：Vue 2.x 基于 &lt;code>Object.defineProperty&lt;/code>的响应式系统在初始化时创建&lt;code>getter&lt;/code>/&lt;code>setter&lt;/code>，动态添加的属性缺乏拦截机制导致变更无法触发视图更新。&lt;/p>
&lt;p>&lt;strong>解决方案&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Vue.set / $set&lt;/strong>&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="9739d55" class="language-javascript ">
 &lt;code>Vue.set(vm.obj, &amp;#39;newProp&amp;#39;, value)
// 或
this.$set(this.obj, &amp;#39;newProp&amp;#39;, value)&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>原理：&lt;/strong> 向响应式对象添加属性并触发依赖更新&lt;/p></description></item></channel></rss>