Element UI el-select filter-method 自定义搜索:多字段、拼音与性能优化实战
1. 项目概述当默认搜索不够用在后台管理系统里下拉选择框Select绝对是高频组件。Element UI 的el-select配合filterable属性开箱即用的远程搜索或者本地过滤应付大部分场景绰绰有余。但总有那么些“特殊需求”会让你觉得默认的搜索逻辑差点意思。比如我最近就遇到一个需求下拉选项的数据结构是{ value: ‘id’, label: ‘姓名 (工号)’, dept: ‘部门’ }。产品经理要求用户不仅在输入“张三”时要能匹配到输入“zhangsan”甚至输入“销售部”时如果“张三”属于销售部也得把它搜出来。这还没完他还希望搜索能忽略大小写和多余空格。el-select默认的filter-method是按label字段进行字符串全匹配这显然不够用了。这就是filter-method的用武之地。它不是一个备选方案而是当你需要完全掌控下拉选项的筛选逻辑时的唯一选择。它把“怎么搜”的权力完全交给了开发者让你可以基于任意复杂的业务规则去过滤数据。今天我就结合这个实际案例拆解如何从零开始实现一个高度定制化的el-select搜索并分享几个实战中积累的关键技巧和避坑指南。2. 核心思路与方案设计2.1 默认机制与自定义的边界首先我们得搞清楚el-select的搜索是怎么工作的。当你设置了filterable属性组件内部会接管输入框的输入事件并根据一定的逻辑来过滤options。默认的本地过滤逻辑非常简单它遍历所有选项将用户的输入关键词query与每个选项的label属性进行字符串比对。这里的匹配是严格的全匹配也就是说label必须完整包含query字符串“张”能匹配“张三”但“三”匹配不了“张三”更别提跨字段如dept或者模糊匹配了。filter-method的作用就是让我们用一个自定义函数替换掉这个默认的遍历比对逻辑。这个函数会接收两个参数query用户在输入框中键入的字符串。option当前遍历到的选项对象就是options数组里的每一项。函数的返回值是一个布尔值true表示该选项匹配成功应该被保留在下拉列表中false则表示不匹配将被过滤掉。2.2 自定义搜索函数的设计要点设计一个健壮的自定义搜索函数需要考虑以下几个层面匹配目标我们不再只盯着option.label。函数内部可以访问option的全部属性因此我们可以组合option.label、option.dept、option.code甚至嵌套属性option.meta.xxx来进行综合判断。匹配规则是全匹配、前缀匹配、模糊匹配还是正则表达式是否需要支持拼音匹配这完全由业务决定。输入预处理用户输入可能包含首尾空格、大小写不统一。在匹配前对query进行trim().toLowerCase()处理能极大提升用户体验。性能考量如果选项数据量巨大例如上千条自定义函数中的复杂计算如拼音转换可能成为性能瓶颈。这时需要考虑防抖、异步或 Web Worker。基于开头的需求我们的函数设计思路是输入处理去除query首尾空格并转为小写实现大小写不敏感。字段组合将option.label和option.dept组合成一个搜索字符串。模糊包含判断处理后的搜索字符串是否包含处理后的query。3. 实现详解与代码实操3.1 基础实现多字段模糊搜索让我们直接上代码这是最直接的实现方式el-select v-modelselectedValue filterable :filter-methodcustomFilterMethod placeholder请选择 el-option v-foritem in filteredOptions :keyitem.value :labelitem.label :valueitem.value /el-option /el-select script export default { data() { return { selectedValue: , // 原始数据源 originalOptions: [ { value: 1, label: 张三 (ZS001), dept: 销售部 }, { value: 2, label: 李四 (LS002), dept: 技术部 }, { value: 3, label: 王五 (WW003), dept: 销售部 }, { value: 4, label: 赵六 (ZL004), dept: 市场部 } ], // 用于渲染的过滤后数据 filteredOptions: [] }; }, created() { // 初始化时显示全部选项 this.filteredOptions [...this.originalOptions]; }, methods: { customFilterMethod(query) { if (!query) { // 如果搜索词为空显示所有选项 this.filteredOptions [...this.originalOptions]; return; } // 1. 对搜索词进行预处理去空格、转小写 const normalizedQuery query.trim().toLowerCase(); // 2. 过滤原始数据 this.filteredOptions this.originalOptions.filter(option { // 3. 构建每个选项的搜索内容字符串 // 将label和dept组合起来同样进行小写转换以备匹配 const searchContent ${option.label} ${option.dept}.toLowerCase(); // 4. 执行模糊包含匹配 return searchContent.includes(normalizedQuery); }); } } }; /script代码解析与注意事项filteredOptions的必要性这是实现自定义过滤的关键。我们不能直接修改originalOptions必须维护一个用于视图渲染的副本。当搜索词变化时我们基于原始数据源计算出新的filteredOptions。空查询处理filter-method在输入框清空时也会被调用query为空字符串。此时必须手动将filteredOptions重置为完整列表否则下拉框会显示为空。性能提示上述代码在每次输入时都会遍历整个原始数组并创建新数组。对于数据量小的场景没问题但如果选项超过500条频繁输入可能会感到卡顿。一个优化点是引入防抖例如使用lodash.debounce确保过滤函数不会在每次按键时都触发而是延迟执行。3.2 进阶实现支持拼音首字母搜索产品经理又提新需求了“用户输入‘ZS’应该也能找到‘张三’。” 这需要我们将中文转换为拼音首字母。我们可以引入第三方库如pinyin-pro。首先安装依赖npm install pinyin-pro。template !-- 模板部分同上 -- /template script import { pinyin } from pinyin-pro; export default { data() { /* 同上 */ }, created() { /* 同上 */ }, methods: { customFilterMethod(query) { if (!query) { this.filteredOptions [...this.originalOptions]; return; } const normalizedQuery query.trim().toLowerCase(); this.filteredOptions this.originalOptions.filter(option { // 基础文本搜索 const searchContent ${option.label} ${option.dept}.toLowerCase(); const textMatch searchContent.includes(normalizedQuery); if (textMatch) return true; // 拼音首字母搜索针对label中的中文部分 // 例如从“张三 (ZS001)”中提取“张三” const chinesePart option.label.match(/[\u4e00-\u9fa5]/g)?.join() || ; if (chinesePart) { // 获取拼音首字母如“张三” - “ZS” const pinyinInitials pinyin(chinesePart, { pattern: first, toneType: none }).replace(/\s/g, ).toUpperCase(); // 判断查询词是否匹配拼音首字母 if (pinyinInitials.toLowerCase().includes(normalizedQuery)) { return true; } } // 都未匹配则过滤掉 return false; }); } } }; /script注意拼音库的选择与性能pinyin-pro性能较好且体积小。但在过滤函数中实时计算拼音对于超大数据集仍是负担。更优的方案是在数据初始化时就为每个选项预计算好拼音和首字母并作为新属性如pinyin、initials存储在originalOptions中。这样过滤函数只需比对预计算好的字符串性能开销极小。3.3 状态管理与性能优化当组件复杂时过滤逻辑可能更复杂或者需要在多个地方复用。我们可以将过滤逻辑提取到 Vuex Store 或一个独立的 Composition API 函数中。使用Composition API (setup) 重构template el-select v-modelselectedValue filterable :filter-methodhandleFilter placeholder请选择 el-option v-foritem in filteredOptions :keyitem.value :labelitem.label :valueitem.value /el-option /el-select /template script import { ref, computed, watch } from vue; import { pinyin } from pinyin-pro; import { debounce } from lodash-es; export default { setup() { const selectedValue ref(); const originalOptions ref([...]); // 原始数据 const filterQuery ref(); // 搜索词 // **关键优化预计算拼音数据** const enhancedOptions computed(() { return originalOptions.value.map(option { const chinesePart option.label.match(/[\u4e00-\u9fa5]/g)?.join() || ; let initials ; if (chinesePart) { initials pinyin(chinesePart, { pattern: first, toneType: none }).replace(/\s/g, ).toUpperCase(); } return { ...option, _searchText: ${option.label} ${option.dept}.toLowerCase(), // 预合并文本 _initials: initials.toLowerCase() // 预计算首字母 }; }); }); // **核心过滤逻辑** const filterFn (query) { const q query.trim().toLowerCase(); if (!q) return enhancedOptions.value; return enhancedOptions.value.filter(option { // 1. 检查预计算的文本 if (option._searchText.includes(q)) return true; // 2. 检查预计算的首字母 if (option._initials option._initials.includes(q)) return true; return false; }); }; // **应用防抖的过滤处理器** const debouncedFilter debounce((query) { filterQuery.value query; }, 300); // **计算属性依赖filterQuery返回过滤结果** const filteredOptions computed(() { return filterFn(filterQuery.value); }); // 暴露给模板的方法 const handleFilter (query) { debouncedFilter(query); }; return { selectedValue, filteredOptions, handleFilter }; } }; /script这个方案的优势非常明显关注点分离过滤逻辑被集中管理与组件UI解耦。性能卓越拼音转换和字符串合并在数据初始化时完成避免了渲染时的重复计算。计算属性filteredOptions依赖响应式变量filterQueryVue 会智能地缓存结果。响应流畅通过防抖函数将高频的输入事件转换为低频的过滤执行输入体验丝滑。4. 常见问题与深度排查指南在实际使用filter-method时你几乎一定会遇到下面这几个问题。4.1 下拉面板不更新或闪烁问题描述自定义了filter-method输入关键词后下拉列表有时不刷新或者快速输入时出现闪烁。根因分析这通常是由于数据更新与组件渲染不同步导致的。filter-method是el-select的一个属性它期望你通过修改其绑定的options数组来驱动视图更新。在上面的基础示例中我们通过修改this.filteredOptions来触发重新渲染。问题可能出在直接修改了originalOptions而不是其副本。在filter-method中没有正确处理空字符串情况导致数组被意外清空。Vue 的响应式系统未能检测到数组变化例如你使用了索引直接赋值this.filteredOptions[index] newItem。解决方案确保使用新数组始终使用filter、map等方法返回一个全新的数组赋值给filteredOptions以触发 Vue 的响应式更新。显式处理空查询在filter-method函数开头强制判断if (!query) { this.filteredOptions [...this.originalOptions]; return; }。检查数据引用确认originalOptions和filteredOptions在 data 中正确定义且filteredOptions的初始化值是正确的。4.2 与remote-method远程搜索的冲突问题描述同时使用了filterable和remote-method希望实现远程搜索但自定义的filter-method似乎干扰了远程搜索的逻辑。核心原理el-select的filterable和remote-method是互斥的设计模式。filterable默认或自定义filter-method用于本地过滤它假设所有options数据已存在于前端搜索只是在前端数据中做筛选。remote-method用于远程搜索它假设选项数据量巨大或动态需要根据用户输入的关键词向后端发起请求获取新的选项列表。如何选择如果你的数据是固定的、数量有限的比如几百条使用filterablefilter-method。如果你的数据是动态的、数量无限的比如从数据库查询用户使用remote-method。此时通常不需要设置filterable因为选项列表本身就是根据搜索词实时获取的。错误用法示例el-select filterable :remote-methodfetchOptions :filter-methodlocalFilter !-- 这行是多余的且会造成混乱 -- 正确的远程搜索用法是只使用remote-method并在其回调中设置options数组。4.3 大数据量下的性能优化策略当originalOptions超过 1000 条时即使是最简单的字符串includes操作在每次按键时执行也可能导致界面卡顿。优化策略组合拳防抖Debounce这是首要措施。确保过滤函数不会在每次input事件时都触发而是在用户停止输入一段时间如300ms后才执行。import { debounce } from lodash-es; methods: { customFilterMethod: debounce(function(query) { // 你的过滤逻辑 }, 300) }注意使用防抖后filter-method绑定的就是这个防抖函数。要确保组件销毁时可能存在的定时器也被清理lodash的debounce有cancel方法。预计算与索引如前文进阶示例所示将所有需要匹配的内容文本、拼音、首字母在数据初始化时计算好存储为额外属性。过滤时只需比对这些预处理好的字符串避免在热路径中进行复杂计算。虚拟滚动Virtual Scrolling对于渲染上千个el-option节点导致的滚动卡顿el-select本身不支持虚拟滚动。如果这是瓶颈可以考虑放弃el-select使用类似el-table实现自定义的下拉选择面板或者寻找支持虚拟滚动的第三方 Select 组件。这是一个更重量级的重构方案。分页加载 搜索如果数据量真的极大上万条更好的架构是改为“搜索即查询”的模式也就是使用remote-method进行后端分页查询而不是一次性加载所有数据到前端。4.4 与value-key及复杂对象值的协同问题描述当options的value是一个对象如{ id: 1, name: ‘xxx’ }而不仅仅是字符串或数字时自定义过滤后可能出现选项显示异常或选择错误。解决方案el-select提供了value-key属性来处理对象类型的value。你需要指定一个唯一标识属性名如‘id’。在自定义过滤时你的逻辑应基于option的其他属性如label,dept但value和value-key的配置保持不变组件内部会依据value-key来正确识别和匹配选中的值。el-select v-modelselectedObject !-- selectedObject 是一个对象 -- filterable :filter-methodcustomFilterMethod value-keyid !-- 告知组件使用对象的 ‘id’ 属性作为唯一标识 -- el-option v-foritem in filteredOptions :keyitem.id :labelitem.displayName :valueitem !-- 整个对象作为 value -- /el-option /el-select在customFilterMethod中你可以正常访问item.displayName、item.department等进行过滤无需关心value-key。它只用于组件内部的值比较和回显。5. 扩展思考与最佳实践5.1 将过滤逻辑抽象为通用工具函数在一个大型项目中多个地方可能需要相似的自定义过滤逻辑。将其抽象出来是明智之举。// utils/selectFilter.js import { pinyin } from pinyin-pro; /** * 创建高级选择器过滤函数 * param {Array} options - 原始选项数组 * param {Object} config - 配置项 * param {Array} config.searchFields - 指定搜索字段如 [‘label‘, ‘dept‘] * param {Boolean} config.enablePinyin - 是否启用拼音匹配 * param {Boolean} config.caseSensitive - 是否大小写敏感 * returns {Function} 过滤函数 (query) filteredOptions */ export function createAdvancedFilter(options, config {}) { const { searchFields [label], enablePinyin false, caseSensitive false } config; // 预增强数据 const enhancedOptions options.map(opt { let searchText searchFields.map(field opt[field] || ).join( ).trim(); let initials ; if (!caseSensitive) { searchText searchText.toLowerCase(); } if (enablePinyin) { const chinesePart searchText.match(/[\u4e00-\u9fa5]/g)?.join() || ; if (chinesePart) { initials pinyin(chinesePart, { pattern: first, toneType: none }).replace(/\s/g, ); if (!caseSensitive) initials initials.toLowerCase(); } } return { ...opt, _searchText: searchText, _initials: initials }; }); // 返回实际的过滤函数 return function(query) { let q query.trim(); if (!q) return options; // 返回原始数据保持引用 if (!caseSensitive) { q q.toLowerCase(); } const filtered enhancedOptions.filter(opt { if (opt._searchText.includes(q)) return true; if (enablePinyin opt._initials opt._initials.includes(q)) return true; return false; }); // 返回过滤后的原始对象确保value等属性不变 return filtered.map(opt { const { _searchText, _initials, ...original } opt; return original; }); }; }在组件中使用script import { createAdvancedFilter } from /utils/selectFilter; export default { data() { return { originalOptions: [/*...*/], selectedValue: , filterFn: null, filteredOptions: [] }; }, created() { // 初始化时创建过滤函数实例 this.filterFn createAdvancedFilter(this.originalOptions, { searchFields: [label, dept], enablePinyin: true, caseSensitive: false }); this.filteredOptions [...this.originalOptions]; }, methods: { customFilterMethod(query) { this.filteredOptions this.filterFn(query); } } }; /script5.2 在表格筛选列中的应用el-select的filter-method思路可以扩展到el-table的筛选列中。虽然表格的column.filter-method用法略有不同但核心思想一致自定义如何根据输入值过滤行数据。掌握这种“自定义过滤”的思维模式能让你在处理各种数据筛选需求时更加游刃有余。5.3 测试策略对于自定义的复杂过滤逻辑编写单元测试至关重要。测试用例应覆盖空搜索词返回全部数据。中文全称、中文模糊、拼音、拼音首字母、英文、数字等不同搜索词。大小写敏感/不敏感的配置。多字段组合搜索。边界情况如特殊字符、超长字符串。使用 Jest 或 Vitest你可以轻松模拟filter-method的调用断言其返回的数组是否符合预期。回过头看el-select的filter-method就像是一把瑞士军刀默认状态下它是一把好用的主刀但当你按下那个红色的开关露出隐藏的螺丝刀、镊子时你才发现它的真正威力在于应对那些非标准、定制化的场景。关键不在于记住 API而在于理解其设计思想将核心的筛选算法交还给开发者。这种模式在前端组件设计中非常常见下次当你觉得某个组件的默认行为不够用时不妨先看看文档里有没有这样一个“逃生舱口”。

相关新闻

Android事件模拟与注入:从input命令到无障碍服务的自动化实战

Android事件模拟与注入:从input命令到无障碍服务的自动化实战

1. 项目概述:Android事件模拟与注入的深度探索在Android应用开发与测试的日常工作中,我们经常会遇到一些需要自动化操作或模拟用户交互的场景。比如,你想做一个自动化的测试脚本,让它在凌晨三点自动帮你签到领积分;或者…

2026/10/17 5:15:08 阅读更多 →
Android性能优化全链路解析:从指标体系到流畅度、内存与启动速度优化

Android性能优化全链路解析:从指标体系到流畅度、内存与启动速度优化

1. 项目概述:为什么Android性能优化是“玄学”也是“科学”干了这么多年Android开发,最常被产品和测试同学追着问的一句话就是:“这个页面怎么又卡了?” 性能问题,尤其是移动端的性能问题,往往不像功能Bug那…

2026/10/16 7:53:00 阅读更多 →
华硕ROG魔方幻分布式路由实战:Mesh组网与Wi-Fi 6全屋覆盖指南

华硕ROG魔方幻分布式路由实战:Mesh组网与Wi-Fi 6全屋覆盖指南

最近在折腾家里的网络,特别是游戏和影音需求越来越高,原有的单台路由器在信号覆盖和高速稳定性上越来越力不从心。面对动辄上百平米的户型、多堵承重墙,以及家人同时在线游戏、4K流媒体和远程办公的多重压力,我开始研究一套能彻底…

2026/10/16 16:46:10 阅读更多 →

最新新闻

kmodes聚类算法:专治纯类别数据的无监督分群

kmodes聚类算法:专治纯类别数据的无监督分群

简介:本资源是面向数据科学学习者与Python开发者的kmodes聚类算法开源实现,专为解决分类变量及混合型数据(数值类别)的无监督聚类难题而设计,适用于客户分群、文本分析、生物信息等实际场景。压缩包共30个文件&#xf…

2026/10/17 14:25:11 阅读更多 →
工业视觉检测落地指南:从人工目检到TVA全自动闭环的痛点与对策

工业视觉检测落地指南:从人工目检到TVA全自动闭环的痛点与对策

这几年常年泡在制造现场,最常被问的一句话就是:“这套视觉检测到底能不能替掉人工?”聊得越深,越发现真正的问题从来不是“算法能不能识别”,而是企业从人工目检走向全自动化检测时,那些藏在实际产线里的核…

2026/10/17 14:25:11 阅读更多 →
Vibe Coding 指南:用自然语言实现 AI 自动构建产品

Vibe Coding 指南:用自然语言实现 AI 自动构建产品

1. Vibe Coding 是什么:编程这件事,终于可以不那么“程序员”了 1.1 一个词掀起的讨论:它在解决什么问题 最近圈子里到处都在聊 Vibe Coding,我身边好几个以前连 HTML 都懒得写的朋友,居然自己做起了小工具、小网站&a…

2026/10/17 14:25:11 阅读更多 →
纯C++ OpenSSL实现HTTPS客户端:深度定制TLS握手与证书验证

纯C++ OpenSSL实现HTTPS客户端:深度定制TLS握手与证书验证

简介:本资源是一份面向C初学者与网络编程实践者的HTTPS通信实战项目,聚焦OpenSSL在MFC框架下的集成应用,解决传统socket无法直接访问HTTPS站点的核心痛点。代码完整实现了原生socket HTTP POST登录与基于OpenSSL的HTTPS POST登录(…

2026/10/17 14:25:11 阅读更多 →
红外光面部表情识别数据集解析:VOC+YOLO格式与训练实践

红外光面部表情识别数据集解析:VOC+YOLO格式与训练实践

1. 为什么攒这个数据集:一次真实的需求驱动先交代一下背景。我最近在做一个情绪识别相关的模拟项目,需要让摄像头实时判断用户表情,再根据表情状态触发不同的交互逻辑。最初我打算直接用现成的开源表情数据集,比如常见的FER系列&a…

2026/10/17 14:25:11 阅读更多 →
深度学习从入门到精通:一条能跑通的路,比一百篇科普都值钱

深度学习从入门到精通:一条能跑通的路,比一百篇科普都值钱

简介:这份PDF教程面向零基础到进阶的深度学习学习者,系统梳理了从概念入门到实战应用的完整知识链路,帮助读者解决数学基础薄弱、框架选择迷茫、原理理解不透等常见痛点。资源包为单个PDF文件,大小约311KB,内容紧凑便于…

2026/10/17 14:24:10 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →