MST

星途 面试题库

面试题:Vue 2 到 Vue 3 迁移中,如何处理生命周期钩子函数的变化?

请详细说明在 Vue 2 项目迁移到 Vue 3 时,生命周期钩子函数发生了哪些改变,以及在实际项目中应如何调整代码来适应这些变化。例如,created、mounted 等钩子函数在 Vue 3 中有什么不同的使用方式?
28.7万 热度难度
前端开发Vue

知识考点

AI 面试

面试题答案

一键面试

生命周期钩子函数的改变

  1. 命名变化
    • 在 Vue 2 中,生命周期钩子函数有 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed 等。
    • 在 Vue 3 中,beforeDestroy 改名为 beforeUnmountdestroyed 改名为 unmounted。这是因为 Vue 3 更强调组件的挂载和卸载概念,而不是销毁。
  2. 组合式 API 中的使用
    • 在 Vue 2 中,生命周期钩子函数是在组件选项对象中定义的,例如:
export default {
  created() {
    console.log('组件创建完成');
  }
}
  • 在 Vue 3 的组合式 API 中,需要使用 setup 函数内通过相应的函数来使用生命周期钩子。例如:
import { onMounted, onBeforeUnmount } from 'vue';
export default {
  setup() {
    onMounted(() => {
      console.log('组件挂载完成');
    });
    onBeforeUnmount(() => {
      console.log('组件即将卸载');
    });
    return {};
  }
}

实际项目中的代码调整

  1. 选项式 API 项目迁移
    • 如果项目仍使用选项式 API(类似 Vue 2 的写法),仅需将 beforeDestroydestroyed 改为 beforeUnmountunmounted 即可。例如:
// Vue 2 代码
export default {
  beforeDestroy() {
    console.log('组件即将销毁');
  }
}
// Vue 3 代码
export default {
  beforeUnmount() {
    console.log('组件即将卸载');
  }
}
  1. 转换为组合式 API
    • 创建阶段
      • 在 Vue 2 中 created 钩子,在 Vue 3 组合式 API 中使用 onBeforeMountonMounted。例如,在 Vue 2 中可能在 created 中获取数据:
export default {
  data() {
    return {
      dataList: []
    };
  },
  created() {
    this.fetchData();
  },
  methods: {
    fetchData() {
      // 模拟获取数据
      this.dataList = [1, 2, 3];
    }
  }
}
 - 在 Vue 3 组合式 API 中:
import { ref, onMounted } from 'vue';
export default {
  setup() {
    const dataList = ref([]);
    const fetchData = () => {
      // 模拟获取数据
      dataList.value = [1, 2, 3];
    };
    onMounted(() => {
      fetchData();
    });
    return {
      dataList
    };
  }
}
  • 更新阶段
    • Vue 2 中的 beforeUpdateupdated,在 Vue 3 组合式 API 中对应 onBeforeUpdateonUpdated。例如,在 Vue 2 中 updated 可能用于重新计算某些依赖数据:
export default {
  data() {
    return {
      number: 0
    };
  },
  updated() {
    console.log('数据更新后重新计算');
  }
}
 - 在 Vue 3 组合式 API 中:
import { ref, onUpdated } from 'vue';
export default {
  setup() {
    const number = ref(0);
    onUpdated(() => {
      console.log('数据更新后重新计算');
    });
    return {
      number
    };
  }
}
  • 卸载阶段
    • 对于 Vue 2 中的 destroyed,在 Vue 3 组合式 API 中使用 onUnmounted。例如,在 Vue 2 中 destroyed 可能用于清理定时器:
export default {
  data() {
    return {
      timer: null
    };
  },
  created() {
    this.timer = setInterval(() => {
      console.log('定时器运行');
    }, 1000);
  },
  destroyed() {
    clearInterval(this.timer);
  }
}
 - 在 Vue 3 组合式 API 中:
import { onUnmounted } from 'vue';
export default {
  setup() {
    let timer = setInterval(() => {
      console.log('定时器运行');
    }, 1000);
    onUnmounted(() => {
      clearInterval(timer);
    });
    return {};
  }
}