前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载导读useElementOverflow是 VueUseVue 3 Composition API 实用工具集中用于响应式监听 DOM 元素内容溢出状态的组合式函数。它基于浏览器原生的ResizeObserver与MutationObserver实现能够实时告诉你一个元素在水平方向isXOverflowed或垂直方向isYOverflowed上是否发生了内容溢出是开发展开更多按钮、截断提示、等交互场景的得力工具。本文将结合 useElementOverflow/index.ts 源码、component.ts 组件封装、directive.ts 指令封装以及对应的测试用例完整讲解其 API、三种使用形态函数 / 组件 / 指令与底层实现原理。功能概述useElementOverflow的核心能力是实时跟踪一个元素的scrollWidth/scrollHeight与offsetWidth/offsetHeight之间的关系并把它转化为两个只读的响应式布尔值返回值类型含义isXOverflowedReadonlyShallowRefboolean水平方向是否溢出scrollWidth offsetWidthisYOverflowedReadonlyShallowRefboolean垂直方向是否溢出scrollHeight offsetHeightupdate() void立即手动刷新一次溢出状态stop() void停止监听并释放相关副作用从源码看其判定逻辑极其简单直接packages/core/useElementOverflow/index.tsfunction update(htmlEl: HTMLElement) { isXOverflowed.value htmlEl.scrollWidth htmlEl.offsetWidth isYOverflowed.value htmlEl.scrollHeight htmlEl.offsetHeight }也就是说只要元素的内容尺寸scroll 尺寸超过了可视区域尺寸offset 尺寸就认为发生了溢出——这要求元素本身设置了overflow: hidden或auto/scroll之类的约束否则内容会撑开元素而非被裁剪。基础用法Composition API文档中给出的标准用法如下script setup import { useElementOverflow } from vueuse/core import { useTemplateRef } from vue const el useTemplateRef(el) const { isXOverflowed } useElementOverflow(el) /script template div refel stylewidth: 100px;overflow: hidden; button v-ifisXOverflowed show more /button span v-elsesome words may be too long to show here/span /div /template关键点解析目标参数类型target接受MaybeComputedElementRef即可以是模板 ref、普通Ref、computed返回的元素甚至直接传 DOM 元素本身。内部通过unrefElement统一解包见 packages/core/useElementOverflow/index.ts。SVG 元素会被忽略源码中对el instanceof SVGElement做了排除packages/core/useElementOverflow/index.ts因为 SVG 元素没有scrollWidth等尺寸属性相关测试也验证了传入 SVG 时状态保持falseindex.browser.test.ts。必须配合overflow: hidden溢出判定依赖内容被裁剪scroll 尺寸大于可视尺寸因此实践中要给目标元素设置overflow: hidden或auto/scroll否则isXOverflowed会一直为false。实际应用场景非常典型当文本太长放不下时显示展开更多按钮。这也是官方 demo.vue 演示的效果——通过拖动 range 改变容器宽度、输入框修改内容实时观察isXOverflowed的响应式变化。配置项详解useElementOverflow的第二个参数option支持以下配置export interface UseElementOverflowOptions extends ConfigurableWindow { /** * Use MutationObserver to observe the target and its children. * * default false */ observeMutation?: boolean | MutationObserverInit /** * Callback when observer triggered. */ onUpdated?: ResizeObserverCallback | MutationCallback }observeMutation内容变化监听类型boolean | MutationObserverInit默认值false作用默认情况下仅通过ResizeObserver监听尺寸变化容器或子元素尺寸改变会触发更新。但当内容长度发生变化而尺寸不变时比如文本从hi变成hello worldResizeObserver 不会触发——此时需要开启observeMutation: true改用MutationObserver监听 DOM 变化。从源码看packages/core/useElementOverflow/index.ts当observeMutation为true时使用默认的 MutationObserver 配置{ childList: true, subtree: true, characterData: true }即监听子节点增删、整棵子树以及文本内容characterData的变化。如果传入了MutationObserverInit对象则完全按自定义配置进行监听例如只想监听属性变化useElementOverflow(el, { observeMutation: { attributes: true, }, })onUpdated回调类型ResizeObserverCallback | MutationObserver默认值无作用在每次 observer 触发、溢出状态更新完成后调用。useResizeObserver触发时以ResizeObserverCallback形态调用MutationObserver触发时以MutationCallback形态调用。window可配置 WindowConfigurableWindow允许传入自定义window实例如 iframe 场景或测试环境默认取全局window见 packages/core/_configurable.ts。测试用例中传入window: null时update不会执行、状态保持false体现了 SSR 与无窗口环境下的安全降级index.browser.test.ts。组件用法UseElementOverflowVueUse 的组件形态以渲染函数方式封装了同一逻辑通过作用域插槽scoped slot把溢出状态暴露给模板component.tsscript setup langts import { UseElementOverflow } from vueuse/components /script template UseElementOverflow v-slot{ isXOverflowed } stylewidth: 100px;overflow: hidden; button v-ifisXOverflowed show more /button span v-elsesome words may be too long to show here/span /UseElementOverflow /template组件特性asprop通过as指定渲染的标签名默认渲染为div。测试验证了assection时组件渲染为sectionindex.browser.test.ts。observeMutationprop透传给useElementOverflow作为配置。update事件observer 触发时通过emit(update, ...)抛出自定义事件。作用域插槽插槽参数为完整的UseElementOverflowReturn包含isXOverflowed、isYOverflowed、update、stop可以像使用函数返回值一样在模板中直接调用update。组件的底层实现是先创建一个shallowRef作为 target再把组件根元素通过ref绑定到它然后调用useElementOverflowcomponent.ts。UseElementOverflow与vElementOverflow均由 packages/components/index.ts 统一对外导出。指令用法vElementOverflowVueUse 还提供了指令形态适合在不用额外包装标签、直接绑定到现有元素上的场景directive.tsscript import type { UseElementOverflowReturn } from vueuse/core import { vElementOverflow } from vueuse/components import { ref } from vue export default { setup() { const isXOverflowed ref(false) function onXOverflowChanged(info: UseElementOverflowReturn) { isXOverflowed.value info.isXOverflowed } return { isXOverflowed, onXOverflowChanged, } }, } /script template div v-element-overflowonXOverflowChanged stylewidth: 100px;overflow: hidden; button v-ifisXOverflowed show more /button span v-elsesome words may be too long to show here/span /div /template指令绑定值的两种形式回调函数v-element-overflowonXOverflowChanged。指令挂载后立即以immediate: true触发一次回调之后每当isXOverflowed或isYOverflowed变化时再次调用回调参数是完整的UseElementOverflowReturndirective.ts。数组v-element-overflow[onXOverflowChanged, options]第二项用于传入UseElementOverflowOptions。指令测试中就演示了[onOverflow, { observeMutation: { attributes: true } }]的写法directive.test.ts。该指令通过createDisposableDirective创建会在指令生命周期内自动管理useElementOverflow创建的副作用observer 与 watch卸载时自动清理。底层实现原理观察目标集合useElementOverflow并不只观察目标元素本身而是同时观察目标及其所有HTMLElement子元素packages/core/useElementOverflow/index.tsconst targets () { const el targetEl.value if (!el || el instanceof SVGElement) return [] return [el, ...Array.from(el.children).filter(i i instanceof HTMLElement)] }这样做的原因是容器尺寸不变时子元素的尺寸变化例如图片加载、内容变宽同样可能导致容器溢出只观察容器本身会漏掉这类情况。该集合同时传给useResizeObserver和开启时useMutationObserver。双 Observer 协作ResizeObserver 分支始终开启基于 useResizeObserver 实现。该函数通过useSupported检测ResizeObserver in window并在 target 变化时重建 observer 观察所有目标元素回调中先执行update(el)刷新溢出状态再调用可选的onUpdatedindex.ts。MutationObserver 分支observeMutation开启时基于 useMutationObserver 实现。同样的回调模式先更新状态再调用回调。测试用例验证了修改文本节点的datacontent.data overflowed能够触发状态更新并调用onUpdatedindex.browser.test.ts。两者都通过tryOnScopeDispose在组件卸载或 effect scope 销毁时自动disconnect()并停止 watcher因此无需手动清理同时返回值中的stop函数也提供了手动提前停止的能力。响应式特性isXOverflowed与isYOverflowed是只读的 shallow ref通过shallowReadonly包裹index.ts因此它们可以安全地在模板中直接使用如v-ifisXOverflowed外部无法直接赋值修改只能通过 resize/mutation 事件或调用update()驱动更新测试用例专门验证了这两个返回值满足isReadonlyindex.browser.test.ts。性能注意点observeMutation默认关闭是有原因的——MutationObserver监听subtree: true会对整棵子树产生较大开销。对于纯尺寸驱动的场景容器宽度变化、图片加载建议保持默认只有内容文本长度动态变化的场景如输入框输入导致换行数变化才需要开启。典型实战场景场景一溢出时显示展开更多即文档中的示例容器固定宽度并overflow: hidden当isXOverflowed为真时展示按钮点击后可通过调用返回的update()或改变容器尺寸让状态恢复。场景二多行文本截断提示结合-webkit-line-clamp或固定行高实现多行截断用isYOverflowed判断是否存在被隐藏的文本从而决定是否渲染查看全文入口。场景三动态内容监控当内容来自用户输入、异步加载等动态来源时开启observeMutation: true确保内容变化而非仅尺寸变化也能实时驱动状态更新——官方 demo.vue 正是这一场景的直观演示一边在输入框中修改文本一边拖动宽度滑块isXOverflowed实时响应。总结useElementOverflow以极简的 APIscrollWidth offsetWidth/scrollHeight offsetHeight封装了浏览器两个强大的观察器通过始终开启的 ResizeObserver 可选的 MutationObserver双通道监听实现了对元素水平、垂直溢出状态的实时响应式跟踪。无论是函数、组件还是指令形态它都能在内容太长放不下这一高频 UI 需求上提供开箱即用的解决方案且通过stop、tryOnScopeDispose等机制保证资源自动释放。如果需要在项目中实现展开更多查看全文等截断交互useElementOverflow是当前仓库中最直接、最轻量的选择。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐VueUse 的 useElementOverflow响应式检测元素溢出状态组合式、组件与指令三种用法全解析VueUse 的 useElementOverflow响应式检测元素溢出状态组合式、组件与指令三种用法全解析 useElementOverflow 是 V前端react-use 的 useClickAway Hook 完全指南检测并响应元素外部点击react use 的 useClickAway Hook 完全指南检测并响应元素外部点击 useClickAway 是 react use 提供的 UI 类前端VueUse 的 useIntersectionObserver 完整指南元素可见性监测、响应式配置与指令用法VueUse 的 useIntersectionObserver 完整指南元素可见性监测、响应式配置与指令用法 useIntersectionObserver前端上一篇如何3分钟搞定视频号、抖音视频资源下载res-downloader 新手完整使用教程下一篇避免格式化陷阱fmtlib/fmt无符号整数处理全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考