VueUse useTextSelection:基于 Vue 3 的响应式文本选区追踪组合式函数
前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载导读useTextSelection是 VueUsevueuse/core中归属于Sensors传感器分类的一个组合式函数它基于浏览器原生的Window.getSelectionAPI将用户选中了哪些文本、选区覆盖哪些范围、选区对应的矩形区域这类信息封装为 Vue 响应式状态。读完本文你将掌握useTextSelection的完整 API、源码级实现原理以及如何用它快速构建选中文本高亮、复制引导、标注批注等交互功能。快速上手最小可用示例在 Vue 3 的script setup中直接调用即可无需任何初始化配置script setup langts import { useTextSelection } from vueuse/core const state useTextSelection() /script template p{{ state.text }}/p /template当用户在页面上框选任意文本时state.text会立刻变为被选中的字符串清除选区后state.text会自动恢复为空字符串。整个过程不需要手动监听事件也不需要手动调用清理逻辑。useTextSelection已从 packages/core/index.ts 统一导出因此既可以通过import { useTextSelection } from vueuse/core引入也可以直接从vueuse/core/useTextSelection子路径引入。vueuse/core要求vue为^3.5.0的 peer 依赖请确保项目基于 Vue 3 使用参见 packages/core/package.json。返回值四个响应式字段useTextSelection的返回类型定义在 packages/core/useTextSelection/index.ts 中共四个字段字段类型含义textComputedRefstring当前选中的纯文本内容无选区时为rectsComputedRefDOMRect[]选区中每个 Range 对应的视口矩形getBoundingClientRect()数组rangesComputedRefRange[]选区包含的 Range 对象数组selectionShallowRefSelection \| null底层的Selection单例对象本身text是最常用的字段直接对应selection.toString()ranges允许你进一步操作选区结构例如遍历Range做自定义标记rects基于ranges派生每个Range经range.getBoundingClientRect()得到其矩形位置可用于给被选中文字绘制高亮浮层或定位工具条selection是底层Selection单例的浅引用shallow ref适合需要直接调用SelectionAPI如anchorNode、focusNode、collapse()的场景。真实示例实时展示选中文本与选区矩形仓库自带的 packages/core/useTextSelection/demo.vue 演示了text与rects的组合用法script setup langts import { useTextSelection } from vueuse/core import { computed } from vue const { rects, text } useTextSelection() const selectedStyle computed(() text.value ? text-primary : text-gray-400) /script template div p classfont-600 text-blue-600 You can select any text on the page. /p p strongSelected Text:/strong em :classselectedStyle classwhitespace-pre h-44 overflow-y-auto block {{ text || No selected }}/em /p p strongSelected rects:/strong pre classh-72 langjson{{ rects }}/pre /p /div /template从 demo 中可以提炼两个实战要点无选区状态的 UI 兜底text || No selected在空字符串时展示占位文案避免界面出现空白rects直接可序列化DOMRect对象包含x、y、width、height、top、right、bottom、left等属性用pre langjson打印即可直观查看选区在页面中的精确位置这也是实现选中即弹出高亮/标注工具的数据基础。源码级原理事件驱动 派生计算整个实现非常精简核心逻辑全部位于 packages/core/useTextSelection/index.tsexport function useTextSelection(options: UseTextSelectionOptions {}): UseTextSelectionReturn { const { window defaultWindow, } options const selection shallowRefSelection | null(window?.getSelection() ?? null) const text computed(() selection.value?.toString() ?? ) const ranges computedRange[](() selection.value ? getRangesFromSelection(selection.value) : []) const rects computed(() ranges.value.map(range range.getBoundingClientRect())) function onSelectionChange() { selection.value null // trigger computed update if (window) selection.value window.getSelection() } if (window) useEventListener(window.document, selectionchange, onSelectionChange, { passive: true }) return { text, rects, ranges, selection, } }1. 初始化直接读取当前选区调用时通过window?.getSelection()获取浏览器当前存在的Selection单例存入shallowRef。因此即使组件挂载时用户已经选中了文本text也能立即拿到既有选区内容——这一点在测试should initialize with an existing range中得到了验证见 packages/core/useTextSelection/index.browser.test.ts。2. 事件驱动监听selectionchange浏览器没有为选区变化提供可订阅的流式 API因此组件通过useEventListener在window.document上注册selectionchange事件监听使用{ passive: true }以优化滚动场景下的性能。useEventListener负责在组件卸载时自动移除监听无需手动清理其注册/清理逻辑参见 packages/core/useEventListener/index.ts。监听回调onSelectionChange中有一段精妙的实现function onSelectionChange() { selection.value null // trigger computed update if (window) selection.value window.getSelection() }先置null再赋新值是因为Selection在浏览器中是单例对象——选区变化时对象引用本身不变只是内部状态变了。若直接重新赋值shallowRef会认为引用未变化而跳过触发导致text/rects不更新。显式先赋null再赋新值即可强制刷新派生 computed。测试selection should always return the singleton Selection object no matter how the selection changes正是对这一行为的约束无论选区如何变化selection.value始终指向同一个Selection单例见 index.browser.test.ts。3. 派生计算text / ranges / rectstextselection.value?.toString() ?? 直接取选区文本ranges通过getRangesFromSelection按selection.rangeCount逐项调用selection.getRangeAt(i)收集所有 Range见 index.tsrects对ranges逐一映射range.getBoundingClientRect()得到以视口为坐标系的矩形数组。三者均为computed仅当selection引用变化即选区事件发生时才重新求值派生成本极低。配置选项ConfigurableWindowuseTextSelection接受一个可选的options对象其类型UseTextSelectionOptions继承了 VueUse 通用的ConfigurableWindow接口export interface ConfigurableWindow { /** * Specify a custom window instance, e.g. working with iframes or in testing environments. */ window?: Window }该接口定义于 packages/core/_configurable.ts核心作用是在iframe 环境或测试环境中注入自定义window实例使选区追踪作用于目标文档而非全局窗口。未传入时默认值取自export const defaultWindow isClient ? window : undefined见 packages/core/_configurable.ts——在 SSR/非浏览器环境下为undefined此时useTextSelection内部会跳过getSelection()调用与事件注册返回的text为、ranges/rects为空数组保证服务端渲染不会报错。典型用法iframe 场景const { text, rects } useTextSelection({ window: iframe.contentWindow, })测试验证与行为契约packages/core/useTextSelection/index.browser.test.ts 通过 Vitest happy-dom 定义了该函数的四个核心行为契约可作为你理解与使用时的权威参考选区对象单例性无论选区怎么变化selection.value始终指向同一个Selection对象初始空选区页面无选区时text为rects、ranges均为空数组anchorNode/focusNode为null初始化时读取既有选区调用前已存在选区则text直接反映该选区内容ranges/rects长度均为 1selectionchange驱动的实时更新模拟选中Hello World节点并派发selectionchange事件后text变为Hello WorldremoveAllRanges()后再派发事件所有派生值恢复为空。测试中手动派发new Event(selectionchange)的方式也印证了该函数的更新完全依赖selectionchange事件这一事实——这也是在测试代码中触发其更新的标准手段。典型应用场景选中文本高亮标注用rects计算选中区域的精确位置叠加高亮浮层或批注工具条复制引导 / 词典释义实时监听text在用户选中词句时弹出复制翻译查词按钮选区统计与分享在阅读类应用中统计用户选中文本或生成可分享的引用片段富文本选区操作配合ranges对选区 Range 做包裹标签、插入标记等 DOM 操作。小结useTextSelection以约 20 行核心代码将浏览器底层的Selection单例模型与 Vue 响应式系统优雅地衔接起来shallowRef承载Selectionselectionchange事件驱动刷新computed派生text、ranges、rects三路只读状态。它无需任何配置即可开箱即用同时通过ConfigurableWindow保留了 iframe 与 SSR 场景的扩展能力是 Vue 3 中处理用户文本选择这一交互需求的轻量而完备的解决方案。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐airi 项目实战用 VueUse useTextSelection 在 Vue 3 中响应式追踪用户文本选区airi 项目实战用 VueUse useTextSelection 在 Vue 3 中响应式追踪用户文本选区 导读 useTextSelection 是 VAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染AIRI 项目中的 usePreferredColorScheme响应式追踪 prefers-color-scheme 的 VueUse 组合式函数实战指南AIRI 项目中的 usePreferredColorScheme响应式追踪 prefers color scheme 的 VueUse 组合式函数实战指南AI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染VueUse vueuse/math useMin响应式 Math.min 组合式函数完全指南VueUse vueuse/math useMin响应式 Math.min 组合式函数完全指南 useMin 是 VueUse vueuse/math 扩前端上一篇comprehensive-rust 课程精讲用所有权与借用检查器实现 Single-Use Values一次性值下一篇Web-Dev-For-Beginners 实战作业解析用 JavaScript 条件逻辑实现学生成绩判定创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

codeforces-go 仓库题解深度解析:用隔板法与容斥原理 O(1) 求解「分糖果给小朋友 II」

codeforces-go 仓库题解深度解析:用隔板法与容斥原理 O(1) 求解「分糖果给小朋友 II」

科学计算 【免费下载链接】codeforces-go 算法竞赛模板库 by 灵茶山艾府 💭💡🎈 项目地址: https://gitcode.com/GitHub_Trending/co/codeforces-go 点击查看 免费下载 导读 本文以 leetcode/biweekly/117/b/README.md 为骨架&a…

2026/10/3 17:39:05 阅读更多 →
将 REST API 通过 Azure API Management 发布为 MCP Server:从创建、限流策略到 Copilot Agent 调用全指南

将 REST API 通过 Azure API Management 发布为 MCP Server:从创建、限流策略到 Copilot Agent 调用全指南

教程文档人工智能 【免费下载链接】mcp-for-beginners This open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for deve…

2026/10/3 17:39:05 阅读更多 →
深度拆解|1752vc Pitch Deck Analyzer 底层技术架构与核心算法原理

深度拆解|1752vc Pitch Deck Analyzer 底层技术架构与核心算法原理

摘要:1752vc Pitch Deck Analyzer 是目前VC赛道落地成熟度极高的多模态AI路演文稿分析系统,区别于传统文档AI工具的浅层文本识别能力,该系统依托25000真实投融资路演样本、4000年度初创企业尽调数据训练,实现了面向投融资场景的专…

2026/10/3 17:38:04 阅读更多 →

最新新闻

FMT飞控移植到RT-Thread的五个常见坑及排查方法

FMT飞控移植到RT-Thread的五个常见坑及排查方法

在嵌入式圈子里摸爬滚打这几年,我见过不少刚接触RTOS移植的朋友,一上来就想把FMT飞控系统整个搬到RT-Thread上跑起来。FMT作为一套代码比较完整的开源飞控,其内部自带多线程调度、uORB消息总线、传感器驱动、日志系统等模块,理论上…

2026/10/3 18:14:08 阅读更多 →
pgAdmin4图形化管理PostgreSQL:从建库到运维的完整指南

pgAdmin4图形化管理PostgreSQL:从建库到运维的完整指南

直接从一段实操经历说起吧。这几年我带过不少刚入门的开发同事,也帮几个小团队搭过内部数据环境,发现一个挺常见的现象:大家明明装好了 PostgreSQL,但日常操作却还在命令行里敲 psql,或者干脆让后端同学帮着建表改数据…

2026/10/3 18:14:08 阅读更多 →
FMT飞控移植RT-Thread:五大坑与解法

FMT飞控移植RT-Thread:五大坑与解法

嵌入式搞了好几年,自认为玩转RT-Thread问题不大,结果第一次把FMT飞控往自己板子上移植的时候,还是被接二连三的坑砸得怀疑人生。FMT(Firmament Autopilot)是个很有意思的开源飞控,底层直接跑在RT-Thread上&…

2026/10/3 18:14:08 阅读更多 →
从0到1自建用户增长核心系统:广告投放与全渠道触达闭环复盘

从0到1自建用户增长核心系统:广告投放与全渠道触达闭环复盘

做用户增长的人,大概都经历过这种分裂感:一边是广告投放预算花得肉疼,另一边触达工具发出去的消息用户根本不点。我在上一家公司从0到1带队搭过一套用户增长核心系统,把广告投放和全渠道触达收拢到同一个平台上,部门从…

2026/10/3 18:14:07 阅读更多 →
Maven 4 内核重构指南:从架构升级到迁移避坑全解析

Maven 4 内核重构指南:从架构升级到迁移避坑全解析

Maven 4 最近动静不小,alpha 版本一路迭代到 RC,Java 圈子里的讨论度明显上来了。这个统辖 Java 项目构建整整 15 年的老牌工具,终于要迎来一次真正意义上的"内核重构"。作为一个从 Maven 2 时代用过来的老 Java 开发,我…

2026/10/3 18:14:06 阅读更多 →
软考数据库系统工程师:关系代数核心考点与解题全攻略

软考数据库系统工程师:关系代数核心考点与解题全攻略

距离软考数据库系统工程师考试还有一段时间的时候,总有人问我:关系代数到底怎么学?教材翻来翻去就那几页,选择、投影、连接、除运算看起来也不复杂,可一到真题就懵,尤其是那些带“全部”“至少”“没有”字…

2026/10/3 18:13:06 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →