尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
VueUse 函数详解:useArrayFindLast——响应式获取数组中最后一个匹配元素
前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载useArrayFindLast 是 VueUse 提供的一组响应式数组工具函数之一它把原生Array.prototype.findLast封装成了基于computed的响应式派生数据只要传入的数组或回调依赖发生变化返回的ComputedRef就会自动重新计算。本文以 packages/shared/useArrayFindLast/index.md 为核心结合仓库源码 index.ts 与测试用例 index.test.ts完整讲解它的用法、参数、底层实现原理与常见坑位读完即可在自己的 Vue 3 项目中直接落地使用。一句话概括useArrayFindLast(list, fn)返回一个只读的计算属性ComputedRef其值始终等于数组中最后一个满足测试函数fn的元素如果没有任何元素满足条件则值为undefined。它的行为与原生Array.findLast完全一致区别在于它是响应式的——数组本身或其元素的变化都会被自动追踪并触发重新求值。基础用法首先从vueuse/core中导入函数import { useArrayFindLast } from vueuse/core最常见的用法是传入一个由ref组成的数组配合一个测试回调const list [ref(1), ref(-1), ref(2)] const positive useArrayFindLast(list, val val 0) // positive.value: 2这里数组list中的元素是ref(1)、ref(-1)、ref(2)回调函数val val 0用于判断元素是否为正数。由于findLast是从数组末尾向前搜索因此返回的是最后一个正数2而不是第一个正数1。返回值是ComputedRefT | undefined类型的只读 ref在模板或watch中可以直接使用script setup langts import { ref } from vue import { useArrayFindLast } from vueuse/core const list [ref(1), ref(-1), ref(2)] const positive useArrayFindLast(list, val val 0) /script template p最后一个正数是{{ positive }}/p /template回调签名回调函数的签名与原生Array.prototype.findLast一致接收三个参数源码见 index.ts参数类型说明elementT当前正在测试的元素已自动解包 ref见下文元素自动解包indexnumber当前元素的索引从数组末尾向前的搜索过程中索引依次递减arrayMaybeRefOrGetterT[]被搜索的数组本身const result useArrayFindLast(list, (element, index, array) { console.log(element, index, array.length) return element 0 })与 useArrayFind 的差异VueUse 同系列还提供useArrayFind返回第一个匹配元素与useArrayFindIndex返回第一个匹配元素的索引找不到时返回-1。三者对比如下函数行为找不到时返回useArrayFind从头开始找第一个匹配元素undefineduseArrayFindLast从尾开始找最后一个匹配元素undefineduseArrayFindIndex从头开始找第一个匹配元素的索引-1例如同样的数组[ref(1), ref(-1), ref(2)]与回调val val 0useArrayFind返回1而useArrayFindLast返回2。对应实现可参考 useArrayFind/index.ts 与 useArrayFindIndex/index.ts。与响应式数组配合使用useArrayFindLast的强大之处在于即使传入的是reactive数组或其长度动态变化结果也会实时更新。文档中的示例import { useArrayFindLast } from vueuse/core const list reactive([-1, -2]) const positive useArrayFindLast(list, val val 0) // positive.value: undefined list.push(10) // positive.value: 10 list.push(5) // positive.value: 5逐步解读初始数组[-1, -2]中没有正数因此positive.value为undefinedlist.push(10)后数组变为[-1, -2, 10]最后一个正数是10继续list.push(5)后数组变为[-1, -2, 10, 5]此时最后一个正数变成5因为5在10之后。这个行为在测试用例 index.test.ts 中被完整验证it(should work with reactive array, () { useSetup(() { const list reactive([-1, -2]) const positive useArrayFindLast(list, val val 0) expect(positive.value).toBe(undefined) list.push(10) expect(positive.value).toBe(10) list.push(5) expect(positive.value).toBe(5) }) })也就是说数组内容变化增删元素、元素值变化都会让计算结果自动刷新这是它相对于手动调用findLast的核心价值——你不需要自己去监听数组并手动更新状态。参数类型详解从源码的类型签名index.ts可以看出两个参数的完整类型export function useArrayFindLastT( list: MaybeRefOrGetterMaybeRefOrGetterT[], fn: (element: T, index: number, array: MaybeRefOrGetterT[]) boolean, ): UseArrayFindLastReturnT其中list类型为MaybeRefOrGetterMaybeRefOrGetterT[]。这意味着它可以接受普通数组[1, 2, 3]元素为ref的数组[ref(1), ref(2)]元素为getter函数的数组[() 1, () 2]由ref包裹的数组ref([1, 2, 3])由getter函数返回的数组() [1, 2, 3]。fn测试回调返回boolean决定元素是否匹配。返回值UseArrayFindLastReturnT即ComputedRefT | undefined。元素自动解包有一个容易被忽略的细节当数组元素是ref时回调函数接收到的element参数已经被自动解包unwrapped。源码中通过toValue(element)完成了这一操作return computed(() toValueT | undefined( !Array.prototype.findLast ? findLast(toValue(list), (element, index, array) fn(toValue(element), index, array)) : toValue(list) .findLast((element, index, array) fn(toValue(element), index, array)), ))因此你不需要在回调里手动写val.value直接写val val 0即可即使数组元素是ref。源码原理computed 封装与旧环境 PolyfilluseArrayFindLast的完整实现只有约 20 行index.ts核心逻辑可以拆解为三层1. 响应式外层computed函数整体由computed()包裹toValue(list)会在求值阶段取出当前数组。由于 Vue 的computed会自动追踪求值过程中读取到的所有响应式依赖因此数组本身是ref/reactive时数组的增删与替换会被追踪数组元素是ref/getter时读取元素的过程toValue(element)也会被追踪。任一依赖变化都会触发重新计算。这也是响应式的来源。2. 功能主体原生 findLast 优先实现优先使用原生Array.prototype.findLastECMAScript 2023 规范Chrome 97、Node.js 18 等现代环境已支持toValue(list) .findLast((element, index, array) fn(toValue(element), index, array))注意这里回调的element同样经过toValue(element)解包所以fn中拿到的是解包后的值。3. 兜底方案内置 Polyfill对于不支持findLast的旧环境如 Node.js 18源码内置了一个手动实现的findLastPolyfillindex.ts// Polyfill for node version 18 function findLastT(arr: T[], cb: (element: T, index: number, array: T[]) boolean): T | undefined { let index arr.length while (index-- 0) { if (cb(arr[index], index, arr)) return arr[index] } return undefined }其算法是从数组末尾向前遍历index从arr.length递减到0找到第一个满足回调的元素立即返回全部不满足则返回undefined。选择逻辑通过!Array.prototype.findLast判断只有环境缺失该原生方法时才走 Polyfill现代环境下零额外开销。导出与体积useArrayFindLast经由 packages/shared/index.ts 统一导出随vueuse/core一起发布。根据仓库中的 packages/export-size.json 记录其打包后体积约为199 Bgzip 前按项目 export-size 统计口径非常轻量。响应式失效演示元素 ref 变化也会触发更新除了reactive数组元素级ref的变化同样会被追踪。测试用例 index.test.ts 演示了这一场景it(should find positive, () { useSetup(() { const item1 shallowRef(1) const item2 shallowRef(2) const item3 shallowRef(3) const positive useArrayFindLast([item1, item2, item3], val val 0) expect(positive.value).toBe(3) item3.value -1 expect(positive.value).toBe(2) item2.value -1 expect(positive.value).toBe(1) item1.value -1 expect(positive.value).toBe(undefined) }) })执行过程初始[1, 2, 3]最后一个正数为3item3变为-1数组变为[1, 2, -1]最后一个正数变为2item2变为-1数组变为[1, -1, -1]最后一个正数变为1item1变为-1数组变为[-1, -1, -1]无正数结果为undefined。这说明即使数组本身不变只要某个元素的ref值变化useArrayFindLast的结果也会自动更新——非常适合在列表项状态频繁变动的场景如待办事项的完成状态、选中状态判断中直接使用。常见场景建议结合以上特性useArrayFindLast适合以下实战场景取最后一个满足条件的条目如判断一组校验规则中最后一个未通过校验的字段、获取列表中最后一个处于某状态的节点与 ref 元素数组搭配当元素本身是响应式状态且会被单独更新时无需手动重组数组与响应式数组搭配当数组长度与内容会动态变化如push、splice时结果自动跟随刷新替代手动 watch相比watch(list, () { ... })后再手动调用findLast直接使用本函数更简洁且天然惰性求值仅在读取.value时计算。需要从数组头部找第一个匹配元素时改用 useArrayFind需要拿到匹配元素的索引时改用 useArrayFindIndex。三者共享相同的响应式设计都基于computedtoValue同样支持ref数组、reactive数组与元素自动解包。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐StarRocks cardinality() 函数详解获取数组与 Map 元素个数的权威指南StarRocks cardinality 函数详解获取数组与 Map 元素个数的权威指南 cardinality 是 StarRocks 中用于返回数组A数据库OLAP数据仓库大数据湖仓一体数据分析Enzyme ReactWrapper .last() 方法详解取匹配节点集合的最后一个元素Enzyme ReactWrapper .last 方法详解取匹配节点集合的最后一个元素 .last 是 Enzyme 测试工具中用于将当前 wrapper测试前端30-seconds-of-code用数组解构提取 JavaScript 数组最后一个元素30 seconds of code用数组解构提取 JavaScript 数组最后一个元素 数组解构destructuring assignment是 E教程文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

