当前位置: 首页 > news >正文

vue+ts 基础面试题 (四)

目录

在Composition API中使用生命周期钩子

使用生命周期钩子的方法

组件挂载时执行代码

组件更新后执行操作

组件卸载前清理资源

其他生命周期钩子

服务端渲染特定钩子

组合式函数中的使用

注意事项

与Options API对比

onMounted和onUnmounted的使用场景

onMounted 的使用场景

onUnmounted 的使用场景

组合使用的典型场景

自定义一个组合式函数(Composable)并实现鼠标位置跟踪

核心实现步骤

使用示例

性能优化版本

TypeScript支持

注意事项

keep-alive 组件的作用

基本使用示例

结合路由缓存

控制缓存的组件

缓存生命周期钩子

注意事项


在Composition API中使用生命周期钩子

使用生命周期钩子的方法

在Vue 3的Composition API中,生命周期钩子通过onX形式的函数导入并使用。

import { onMounted, onUpdated, onUnmounted } from 'vue'

组件挂载时执行代码

onMounted钩子用于在组件挂载完成后执行代码:

onMounted(() => {console.log('组件已挂载')// 在这里可以访问DOM元素或执行初始化操作
})

组件更新后执行操作

onUpdated钩子在组件因响应式状态变更而更新其DOM树后调用:

onUpdated(() => {console.log('组件已更新')// 可以在这里操作更新后的DOM
})

组件卸载前清理资源

onUnmounted钩子在组件卸载前调用,适合执行清理操作:

onUnmounted(() => {console.log('组件即将卸载')// 清除定时器、取消事件监听等
})

其他生命周期钩子

Composition API还提供了其他生命周期钩子:

import { onBeforeMount, onBeforeUpdate, onBeforeUnmount, onErrorCaptured } from 'vue'onBeforeMount(() => {// 在组件挂载前执行
})onBeforeUpdate(() => {// 在组件更新前执行
})onBeforeUnmount(() => {// 在组件卸载前执行
})onErrorCaptured((err, instance, info) => {// 捕获来自后代组件的错误
})

服务端渲染特定钩子

对于服务端渲染,有两个专用的生命周期钩子:

import { onServerPrefetch } from 'vue'onServerPrefetch(() => {// 服务端渲染时,在组件实例在服务器上被渲染之前调用
})

组合式函数中的使用

在组合式函数中使用生命周期钩子时,它们会自动绑定到调用它们的组件实例:

function useFeature() {onMounted(() => {// 会绑定到使用该函数的组件})
}

注意事项

生命周期钩子必须在setup()函数或<script setup>同步调用,不应在异步回调中注册。如果需要等待异步操作完成后再执行某些操作,可以在钩子内部使用异步函数:

onMounted(async () => {const data = await fetchData()// 使用获取的数据
})

与Options API对比

Composition API的生命周期钩子与Options API的对应关系:

  • beforeCreate -> 使用setup()
  • created -> 使用setup()
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeUnmount -> onBeforeUnmount
  • unmounted -> onUnmounted
  • errorCaptured -> onErrorCaptured
  • renderTracked -> onRenderTracked
  • renderTriggered -> onRenderTriggered
  • activated -> onActivated
  • deactivated -> onDeactivated

onMounted和onUnmounted的使用场景

onMounted 的使用场景

onMounted 是 Vue 3 组合式 API 中的一个生命周期钩子,用于在组件挂载到 DOM 后执行代码。适用于需要在 DOM 渲染完成后进行的操作,例如数据获取、DOM 操作或第三方库初始化。

示例代码

import { onMounted } from 'vue';setup() {onMounted(() => {// 获取 DOM 元素const element = document.getElementById('example');console.log('组件已挂载,DOM 元素:', element);// 发起 API 请求fetchData();});
}

onUnmounted 的使用场景

onUnmounted 是 Vue 3 组合式 API 中的另一个生命周期钩子,用于在组件从 DOM 卸载后执行代码。适用于清理操作,例如取消事件监听、清除定时器或释放资源。

示例代码

import { onUnmounted } from 'vue';setup() {const timer = setInterval(() => {console.log('定时器运行中');}, 1000);onUnmounted(() => {// 清除定时器clearInterval(timer);console.log('组件已卸载,定时器已清除');});
}

组合使用的典型场景

当需要在组件挂载时初始化某些功能,并在卸载时清理这些功能时,可以同时使用 onMountedonUnmounted

示例代码

import { onMounted, onUnmounted } from 'vue';setup() {const handleScroll = () => {console.log('处理滚动事件');};onMounted(() => {window.addEventListener('scroll', handleScroll);});onUnmounted(() => {window.removeEventListener('scroll', handleScroll);});
}

自定义一个组合式函数(Composable)并实现鼠标位置跟踪

核心实现步骤

创建一个useMousePosition函数,利用useStateuseEffect跟踪鼠标坐标

import { useState, useEffect } from 'react'function useMousePosition() {const [position, setPosition] = useState({ x: 0, y: 0 })useEffect(() => {const updatePosition = (e) => {setPosition({ x: e.clientX, y: e.clientY })}window.addEventListener('mousemove', updatePosition)return () => window.removeEventListener('mousemove', updatePosition)}, [])return position
}

使用示例

在组件中直接调用自定义Hook获取实时坐标

function App() {const { x, y } = useMousePosition()return (<div>Mouse position: {x}, {y}</div>)
}

性能优化版本

添加防抖机制减少状态更新频率

import { useState, useEffect, useCallback } from 'react'
import { throttle } from 'lodash'function useMousePosition(throttleTime = 100) {const [position, setPosition] = useState({ x: 0, y: 0 })const updatePosition = useCallback(throttle((e) => {setPosition({ x: e.clientX, y: e.clientY })}, throttleTime),[])useEffect(() => {window.addEventListener('mousemove', updatePosition)return () => {window.removeEventListener('mousemove', updatePosition)updatePosition.cancel()}}, [updatePosition])return position
}

TypeScript支持

为Hook添加类型定义确保类型安全

interface Position {x: numbery: number
}function useMousePosition(): Position {const [position, setPosition] = useState<Position>({ x: 0, y: 0 })// ...其余实现相同
}

注意事项

  • 组件卸载时必须清除事件监听防止内存泄漏
  • 服务端渲染(SSR)时需要添加typeof window检查
  • 高频事件建议配合防抖/节流使用
  • 可扩展为返回相对容器坐标而非窗口坐标

keep-alive 组件的作用

<keep-alive> 是 Vue 3 提供的一个内置组件,主要用于缓存动态组件或路由组件的状态,避免重复渲染和销毁。

  1. 缓存组件实例:通过包裹动态组件或路由视图,避免频繁创建和销毁组件实例,优化性能。
  2. 保留组件状态:被缓存的组件会保留其数据状态(如表单输入、滚动位置等),切换回来时无需重新初始化。
  3. 控制缓存策略:支持按需缓存或排除特定组件(通过 includeexclude 属性)。

基本使用示例

<template><button @click="toggleComponent">切换组件</button><keep-alive><component :is="currentComponent"></component></keep-alive>
</template><script setup>
import { ref } from 'vue';
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';const currentComponent = ref('ComponentA');
const toggleComponent = () => {currentComponent.value = currentComponent.value === 'ComponentA' ? 'ComponentB' : 'ComponentA';
};
</script>

结合路由缓存

<template><router-view v-slot="{ Component }"><keep-alive><component :is="Component" /></keep-alive></router-view>
</template>

控制缓存的组件

通过 includeexclude 指定哪些组件需要缓存或排除(匹配组件 name 选项):

<keep-alive include="ComponentA,ComponentB"><component :is="currentComponent" />
</keep-alive>

缓存生命周期钩子

被缓存的组件会触发 activated(激活)和 deactivated(停用)钩子:

<script setup>
import { onActivated, onDeactivated } from 'vue';onActivated(() => {console.log('组件被激活');
});onDeactivated(() => {console.log('组件被停用');
});
</script>

注意事项

  1. 组件需命名includeexclude 依赖组件的 name 选项,确保组件已命名。
  2. 避免滥用:过度缓存可能增加内存占用,建议仅缓存高频切换的组件(如 Tab 页)。
  3. 动态组件更新:若动态组件的 props 变化,需通过 key 强制更新
http://www.dtcms.com/a/310459.html

相关文章:

  • 『React』 组件通信全攻略
  • 工业环境中无人叉车安全标准深度解析
  • django的数据库原生操作sql
  • 洛谷做题3:P5711 【深基3.例3】闰年判断
  • 浪潮信息PMO负责人时军受邀为PMO大会主持人
  • 如何最简单、通俗地理解线性回归算法? 线性回归模型在非线性数据上拟合效果不佳,如何在保持模型简单性的同时改进拟合能力?
  • 【C++】类和对象 上
  • JP3-3-MyClub后台后端(二)
  • JavaScript 深拷贝:从基础到完美实现
  • 使用Jeecg低代码平台实现计划管控系统建设方案--1项目前后端搭建
  • 《义龙棒球科普》棒球是韩国的国球吗·棒球1号位
  • 德国威乐集团亚太中东非洲PMO负责人和继明受邀为PMO大会主持人
  • 逻辑回归算法 银行贷款资格判断案例,介绍混淆矩阵与正则化惩罚
  • Google机器学习基础(语言模型)
  • 第13届蓝桥杯Python青少组选拔赛(STEMA)2021年8月真题
  • osloader!DoGlobalInitialization函数分析之HW_CURSOR--NTLDR源代码分析之设置光标
  • Python编程基础与实践
  • Linux 用户与组管理及权限委派
  • 自由学习记录(75)
  • [2025CVPR-图象处理方向]Z-Magic:零样本多属性引导图像创建器
  • SpringBoot与Rust实战指南
  • 深度SEO优化的方式有哪些,从技术层面来说
  • GitHub 趋势日报 (2025年07月31日)
  • 【实战】Dify从0到100进阶--插件开发(1)Github爬取插件
  • ansible.cfg 配置文件生成
  • [css]切角
  • 第十四天:C++内存管理
  • Agents-SDK智能体开发[2]之工具调用
  • Nginx 来正确地托管网站服务
  • 《软件测试与质量控制》实验报告一 测试用例设计