1.性能提升
1.1.響應式系統的改進:
從 Object.defineProperty
到 Proxy
Vue2:Vue 2 的響應式系統基于 Object.defineProperty
,它為每個屬性單獨設置 getter 和 setter。雖然能夠滿足基本需求,但它在以下方面存在性能瓶頸:
- Vue2 中數組監聽的局限性:Vue2 通過
Object.defineProperty
實現響應式,這種方式無法監聽數組索引的變化 - push()、pop()、shift()、unshift()、splice()、sort()、reverse(),這些是Vue2 對數組的 7 個方法進行了重寫,使其能觸發視圖更新,另外,Vue 提供了
Vue.set
(或this.$set
) 方法專門用于修改數組索引,以下是語法解釋+代碼演示加深理解:
push()
:在數組末尾添加元素
pop()
:刪除數組最后一個元素
shift()
:刪除數組第一個元素
unshift()
:在數組開頭添加元素
splice()
:靈活地刪除、添加或替換元素
sort()
:對數組進行排序
reverse()
:反轉數組元素順序
Code demonstration:(code可以保存在html文件直接運行查看演示效果)
<!DOCTYPE html>
<html>
<head><title>Vue2 數組更新方法全演示</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><style>body {font-family: Arial, sans-serif;padding: 20px;}.demo-container {max-width: 800px;margin: 0 auto;}.array-display {padding: 15px;background-color: #f0f7ff;border: 1px solid #bed6ff;border-radius: 4px;margin: 15px 0;}.button-group {margin: 10px 0;display: flex;flex-wrap: wrap;gap: 8px;}button {padding: 6px 12px;border: 1px solid #ccc;border-radius: 4px;cursor: pointer;background-color: #fff;}button:hover {background-color: #f5f5f5;}.special-method {background-color: #fff3cd;border-color: #ffeeba;}.non-reactive {background-color: #f8d7da;border-color: #f5c6cb;}.log-area {margin-top: 20px;padding: 10px;border: 1px solid #ddd;border-radius: 4px;height: 200px;overflow-y: auto;font-size: 14px;}</style>
</head>
<body><div class="demo-container" id="app"><h2>Vue2 數組更新方法演示</h2><div class="array-display"><strong>當前數組:</strong><span v-for="(item, index) in items" :key="index">{{ index }}: {{ item }}<span v-if="index !== items.length - 1">, </span></span></div><h3>1. Vue2 重寫的7個數組方法(自動觸發更新)</h3><div class="button-group"><button @click="handlePush">push('新元素')</button><button @click="handlePop">pop()</button><button @click="handleShift">shift()</button><button @click="handleUnshift">unshift('首元素')</button><button @click="handleSplice">splice(替換元素)</button><button @click="handleSort">sort()</button><button @click="handleReverse">reverse()</button></div><h3>2. 特殊更新方法(解決響應式限制)</h3><div class="button-group"><button class="special-method" @click="handleSet">this.$set(修改索引)</button><button class="special-method" @click="handleDestruct">解構賦值(強制更新)</button><button class="non-reactive" @click="handleDirectModify">直接修改索引(不生效)</button></div><div class="log-area"><strong>操作日志:</strong><div v-for="(log, i) in logs" :key="i" style="margin: 4px 0;">{{