【Agent Harness】从“提示词玩具”到“认知操作系统”:Gliding Horse 如何重新定义 AI Agent 的 TaoToken 实践

【Agent Harness】从“提示词玩具”到“认知操作系统”:Gliding Horse 如何重新定义 AI Agent 的 TaoToken 实践

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

📅 2026/10/4 22:48:32
单细胞测序marker基因转化与GO富集分析实战:从基因列表到生物学功能解读

单细胞测序marker基因转化与GO富集分析实战:从基因列表到生物学功能解读

做单细胞测序分析的同学应该都有这种体会:经过聚类、UMAP降维、差异表达分析之后,我们手里攒了一大堆marker基因,每个cluster动辄几十上百个基因,看表头看得眼花缭乱,但真要写进论文、解释生物学意义的时候&#xff0c…

📅 2026/10/4 22:43:31
ANORD-DCT-DWT协同音频水印:嵌入稳在听觉盲区

ANORD-DCT-DWT协同音频水印:嵌入稳在听觉盲区

简介:本资源是一套基于MATLAB实现的音频水印嵌入与提取完整方案,面向数字媒体安全、信息隐藏方向的本科生、研究生及算法工程师,解决在二值图像中隐秘嵌入并高保真还原音频信号的技术问题。项目融合单稳态DCT频域编码、离散小波变换&#xff…

