组件生命周期钩子函数执行流程
- A组件:
- 当A组件数据变化引起更新时,首先触发
beforeUpdate
钩子函数。此时A组件的状态即将更新,但尚未更新,DOM也未更新。
- 然后开始更新过程,A组件内部重新渲染,其子组件B也会触发更新。
- 当更新完成后,触发
updated
钩子函数。此时A组件及其所有子组件(B、C、D)都已完成更新,DOM也已更新。
- B组件:
- 由于A组件更新导致B组件更新,B组件触发
beforeUpdate
钩子函数。同样,此时B组件状态即将更新,但未更新,DOM也未更新。
- 接着B组件内部重新渲染,其自身及其子组件C开始更新。
- B组件更新完成后,触发
updated
钩子函数。
- C组件:
- 随着B组件更新引发C组件更新,C组件触发
beforeUpdate
钩子函数。
- C组件内部重新渲染,其自身及其子组件D开始更新。
- C组件更新完成后,触发
updated
钩子函数。
- D组件:
- 由于C组件更新导致D组件更新,D组件触发
beforeUpdate
钩子函数。
- D组件内部重新渲染。
- D组件更新完成后,触发
updated
钩子函数。
减少不必要更新提高性能及利用生命周期钩子函数实现的方法
- 使用
shouldComponentUpdate
(Vue2.x)或v-if
条件渲染:
shouldComponentUpdate
:在Vue2.x中,可以在B、C、D组件中定义shouldComponentUpdate
函数。例如在B组件中:
export default {
data() {
return {};
},
methods: {},
shouldComponentUpdate(nextProps, nextState) {
// 比较当前props和nextProps,当前state和nextState
// 如果某些数据没有变化,返回false,阻止组件更新
return true;
}
};
v-if
条件渲染:在A组件中,如果根据某个条件来决定是否渲染B组件。例如:
<template>
<div>
<B v-if="condition"></B>
</div>
</template>
<script>
import B from './B.vue';
export default {
components: {
B
},
data() {
return {
condition: true
};
}
};
</script>
- 这样当
condition
为false
时,B组件及其子组件C、D都不会渲染,也就不会产生不必要的更新。
- 利用
activated
和deactivated
钩子函数(针对keep - alive
包裹的组件):
- 如果B、C、D组件中有被
keep - alive
包裹的组件(假设C组件被keep - alive
包裹),当A组件更新时,C组件不会重新创建和销毁,而是触发activated
和deactivated
钩子函数。
- 在C组件中:
export default {
data() {
return {};
},
methods: {},
activated() {
// 组件被激活时执行,可进行一些初始化操作
},
deactivated() {
// 组件被停用(缓存)时执行,可进行一些清理操作
}
};
- 通过这种方式,C组件在不需要重新渲染时可以保持状态,减少不必要的性能开销。
- 使用
watch
监听数据变化并优化:
- 在各个组件中,可以使用
watch
来监听特定数据的变化。例如在B组件中:
export default {
data() {
return {
someData: ''
};
},
watch: {
someData(newVal, oldVal) {
// 只在someData变化时才执行相关逻辑,避免不必要的更新
}
}
};
- 通过精准监听数据变化,避免因为父组件数据变化导致的不必要的组件更新。