Appearance
父子生命周期
本节目标:理解“父子生命周期”的核心思路,并能把它用于实际开发或面试表达。 Vue 的父组件和子组件的生命周期钩子函数的执行顺序是非常有规律的。以下是在 Vue 组件层级关系中,父组件和子组件生命周期钩子函数的执行顺序:
- 创建阶段:
- 父:beforeCreate
- 父:created
- 父:beforeMount
- 子:beforeCreate
- 子:created
- 子:beforeMount
- 子:mounted
- 父:mounted
- 更新阶段:
- 父:beforeUpdate
- 子:beforeUpdate
- 子:updated
- 父:updated
- 销毁阶段:
- 父:beforeDestroy
- 子:beforeDestroy
- 子:destroyed
- 父:destroyed
注意点:
- 当 Vue 实例开始挂载时,父组件的 beforeMount 钩子首先被调用,然后是子组件的整个生命周期,直到子组件 mounted 钩子被调用,之后父组件的 mounted 钩子被调用。
- 当 Vue 实例或数据更新时,父组件的 beforeUpdate 钩子首先被调用,然后是子组件的 beforeUpdate 钩子,接着是子组件的 updated 钩子,最后是父组件的 updated 钩子。
- 在销毁过程中,首先是父组件的beforeDestroy 钩子被调用,然后是子组件的整个销毁生命周期,从beforeDestroy 到destroyed,最后是父组件的destroyed 钩子。
当 Vue 实例或数据更新时,子组件是否走生命周期(特别是 beforeUpdate 和 updated 钩子)取决于子组件自身的数据是否发生变化。
如果子组件的 prop 或本地数据发生了改变,那么子组件的 beforeUpdate 和 updated 钩子将会被调用。
如果仅仅是父组件的数据发生了改变,而这些数据并没有被传递给子组件(即子组件的 prop 和本地数据都没有变化),那么子组件的 beforeUpdate 和 updated 钩子不会被调用。
以下是一个简单的例子:
父组件 vue Copy code <template> <div> <button @click="updateParentData">Update Parent Data</button> <child-component :someProp="parentData"></child-component> </div> </template>
<script> import ChildComponent from './ChildComponent.vue';
export default { components: { ChildComponent }, data() { return { parentData: 'initial' }; }, methods: { updateParentData() { this.parentData = 'updated'; } } }; </script> 子组件 vue Copy code <template> <div> {{ someProp }} </div> </template>
<script> export default { props: ['someProp'], beforeUpdate() { console.log('Child beforeUpdate'); }, updated() { console.log('Child updated'); } }; </script> 在这个例子中,当你点击“Update Parent Data”按钮后:
父组件的 beforeUpdate 和 updated 钩子会被调用。 因为 parentData 是作为 prop 传递给子组件的,子组件的 someProp 发生了改变,所以子组件的 beforeUpdate 和 updated 钩子也会被调用。 但如果 parentData 并没有传给子组件,那么点击按钮后,子组件的 beforeUpdate 和 updated 钩子就不会被调用。
在 React 中,组件的生命周期有一些不同的钩子(或称为生命周期方法)和行为方式。React 的函数组件通常使用 Hooks 如 useEffect 来管理副作用和组件的生命周期,而类组件则使用诸如 componentDidMount、componentDidUpdate 和 componentWillUnmount 等生命周期方法。
React 父子组件更新 如果父组件重新渲染,它的所有子组件都会进行重新渲染,除非子组件通过 React.memo() 或 shouldComponentUpdate 进行了性能优化。
函数组件中的 useEffect Hook 或类组件中的 componentDidUpdate 通常用来执行组件更新后的副作用。
在 React 中,如果父组件的 state 或 props 更新,子组件默认也会重新渲染。但这与 Vue 不同,Vue 更加智能地追踪依赖,只有当子组件的相关 props 或自身的状态改变时,子组件才会更新。
示例 React 父组件 jsx Copy code import React, { useState } from 'react'; import ChildComponent from './ChildComponent';
const ParentComponent = () => { const [parentData, setParentData] = useState('initial');
const updateParentData = () => { setParentData('updated'); };
return ( <div> <button onClick={updateParentData}>Update Parent Data</button> <ChildComponent someProp={parentData} /> </div> ); };
export default ParentComponent; React 子组件 jsx Copy code import React, { useEffect } from 'react';
const ChildComponent = ({ someProp }) => { useEffect(() => { console.log('Child component updated'); }, [someProp]);
return <div>{someProp}</div>; };
export default ChildComponent; 在这个例子中:
当你点击“Update Parent Data”按钮后,父组件会重新渲染。 因为 parentData 是作为 prop 传递给子组件的,子组件的 useEffect 也会触发。 如果你想避免不必要的子组件更新,你可以使用 React.memo 或在类组件中使用 shouldComponentUpdate 方法来进行优化。
总体而言,React 和 Vue 的组件生命周期有相似之处,但具体的实现和优化方式有所不同。
