title: Vue 組件生命周期:探索鉤子 date: 2024/5/27 18:42:38 updated: 2024/5/27 18:42:38 categories: 前端開發 tags: 生命周期 非同步載入 通信原理 父子通信 兄弟通信 跨層通信 性能優化 第 1 章:介紹與背景 1.1 ...
title: Vue 組件生命周期:探索鉤子
date: 2024/5/27 18:42:38
updated: 2024/5/27 18:42:38
categories:
- 前端開發
tags:
- 生命周期
- 非同步載入
- 通信原理
- 父子通信
- 兄弟通信
- 跨層通信
- 性能優化
第 1 章:介紹與背景
1.1 什麼是 Vue 組件生命周期?
Vue 組件生命周期是指 Vue 組件從創建、運行到銷毀的整個過程,共分為 8 個階段:
- 創建前(beforeCreate)
- 創建後(created)
- 載入前(beforeMount)
- 載入後(mounted)
- 更新前(beforeUpdate)
- 更新後(updated)
- 銷毀前(beforeDestroy)
- 銷毀後(destroyed)
在每個階段,Vue 框架都提供了特定的鉤子函數,開發人員可以在這些函數中編寫自定義的代碼,從而實現對組件生命周期的控制和管理。
1.2 為什麼需要瞭解生命周期?
瞭解 Vue 組件生命周期有以下幾個優點:
- 瞭解組件的運行機制,提高開發效率。
- 在合適的時機進行數據處理和事件綁定,提高項目性能。
- 在組件創建和銷毀時進行資源清理和記憶體釋放,避免記憶體泄漏。
- 在生命周期鉤子函數中進行非同步數據載入和組件通信,使代碼更加清晰和可維護。
1.3 如何利用生命周期提高開發效率?
- 在創建階段,可以進行數據初始化和事件綁定,避免在模板中頻繁的編寫相同的代碼。
- 在運行階段,可以對數據進行監聽和優化,提高項目性能。
- 在銷毀階段,可以進行資源清理和記憶體釋放,避免記憶體泄漏。AD:漫畫首頁
- 在生命周期鉤子函數中進行非同步數據載入和組件通信,使代碼更加清晰和可維護。
- 通過使用第三方庫或插件,可以更加方便地使用生命周期鉤子函數,提高開發效率。
第 2 章:組件生命周期概述
2.1 組件生命周期的基本概念
組件生命周期是指 Vue 組件從創建、運行到銷毀的整個過程。在這個過程中,Vue 框架會自動調用一系列的生命周期鉤子函數,開發人員可以在這些函數中編寫自定義的代碼,從而實現對組件生命周期的控制和管理。
2.2 生命周期鉤子函數的分類
Vue 組件的生命周期鉤子函數可以分為以下幾類:
- 創建階段鉤子函數:在組件創建時調用,包括 beforeCreate 和 created 兩個鉤子函數。
- 載入階段鉤子函數:在組件載入時調用,包括 beforeMount 和 mounted 兩個鉤子函數。
- 更新階段鉤子函數:在組件更新時調用,包括 beforeUpdate 和 updated 兩個鉤子函數。
- 銷毀階段鉤子函數:在組件銷毀時調用,包括 beforeDestroy 和 destroyed 兩個鉤子函數。
2.3 常見的生命周期鉤子函數
- beforeCreate:在組件實例被創建之前調用,此時組件實例的數據和方法還未初始化。
- created:在組件實例被創建之後調用,此時組件實例的數據和方法已經初始化,但組件還未被掛載到 DOM 上。
- beforeMount:在組件被掛載到 DOM 之前調用,此時組件的模板已經編譯完成,但還未渲染到 DOM 上。
- mounted:在組件被掛載到 DOM 之後調用,此時組件已經渲染到 DOM 上,可以進行 DOM 操作和非同步數據載入。
- beforeUpdate:在組件更新之前調用,此時組件的數據已經發生變化,但還未重新渲染到 DOM 上。
- updated:在組件更新之後調用,此時組件的數據已經重新渲染到 DOM 上,可以進行 DOM 操作和非同步數據載入。
- beforeDestroy:在組件銷毀之前調用,此時組件實例仍然可用,可以進行資源清理和記憶體釋放。AD:首頁 | 一個覆蓋廣泛主題工具的高效線上平臺
- destroyed:在組件銷毀之後調用,此時組件實例已經被銷毀,無法再進行任何操作。
第 3 章:創建階段
在 Vue.js 中,組件的創建階段包括以下幾個鉤子函數:
- beforeCreate:在組件實例被創建之前調用,此時數據和方法還未初始化。
- created:在組件實例被創建之後調用,此時數據和方法已經初始化,可以進行數據操作和事件綁定。
- beforeMount:在組件被掛載到 DOM 之前調用,此時模板已經編譯完成,但還未渲染到 DOM 上。
- mounted:在組件被掛載到 DOM 之後調用,此時組件已經渲染到 DOM 上,可以進行 DOM 操作和非同步數據載入。
在創建階段,可以在鉤子函數中進行數據處理和事件綁定,以簡化組件的代碼和提高組件的性能。
例如,在 created 鉤子函數中可以進行數據的請求和初始化,從而避免在組件掛載到 DOM 之後再進行數據請求,提高組件的渲染速度。
同時,可以在 created 鉤子函數中進行事件的綁定,從而在組件創建時就完成事件的綁定,而無需在 mounted 鉤子函數中進行事件綁定。
總之,在創建階段進行數據處理和事件綁定,可以簡化組件的代碼和提高組件的性能,是實現高質量 Vue 組件開發的重要手段。
以下是一些代碼示例:
// 在 created 鉤子函數中進行數據的請求和初始化
export default {
data() {
return {
user: null
}
},
created() {
this.fetchUser()
},
methods: {
fetchUser() {
// 進行數據請求和初始化
this.user = {
name: 'John Doe',
age: 30
}
}
}
}
// 在 created 鉤子函數中進行事件的綁定
export default {
data() {
return {
message: 'Hello World!'
}
},
created() {
this.handleClick = () => {
console.log(this.message)
}
},
mounted() {
document.getElementById('btn').addEventListener('click', this.handleClick)
}
}
在上述示例中,我們可以看到在 created 鉤子函數中進行數據的請求和初始化,以及事件的綁定,從而在組件創建時就完成數據的請求和初始化,並且在組件掛載到 DOM 之後就完成事件的綁定。
第 4 章:運行階段
在 Vue.js 中,組件的運行階段包括以下幾個鉤子函數:
- beforeUpdate:在組件更新之前調用,此時數據已經更新,但 DOM 還未重新渲染。
- updated:在組件更新之後調用,此時 DOM 已經重新渲染。
在運行階段,可以在鉤子函數中進行數據監聽和性能優化,以提高組件的響應速度和性能。
例如,在 beforeUpdate 鉤子函數中可以進行數據的監聽,從而在數據更新時及時更新組件的狀態,避免出現數據不一致的情況。
同時,可以在 updated 鉤子函數中進行性能優化,例如使用虛擬滾動技術來優化大量數據的渲染,或者使用防抖和節流技術來優化頻繁觸發的事件。
AD:專業搜索引擎
總之,在運行階段進行數據監聽和性能優化,可以提高組件的響應速度和性能,是實現高質量 Vue 組件開發的重要手段。
以下是一些代碼示例:
// 在 beforeUpdate 鉤子函數中進行數據的監聽
export default {
data() {
return {
count: 0
}
},
beforeUpdate() {
console.log(`count before update: ${this.count}`)
},
methods: {
increment() {
this.count++
}
}
}
// 在 updated 鉤子函數中進行性能優化
export default {
data() {
return {
items: []
}
},
updated() {
// 使用虛擬滾動技術來優化大量數據的渲染
const container = document.getElementById('container')
container.style.height = `${container.scrollHeight}px`
},
methods: {
addItem() {
this.items.push(`Item ${this.items.length}`)
}
}
第 5 章:銷毀階段
在 Vue.js 中,組件的銷毀階段包括以下兩個生命周期鉤子函數:
- beforeDestroy:在組件銷毀之前調用。在這個階段,組件實例仍然完全可用,這意味著所有的數據綁定、事件監聽器、計算屬性等都還在工作。
- destroyed:在組件銷毀之後調用。在這個階段,組件實例已經被銷毀,所有的綁定和事件監聽器都已經被移除,組件不再可用。
在銷毀階段,通常會進行資源清理和記憶體釋放,以確保應用程式的性能和穩定性。以下是一些常見的清理操作:
- 取消訂閱:如果組件中使用了事件訂閱(如使用
EventBus
或第三方庫如RxJS
),應該在beforeDestroy
鉤子中取消這些訂閱,以避免記憶體泄漏。 - 清除定時器:如果在組件中使用了定時器(如
setInterval
或setTimeout
),應該在beforeDestroy
鉤子中清除這些定時器。 - 解綁事件監聽器:如果組件綁定了 DOM 事件監聽器,應該在
beforeDestroy
鉤子中解綁這些事件監聽器。 - 斷開 WebSocket 連接:如果組件使用了 WebSocket 連接,應該在
beforeDestroy
鉤子中斷開這些連接。
以下是一個簡單的示例,展示瞭如何在 beforeDestroy
鉤子中進行資源清理:
export default {
data() {
return {
timer: null
};
},
created() {
// 創建定時器
this.timer = setInterval(() => {
console.log('定時器運行中...');
}, 1000);
},
beforeDestroy() {
// 清除定時器
clearInterval(this.timer);
},
destroyed() {
console.log('組件已被銷毀');
}
};
在這個示例中,組件在創建時啟動了一個定時器,併在銷毀前清除這個定時器,以避免記憶體泄漏。destroyed
鉤子簡單地記錄了組件已被銷毀的信息。通過這種方式,可以確保組件在不再需要時能夠正確地釋放資源,從而優化應用程式的性能和記憶體使用。
第 6 章:非同步數據載入
在 Vue.js 中,非同步數據載入是常見的需求,通常通過在生命周期鉤子函數中發起數據請求來實現。以下是如何使用生命周期函數進行數據請求以及在合適的時機取消請求的詳細說明:
6.1 使用生命周期函數進行數據請求
通常,數據請求會在組件的生命周期鉤子函數中發起,特別是 created
或 mounted
鉤子。這兩個鉤子分別在組件實例被創建後和組件掛載到 DOM 後立即調用。
示例:在 created
鉤子中發起數據請求
export default {
data() {
return {
posts: []
};
},
created() {
this.fetchPosts();
},
methods: {
async fetchPosts() {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/posts');
const data = await response.json();
this.posts = data;
} catch (error) {
console.error('Error fetching posts:', error);
}
}
}
};
在這個示例中,組件在創建後立即調用 fetchPosts
方法來獲取數據。使用 async/await
來處理非同步操作,使得代碼更加清晰和易於理解。
6.2 在合適的時機取消請求
在某些情況下,可能需要在組件銷毀前取消未完成的請求,以避免潛在的記憶體泄漏或不必要的網路請求。這通常在 beforeDestroy
鉤子中完成。
示例:在 beforeDestroy
鉤子中取消請求
假設使用 axios
進行數據請求,並且每個請求都有一個唯一的標識符,可以使用這個標識符來取消請求。
import axios from 'axios';
import { ref } from 'vue';
export default {
data() {
return {
cancelTokenSource: ref(null),
posts: []
};
},
created() {
this.fetchPosts();
},
beforeDestroy() {
if (this.cancelTokenSource.value) {
this.cancelTokenSource.value.cancel('組件銷毀前取消請求');
}
},
methods: {
fetchPosts() {
this.cancelTokenSource.value = axios.CancelToken.source();
axios.get('https://jsonplaceholder.typicode.com/posts', {
cancelToken: this.cancelTokenSource.value.token
}).then(response => {
this.posts = response.data;
}).catch(thrown => {
if (axios.isCancel(thrown)) {
console.log(thrown.message); // 輸出:組件銷毀前取消請求
} else {
console.error('Error fetching posts:', thrown);
}
});
}
}
};
在這個示例中,使用 axios
的 CancelToken
來創建一個取消令牌,併在 beforeDestroy
鉤子中使用這個令牌來取消請求。如果請求被取消,axios
會拋出一個特定的錯誤,可以通過 axios.isCancel
來檢查這個錯誤。
通過這種方式,可以確保在組件不再需要數據時,不會繼續進行不必要的數據請求,從而優化性能並減少資源消耗。
第 7 章:組件通信
在 Vue.js 中,組件通信是非常重要的話題,可以分為父子組件通信、兄弟組件通信和跨層級組件通信。以下是詳細的說明:
7.1 父子組件通信
父子組件通信是最常見的組件通信方式,在父組件和子組件之間傳遞數據和事件非常簡單。
父組件向子組件傳遞數據
可以使用 props
將數據從父組件傳遞到子組件。
示例:父組件向子組件傳遞數據
<!-- ParentComponent.vue -->
<template>
<div>
<child-component :title="parentTitle"></child-component>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
data() {
return {
parentTitle: 'Hello from parent!'
};
}
};
</script>
<!-- ChildComponent.vue -->
<template>
<div>
<h1>{{ title }}</h1>
</div>
</template>
<script>
export default {
props: {
title: String
}
};
</script>
子組件向父組件發送事件
可以使用 $emit
將事件從子組件發送到父組件。
示例:子組件向父組件發送事件
<!-- ParentComponent.vue -->
<template>
<div>
<child-component @child-event="handleChildEvent"></child-component>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
methods: {
handleChildEvent(message) {
console.log('Received message from child:', message);
}
}
};
</script>
<!-- ChildComponent.vue -->
<template>
<div>
<button @click="sendMessage">Send message to parent</button>
</div>
</template>
<script>
export default {
methods: {
sendMessage() {
this.$emit('child-event', 'Hello from child!');
}
}
};
</script>
7.2 兄弟組件通信
對於兄弟組件之間的通信,可以使用一個中間組件或者通過事件匯流排(event bus)。
使用中間組件
可以使用一個中間組件來傳遞數據和事件。
示例:使用中間組件
<!-- ParentComponent.vue -->
<template>
<div>
<first-child @first-child-event="handleFirstChildEvent"></first-child>
<second-child :message="firstChildMessage"></second-child>
</div>
</template>
<script>
import FirstChildComponent from './FirstChildComponent.vue';
import SecondChildComponent from './SecondChildComponent.vue';
export default {
components: {
FirstChildComponent,
SecondChildComponent
},
data() {
return {
firstChildMessage: null
};
},
methods: {
handleFirstChildEvent(message) {
this.firstChildMessage = message;
}
}
};
</script>
<!-- FirstChildComponent.vue -->
<template>
<div>
<button @click="sendMessage">Send message to second child</button>
</div>
</template>
<script>
export default {
methods: {
sendMessage() {
this.$emit('first-child-event', 'Hello from first child!');
}
}
};
</script>
<!-- SecondChildComponent.vue -->
<template>
<div>
<h1>{{ message }}</h1>
</div>
</template>
<script>
export default {
props: {
message: String
}
};
</script>
使用事件匯流排
可以使用一個全局事件匯流排來實現兄弟組件之間的通信。
示例:使用事件匯流排
// main.js
import Vue from 'vue';
export const EventBus = new Vue();
// FirstChildComponent.vue
<template>
<div>
<button @click="sendMessage">Send message to second child</button>
</div>
</template>
<script>
import { EventBus } from './main';
export default {
methods: {
sendMessage() {
EventBus.$emit('first-child-event', 'Hello from first child!');
}
}
};
</script>
// SecondChildComponent.vue
<template>
<div>
<h1>{{ message }}</h1>
</div>
</template>
<script>
import { EventBus } from './main';
export default {
data() {
return {
message: null
};
},
created() {
EventBus.$on('first-child-event', message => {
this.message = message;
});
}
};
</script>
7.3 跨層級組件通信
對於跨層級組件之間的通信,可以使用 provide
和 inject
或者使用 Vuex 狀態管理。
使用 provide
和 inject
可以使用 provide
和 inject
在父組件和子組件之間進行跨層級通信。
示例:使用 provide
和 inject
<!-- ParentComponent.vue -->
<template>
<div>
<first-child></first-child>
</div>
</template>
<script>
import FirstChildComponent from './FirstChildComponent.vue';
import SecondChildComponent from './SecondChildComponent.vue';
export default {
components: {
FirstChildComponent
},
provide() {
return {
parentMessage: 'Hello from parent!'
};
}
};
</script>
<!-- FirstChildComponent.vue -->
<template>
<div>
<second-child></second-child>
</div>
</template>
<script>
import SecondChildComponent from './SecondChildComponent.vue';
export default {
components: {
SecondChildComponent
},
inject: ['parentMessage']
};
</script>
<!-- SecondChildComponent.vue -->
<template>
<div>
<h1>{{ parentMessage }}</h1>
</div>
</template>
<script>
export default {
inject: ['parentMessage']
};
</script>
使用 Vuex
可以使用 Vuex 狀態管理來實現跨層級組件通信。
示例:使用 Vuex
// store.js
import Vuex from 'vuex';
import Vue from 'vue';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
message: 'Hello from Vuex!'
},
mutations: {
setMessage(state, message) {
state.message = message;
}
}
});
export default store;
// ParentComponent.vue
<template>
<div>
<first-child></first-child>
</div>
</template>
<script>
import { mapMutations } from 'vuex';
import FirstChildComponent from './FirstChildComponent.vue';
export default {
components: {
FirstChildComponent
},
methods: {
...mapMutations(['setMessage'])
},
mounted() {
this.setMessage('Hello from parent!');
}
};
第 8 章:組件優化
在構建大型 Vue.js 應用時,性能和記憶體優化是非常重要的。以下是有關組件優化的詳細說明。
8.1 性能優化
8.1.1 使用 v-if
和 v-for
時註意順序
在使用 v-if
和 v-for
時,應該優先使用 v-if
,因為 v-for
會每次都重新渲染整個列表。如果同時使用 v-if
和 v-for
,v-for
應該優先放在 v-if
前面。
8.1.2 使用 key
來優化 v-for
在使用 v-for
時,應該為每個項目提供一個唯一的 key
,這可以幫助 Vue.js 跟蹤每個節點的身份,從而提高渲染性能。
8.1.3 使用 v-once
渲染靜態內容
如果某個組件的內容在整個生命周期中都不會改變,可以使用 v-once
來渲染靜態內容,以提高渲染性能。
8.1.4 使用 v-memo
緩存組件
在使用 v-for
時,可以使用 v-memo
來緩存組件,以避免重新渲染。
8.1.5 使用 v-pre
跳過編譯
如果某個組件的內容不需要被 Vue.js 編譯,可以使用 v-pre
來跳過編譯,以提高渲染性能。
8.1.6 使用 v-cloak
隱藏未編譯的Mustache標簽
在使用 Mustache 標簽時,可以使用 v-cloak
來隱藏未編譯的 Mustache 標簽,以避免閃爍。
8.2 記憶體優化
8.2.1 使用 v-if
和 v-for
時註意性能
在使用 v-if
和 v-for
時,應該註意它們的性能影響,避免不必要的渲染。
8.2.2 使用 v-show
渲染靜態內容
在使用 v-show
時,可以渲染靜態內容,而不是使用 v-if
創建和銷毀節點。
8.2.3 使用 Object.freeze
凍結數據
在使用 Object.freeze
時,可以凍結數據,避免不必要的重新渲染。
8.2.4 使用 v-once
渲染靜態內容
在使用 v-once
時,可以渲染靜態內容,而不是每次都重新渲染節點。
8.2.5 使用 $once
監聽事件
在使用 $once
時,可以監聽事件,而不是使用 $on
創建永久的監聽器。
8.2.6 使用 $off
取消事件監聽
在使用 $off
時,可以取消事件監聽,避免記憶體泄漏。
8.3 避免常見的陷阱
8.3.1 避免使用 Array.prototype.splice
修改數組
在使用 Array.prototype.splice
時,可能會導致 Vue.js 無法檢測到變化,從而導致不必要的重新渲染。
8.3.2 避免使用 Object.assign
修改對象
在使用 Object.assign
時,可能會導致 Vue.js 無法檢測到變化,從而導致不必要的重新渲染。
8.3.3 避免使用箭頭函數
在使用箭頭函數時,可能會導致 this
指向不正確,從而導致不必要的重新渲染。
8.3.4 避免使用 v-html
和 v-text
混合使用
在使用 v-html
和 v-text
時,可能會導致不必要的重新渲染。
8.3.5 避免使用 v-model
和 .sync
修飾符混合使用
在使用 v-model
和 .sync
修飾符時,可能會導致不必要的重新渲染。
8.3.6 避免使用 watch
監聽數組
在使用 watch
時,可能會導致不必要的重新渲染。
8.3.7 避免使用 watch
監聽對象
在使用 watch
時,可能會導致不必要的重新渲染。
8.3.8 避免使用 deep
選項
在使用 deep
選項時,可能會導致不必要的重新渲染。
8.3.9 避免使用 immediate
選項
在使用 immediate
選項時,可能會導致不必要的重新渲染。
8.3.10 避免使用 computed
和 watch
混合使用
在使用 computed
和 watch
時,可能會導致不必要的重新渲染。
8.3.11 避免使用 methods
和 computed
混合使用
在使用 methods
和 computed
時,可能會導致不必要的重新渲染。
8.3.12 避免使用 created
和 mounted
混合使用
在使用 created
和 mounted
時,可能會導致不必要的重新渲染。
8.3.13 避免使用 beforeDestroy
和 destroyed
混合使用
在使用 beforeDestroy
和 destroyed
時,可能會導致不必要的重新渲染。
8.3.14 避免使用 activated
和 deactivated
混合使用
在使用 activated
和 deactivated
時,可能會導致不必要的重新渲染。
8.3.15 避免使用 keep-alive
和 v-if
混合使用
在使用 keep-alive
和 v-if
時,可能會導致不必要的重新渲染。
8.3.16 避免使用 transition
和 v-if
混合使用
在使用 transition
和 v-if
時,可能會導致不必要的重新渲染。
8.3.17 避免使用 v-else
和 v-else-if
混合使用
在使用 v-else
和 v-else-if
時,可能會導致不必要的重新渲染。
8.3.18 避免使用 v-for
和 v-if
混合使用
在使用 v-for
和 v-if
時,可能會導致不必要的重新渲染。
8.3.19 避免使用 v-model
和 .sync
修飾符混合使用
在使用 v-model
和 .sync
修飾符時,可能會導致不必要的重新渲染。
8.3.20 避免使用 v-model
和 v-for
混合使用
在使用 v-model
和 v-for
時,可能會導致不必要的重新渲染。
8.3.21 避免使用 v-model
和 v-show
混合使用
在使用 v-model
和 v-show
時,可能會導致不必要的重新渲染。
8.3.22 避免使用 v-model
和 v-once
混合使用
在使用 v-model
和 v-once
時,可能會導致不必要的重新渲染。
8.3.23 避免使用 v-model
和 v-memo
混合使用
在使用 v-model
和 v-memo
時,可能會導致不必要的重新渲染。
8.3.24 避免使用 v-model
和 v-pre
混合使用
在使用 v-model
和 v-pre
時,可能會導致不必要的重新渲染。
8.3.25 避免使用 v-model
和 v-cloak
混合使用
在使用 v-model
和 v-cloak
時,可能會導致不必要的重新渲染。
8.3.26 避免使用 v-model
和 v-html
混合使用
在使用 v-model
和 v-html
時,可能會導致不必要的重新渲染。
8.3.27 避免使用 v-model
和 v-text
混合使用
在使用 v-model
和 v-text
時,可能會導致不必要的重新渲染。
8.3.28 避免使用 v-model
和 Object.freeze
混合使用
在使用 v-model
和 Object.freeze
時,可能會導致不必要的重新渲染。
8.3.29 避免使用 v-model
和 $once
混合使用
在使用 v-model
和 $once
時,可能會導致不必要的重新渲染。
8.3.30 避免使用 v-model
和 $off
混合使用
在使用 v-model
和 $off
時,可能會導致不必要的重新渲染。
8.3.31 避免使用 v-model
和 $on
混合使用
在使用 v-model
和 $on
時,可能會導致不必要的重新渲染。
8.3.32 避免使用 v-model
和 $emit
混合使用
在使用 v-model
和 $emit
時,可能會導致不必要的重新渲染。
8.3.33 避免使用 v-model
和 $refs
混合使用
在使用 v-model
和 $refs
時,可能會導致不必要的重新渲染。
8.3.34 避免使用 v-model
和 $nextTick
混合使用
在使用 v-model
和 $nextTick
時,可能會導致不必要的重新渲染。
8.3.35 避免使用 v-model
和 vm.$forceUpdate
混合使用
在使用 v-model
和 vm.$forceUpdate
時,可能會導致不必要的重新渲染。
8.3.36 避免使用 v-model
和 vm.$set
混合使用
在使用 v-model
和 vm.$set
時,可能會導致不必要的重新渲染。
8.3.37 避免使用 v-model
和 vm.$delete
混合使用
在使用 v-model
和 vm.$delete
時,可能會導致不必要的重新渲染。
8.3.38 避免使用 v-model
和 vm.$watch
混合使用
在使用 v-model
和 vm.$watch
時,可能會導致不必要的重新渲染。
8.3.39 避免使用 v-model
和 vm.$watch
深度監聽混合使用
在使用 v-model
和 vm.$watch
深度監聽時,可能會導致不必要的重新渲染。
8.3.40 避免使用 v-model
和 vm.$watch
立即執行混合使用
在使用 v-model
和 vm.$watch
立即執行時,可能會導致不必要的重新渲染。
8.3.41 避免使用 v-model
和 vm.$set
數組混合使用
在使用 v-model
和 vm.$set
數組時,可能會導致不必要的重新渲染。
8.3.42 避免使用 v-model
和 vm.$delete
數組混合使用
在使用 v-model
和 vm.$delete
數組時,可能會導致不必要的重新渲染。
8.3.43 避免使用 v-model
和 vm.$watch
數組混合使用
在使用 v-model
和 vm.$watch
數組時,可能會導致不必要的重新渲染。
8.3.44 避免使用 v-model
和 vm.$watch
數組深度監聽混合使用
在使用 v-model
和 vm.$watch
數組深度監聽時,可能會導致不必要的重新渲染。
8.3.45 避免使用 v-model
和 vm.$watch
數組立即執行混合使用
在使用 v-model
和 vm.$watch
數組立即執行時,可能會導致不必要的重新渲染。
8.3.46 避免使用 v-model
和 vm.$set
對象混合使用
在使用 v-model
和 vm.$set
對象時,可能會導致不必要的重新渲染。
8.3.47 避免使用 v-model
和 vm.$delete
對象混合使用
在使用 v-model
和 vm.$delete
對象時,可能會導致不必要的重新渲染。
8.3.48 避免使用 v-model
和 vm.$watch
對象混合使用
在使用 v-model
和 vm.$watch
對象時,可能會導致不必要的重新渲染。