📅 2026/10/4 22:43:31
MORE NEWS

更多资讯

📰

小鼠体内PD-1阻断实验:抗体纯度、内毒素与用药全解

1. 那次"抗体翻车"让我重新认识了体内实验的选品门槛先讲一件真实发生过的事。几年前我做MC38结肠癌模型,打算上一组抗PD-1单药治疗,抗体是从某家国产供应商买的,标明了"体内级",体外流式结合曲线也做得很漂亮…

📰

Agent系列——MCP协议实战:把Cline MCP配置改到TaoToken

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

📰

CodeBot:基于OpenCode的AI助手,兼容Hermes和Obsidian

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

📰

华硕路由器变身AI边缘网关:提示流编排器部署实战

先说结论:这篇文章讲的不是把一个大模型权重塞进华硕路由器——那不可能,任何一台家用路由器的闪存和内存都装不下几 B 甚至几十 B 的参数。真正落地的是把AI 提示流编排器这种"大脑调度层"搬到路由器上,做一个轻量边缘网关&#x…

📰

新手必学:form-create-designer的8个拖拽操作技巧,快速提升表单搭建效率

新手必学:form-create-designer的8个拖拽操作技巧,快速提升表单搭建效率 【免费下载链接】FcDesigner 好用的Vue低代码可视化 AI 表单设计器,可以通过拖拽的方式快速创建表单,提高开发者对表单的开发效率。支持PC端和移动端&#…

📰

爬虫逆向心法:从抓包分析到JS逆向与反爬破解的实战细节

一个老爬虫的逆向心法:那些网上不说的细节,我一次性抖出来写爬虫最怕什么?不是被封IP,不是被识别,而是——你看得见数据在那里,却怎么也拿不出来。这种卡壳的感觉,凡是做数据采集的朋友都懂。今…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