微信小程序触底加载onReachBottom全解析:从原理到实战优化
1. 从“下拉刷新”到“触底加载”一个被低估的交互设计做小程序开发尤其是内容型应用列表展示几乎是标配。新手拿到需求第一反应往往是“下拉刷新”配个加载动画数据一股脑全拉下来。但稍微有点经验的开发者或者用户量上来之后就会立刻遇到问题列表数据一多首次加载慢得像蜗牛滑动起来卡顿明显用户手机发烫流量也哗哗地流。这时候“触底加载”或者说“分页加载”就成了必须掌握的核心技能。这不仅仅是技术实现更是一种产品思维。它背后的逻辑是用户不需要一次性看到所有内容他们只需要在需要的时候看到他们想看的那部分。微信小程序提供的onReachBottom生命周期函数就是实现这一交互的官方“开关”。当用户滚动页面内容区域触底时这个函数就会被自动触发。听起来很简单对吧但真要把这个功能做稳、做好、做出用户体验里面全是细节和“坑”。比如怎么判断“触底”的时机才精准分页参数怎么设计才合理网络请求并发和失败怎么处理列表数据拼接时如何避免页面闪烁这些都是我趟过无数坑之后才总结出的实战经验。今天我就结合一个内容列表的典型场景把onReachBottom实现触底分页的完整流程、核心原理、避坑指南以及高阶优化思路给你掰开揉碎了讲清楚。无论你是刚入门的小程序开发者还是想优化现有列表体验的老手这篇文章都能给你直接的、可落地的参考。2. 核心原理拆解onReachBottom 到底是怎么工作的在动手写代码之前我们必须先吃透onReachBottom这个函数的触发机制。很多开发者遇到的“不触发”或“频繁触发”的灵异事件根源都在于对机制理解不透。2.1 触发条件与“触底”的计算逻辑onReachBottom并不是监听用户的滚动操作本身而是监听页面滚动区域是否到达了一个预设的阈值边界。这个边界官方称之为onReachBottomDistance默认值是 50单位是像素。它的计算逻辑是这样的页面滚动条触底距离 页面内容总高度 - 页面滚动高度 - 屏幕可视高度。当这个“触底距离”小于或等于你设置的onReachBottomDistance时onReachBottom函数就会被触发。这里有一个非常关键的细节“页面内容总高度”指的是整个 Page 页面所有内容的高度而不仅仅是你的列表容器比如scroll-view的高度。如果你错误地将列表放在一个固定高度的scroll-view里那么页面本身的内容高度可能永远达不到触发onReachBottom的条件因为滚动行为被scroll-view组件“劫持”了。这是第一个大坑。注意通常实现触底加载我们直接使用 Page 页面的原生滚动而不是嵌套scroll-view。只有在需要页面内局部滚动如顶部有固定Tab栏时才考虑使用scroll-view并配合其自身的bindscrolltolower事件但那又是另一套逻辑了。2.2 与 Page 其他生命周期的协作关系onReachBottom是 Page 构造器的参数之一与onLoad,onShow,onReady等生命周期同级。它独立于页面滚动事件由小程序底层框架自动管理。一个常见的误解是在onReachBottom里直接修改数据视图就会更新。实际上它和onLoad里发起请求一样你需要通过this.setData()来更新绑定在视图层的数据从而触发渲染。因此在onReachBottom中你的核心任务通常是计算下一页的参数发起网络请求拿到新数据后通过setData将新数据追加到现有列表的末尾。这里就引出了第二个关键点onReachBottom是异步的且可能被连续触发。如果用户快速滑动到底部或者在请求未返回时再次触底函数可能会被连续调用多次导致重复发送请求。因此我们必须引入“锁”的概念这在后续的防抖节流部分会详细展开。3. 基础实现四步走从零构建一个健壮的分页列表理论清楚了我们来看一个最基础、但足够健壮的实现。我们假设一个场景一个文章列表页每次加载10条后端接口接受page(页码) 和size(每页条数) 参数。3.1 第一步页面数据结构与初始状态定义在 Page 的data中我们需要定义几个核心状态变量这是整个分页逻辑的基石。// pages/article-list/article-list.js Page({ data: { articleList: [], // 当前已加载的文章列表数据 pageNum: 1, // 当前页码从1开始 pageSize: 10, // 每页条数 hasMore: true, // 是否还有更多数据用于控制“加载完毕”提示 isLoading: false, // 是否正在加载中用于防止重复请求 errorMsg: // 加载错误信息 }, // ... 其他生命周期和函数 })为什么这样设计articleList: 用数组存储所有已加载的数据这是视图渲染的来源。pageNum和pageSize: 分页查询的双子星pageNum从1开始更符合人类直觉也便于和后端对齐。hasMore: 这是用户体验的关键。当后端返回数据不足pageSize条时我们就能知道没有下一页了此时可以将hasMore设为false并在页面底部显示“没有更多了”而不是傻傻地继续触发加载。isLoading: 这是防止重复请求的“锁”。在请求发出前设为true请求结束后无论成功失败设为false。在onReachBottom中先检查这把锁的状态。errorMsg: 网络请求可能失败给用户一个友好的错误提示是必须的而不是让页面卡死在加载状态。3.2 第二步封装核心的加载数据函数我们将加载数据的逻辑抽离成一个独立的函数loadData它可以根据传入的页码加载数据并处理数据的拼接和状态更新。// pages/article-list/article-list.js Page({ // ... data 定义同上 onLoad(options) { // 页面加载时加载第一页数据 this.loadData(1); }, // 核心数据加载函数 async loadData(pageNum) { // 1. 上锁防止重复请求 if (this.data.isLoading) { return; } // 2. 检查是否还有更多数据 if (!this.data.hasMore pageNum 1) { return; } // 3. 更新加载状态和错误信息 this.setData({ isLoading: true, errorMsg: }); // 4. 显示导航栏加载动画可选但推荐 wx.showNavigationBarLoading(); try { // 5. 发起网络请求 const result await wx.request({ url: https://your-api.com/articles, method: GET, data: { page: pageNum, size: this.data.pageSize } }); // 6. 处理响应数据这里假设后端返回 { code: 0, data: { list: [], total: 100 } } if (result.data.code 0) { const newList result.data.data.list || []; const total result.data.data.total || 0; // 计算是否还有更多数据 const currentTotal this.data.articleList.length newList.length; const _hasMore currentTotal total; // 更新页面数据 this.setData({ articleList: pageNum 1 ? newList : [...this.data.articleList, ...newList], // 关键第一页覆盖后续追加 hasMore: _hasMore, pageNum: pageNum // 更新当前页码 }); // 如果是第一页且数据为空可以显示空状态图 if (pageNum 1 newList.length 0) { this.setData({ isEmpty: true }); } } else { // 接口业务错误 throw new Error(result.data.msg || 加载失败); } } catch (err) { // 7. 统一错误处理 console.error(加载数据失败:, err); this.setData({ errorMsg: err.message || 网络开小差了请稍后重试 }); // 如果是加载更多时失败可以给用户一个重试按钮这里简单处理为提示 if (pageNum 1) { wx.showToast({ title: 加载失败, icon: none }); } } finally { // 8. 无论成功失败都要解除状态 this.setData({ isLoading: false }); wx.hideNavigationBarLoading(); wx.stopPullDownRefresh(); // 如果配合了下拉刷新这里需要停止 } }, })关键点解析数据拼接逻辑 (articleList: pageNum 1 ? ...)这是分页的核心。第一次加载pageNum 1时直接用新数据覆盖旧数组后续加载时使用扩展运算符...将新数组追加到旧数组末尾。这个操作性能很好并且会触发视图层的差异更新。hasMore的判断逻辑最准确的方式是依赖后端返回的数据总数 (total)。用“当前已加载数量”与“总数”比较比单纯判断“返回的列表是否小于pageSize”更可靠因为最后一页数据可能正好等于pageSize。错误处理的完整性使用了try...catch包裹异步请求能同时捕获网络错误和业务逻辑错误。在finally块中重置状态保证了逻辑的健壮性。3.3 第三步在 onReachBottom 中调用加载函数这一步反而最简单因为核心逻辑已经在loadData里了。// pages/article-list/article-list.js Page({ // ... 之前的代码 onReachBottom() { // 触底时加载下一页 if (this.data.hasMore !this.data.isLoading) { const nextPage this.data.pageNum 1; this.loadData(nextPage); } }, })为什么这里还要检查hasMore和isLoading这是一种双保险。虽然loadData函数开头已经检查了但在onReachBottom入口处再做一次检查可以避免不必要的函数调用是更优的性能实践。特别是isLoading检查能有效防止网络慢时用户的连续滑动导致请求队列堆积。3.4 第四步WXML 视图层的基本结构视图层需要根据data中的状态展示不同的UI。!-- pages/article-list/article-list.wxml -- view classpage !-- 错误提示 -- view wx:if{{errorMsg}} classerror-tip {{errorMsg}} button bindtaponRetry重试/button /view !-- 空状态 -- view wx:elif{{isEmpty}} classempty-state image src/images/empty.png modeaspectFit/image text暂无内容/text /view !-- 文章列表 -- view wx:else classarticle-list block wx:for{{articleList}} wx:keyid view classarticle-item bindtaponArticleTap>Page({ data: { // ... 其他状态 loadingLock: false, // 改用更语义化的名字 }, onReachBottom() { // 使用节流思路手动控制触发频率 if (this.throttleTimer) { clearTimeout(this.throttleTimer); } this.throttleTimer setTimeout(() { this._onReachBottomHandler(); }, 200); // 200ms内只执行一次 }, _onReachBottomHandler() { if (!this.data.hasMore || this.data.loadingLock) { return; } const nextPage this.data.pageNum 1; this.loadData(nextPage); }, // 在 loadData 的开始和 finally 中正确设置和清除 loadingLock async loadData(pageNum) { if (this.data.loadingLock) return; this.setData({ loadingLock: true }); // ... 请求逻辑 finally { this.setData({ loadingLock: false }); } } })为什么是节流而不是防抖防抖Debounce是“等你停下来多久后再执行”适合搜索框。而触底加载是“在一定时间内只执行一次”更适合用节流。200ms是一个比较合理的间隔既能平滑快速操作又不至于让用户觉得响应迟钝。4.2 分页参数的设计与“游标”分页我们上面用的是经典的pageNumpageSize分页。但它有一个潜在问题在数据频繁增删的场景下可能导致重复或遗漏。例如你刚看完第2页此时第1页新增了一条数据你再请求第3页时实际拿到的是原来的第2页数据。解决方案是使用“游标”Cursor分页也叫基于时间或ID的分页。后端不返回total和pageNum而是返回每页数据最后一条的标识如最后一条数据的id或createTime。前端请求时带上这个“游标”后端返回这个游标之后的数据。// 请求参数 { lastId: 上一条数据的ID, // 第一次请求可为空或0 size: 10 } // 响应数据 { list: [...], nextCursor: 本页最后一条数据的ID // 用于下一次请求 }在微信小程序中实现游标分页你需要将data中的pageNum替换为lastId或nextCursor并在loadData和onReachBottom中相应调整逻辑。这种方式更适合动态性强的feed流。4.3 列表性能优化key 的使用与图片懒加载当列表很长时滚动性能会成为瓶颈。有两个立竿见影的优化点为wx:for指定唯一的wx:key我们之前的例子用了wx:keyid。这非常重要它帮助小程序框架识别列表中节点的唯一性在数据更新时高效地复用已有的节点而不是重新创建能极大提升列表更新性能。图片懒加载小程序 image 组件自带lazy-load属性。对于列表中的图片一定要加上。image classcover src{{item.coverUrl}} modeaspectFill lazy-load/image加了lazy-load后图片只在即将进入视口若干屏幕距离内时才开始加载大幅减少初次渲染的压力和流量消耗。4.4 复杂页面布局下的触底距离调整如果你的页面布局复杂比如底部有一个固定的Tab栏或操作栏默认的50px触底距离可能让用户需要滚动到底部很深处才能触发加载体验不好。你可以在页面的.json配置文件中调整onReachBottomDistance// pages/article-list/article-list.json { onReachBottomDistance: 100 }这个值需要根据你底部固定区域的高度来设定。通常设置为略大于固定区域的高度这样当固定区域刚出现时就会触发加载体验更流畅。你可以通过实际调试来确定最佳值。4.5 与下拉刷新 onPullDownRefresh 的协同内容列表通常需要“下拉刷新”和“触底加载”这对组合拳。它们协同工作的要点是在onPullDownRefresh中调用loadData(1)。注意此时loadData函数内部应该用新数据覆盖旧列表我们之前的逻辑已经通过pageNum 1实现了。在loadData的finally块中无论成功失败都要调用wx.stopPullDownRefresh()来停止刷新动画我们之前的代码也已经做了。状态重置下拉刷新时除了重置列表别忘了把pageNum重置为1hasMore重置为true。这些状态重置最好在调用loadData(1)之前进行。onPullDownRefresh() { // 重置分页状态 this.setData({ pageNum: 1, hasMore: true }); // 重新加载第一页数据 this.loadData(1); }5. 实战中高频问题排查与解决即使代码写得再严谨上线后还是会遇到各种奇怪的问题。下面是我收集的几个最常见的问题和排查思路。5.1 问题onReachBottom 根本不触发排查步骤检查页面配置首先确认页面.json文件没有设置disableScroll: true。这个配置会禁用页面滚动自然无法触底。检查页面结构确认页面内容高度是否足以超过屏幕高度产生滚动条。可以给页面最外层容器加个背景色看看高度是否撑开。检查滚动容器你是否在页面中使用了scroll-view并设置了固定高度如果是页面自身的滚动条就不会出现onReachBottom也不会触发。解决方案是要么改用scroll-view的bindscrolltolower事件要么去掉scroll-view的固定高度让页面自然滚动。检查触底距离是不是底部有巨大空白导致实际触底距离远超onReachBottomDistance可以临时把这个值调大比如500来测试。基础代码检查确认onReachBottom函数是否正确定义在 Page 参数中函数名是否拼写正确。5.2 问题onReachBottom 被疯狂重复触发原因与解决没有加锁 (isLoading)这是最主要的原因。确保在请求开始前上锁请求结束后无论成功失败释放锁。hasMore状态未及时更新如果后端数据已加载完毕但hasMore还是true就会一直触发。确保根据后端返回的数据总数或列表长度正确更新hasMore。快速滑动与异步响应即使有锁在极快速滑动下异步的setData可能来不及更新视图和状态。此时需要加上前面提到的节流控制从事件触发源头进行限制。5.3 问题列表更新时页面跳动或闪烁原因与解决wx:key使用不当或不唯一确保wx:key的值是列表中每个项唯一且稳定的标识符如数据库主键id。如果使用数组索引index作为 key当列表数据顺序变化如下拉刷新后顺序可能变时会导致节点识别错误引发不必要的重新渲染和闪烁。图片加载导致的布局重排列表中的图片如果没有固定宽高加载完成后会突然撑开布局导致跳动。务必给图片容器或图片本身设置固定的宽高或者使用modeaspectFill并配合固定宽高容器。复杂的列表项模板如果每个列表项的结构非常复杂setData大量数据时渲染压力大。可以考虑使用小程序提供的wx:if和hidden来控制复杂子组件的显示或者使用纯数据字段来减少非视图数据的传输开销。5.4 问题在自定义组件中如何使用页面触底事件如果你把列表做成了一个自定义组件而触底逻辑需要在页面层级控制有两种方式事件通信在自定义组件内部监听其自身的触底可能需要自己用scroll-view实现然后通过this.triggerEvent(lower)向父页面触发事件。页面在引用组件时监听这个事件。页面监听组件执行推荐更常见的做法是触底逻辑依然放在页面中利用页面的onReachBottom但页面将加载数据和操作列表的方法通过this.selectComponent传递给自定义组件或者通过 Props 将控制参数如loadMore传入组件由组件内部执行具体的数据加载和渲染。这样逻辑更清晰符合“页面管交互组件管渲染”的原则。6. 超越基础打造极致的列表体验当基础功能稳如泰山后我们可以追求更极致的用户体验。这里分享两个进阶实践。6.1 实现“滚动位置记忆与恢复”在微信小程序中从列表页点击进入详情页再返回列表页时列表会滚动到顶部用户需要重新找到刚才的位置体验很差。我们可以利用 Page 生命周期和小程序自带的页面栈管理来模拟位置记忆。核心思路离开时记录在列表页的onHide或onUnload生命周期里使用wx.createSelectorQuery()获取当前滚动位置scrollTop并存入全局变量如getApp().globalData或本地缓存。返回时恢复在列表页的onShow生命周期里读取之前保存的scrollTop然后使用wx.pageScrollTo()将页面滚动到指定位置。// 在列表页 page 中 data: { scrollTop: 0 }, onShow() { // 从全局状态读取保存的位置 const savedScrollTop getApp().globalData.listScrollTop; if (savedScrollTop 0) { wx.pageScrollTo({ scrollTop: savedScrollTop, duration: 0 // 瞬间跳转无动画 }); // 恢复后清空避免下次进入异常 getApp().globalData.listScrollTop 0; } }, onPageScroll(e) { // 实时记录滚动位置可选防丢失 this.data.scrollTop e.scrollTop; }, onHide() { // 页面隐藏时保存当前位置 getApp().globalData.listScrollTop this.data.scrollTop; }注意这种方法在列表数据发生增删如下拉刷新后恢复的位置可能不准确。更复杂的方案需要记录滚动位置对应的列表项ID返回时根据ID计算位置但实现成本较高。6.2 添加“回到顶部”浮动按钮长列表必备功能。实现很简单在WXML底部添加一个固定定位的按钮用wx:if{{showBackTop}}控制显示。在onPageScroll事件中根据滚动距离e.scrollTop来决定何时显示这个按钮例如滚动超过一屏高度时显示。按钮的点击事件绑定一个调用wx.pageScrollTo({ scrollTop: 0 })的函数即可。data: { showBackTop: false }, onPageScroll(e) { const show e.scrollTop 500; // 超过500px显示 if (show ! this.data.showBackTop) { this.setData({ showBackTop: show }); } }, onBackTopTap() { wx.pageScrollTo({ scrollTop: 0, duration: 300 }); }这些优化点虽然小但能显著提升你小程序的专业度和用户好感。onReachBottom的实现从能用到好用再到稳定、体验优秀每一步都需要开发者对细节有深入的思考和把控。希望这篇近万字的详解能帮你彻底掌握这个功能做出让用户愿意一直往下滑的流畅列表。

相关新闻

15个Obsidian美化技巧终极指南:打造你的专属知识管理空间

15个Obsidian美化技巧终极指南:打造你的专属知识管理空间

15个Obsidian美化技巧终极指南:打造你的专属知识管理空间 【免费下载链接】awesome-obsidian 🕶️ Awesome stuff for Obsidian 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-obsidian Obsidian作为当前最受欢迎的知识管理工具之一&…

2026/9/24 22:29:13 阅读更多 →
解锁微信聊天数据的三种魔法:从记忆碎片到AI伙伴的奇妙旅程

解锁微信聊天数据的三种魔法:从记忆碎片到AI伙伴的奇妙旅程

解锁微信聊天数据的三种魔法:从记忆碎片到AI伙伴的奇妙旅程 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/…

2026/10/10 19:06:14 阅读更多 →
[具身智能-806]:全自主移动机器人完整链路解析:从AI导航决策到机械运动落地的分层工作原理。

[具身智能-806]:全自主移动机器人完整链路解析:从AI导航决策到机械运动落地的分层工作原理。

人 遥控器 RDK X5 亚博 STM32 运动扩展板 电机驱动 电机 机械本体中,人 遥控器 RDK X5 上运行的视觉检测 激光雷达测距算法 小车导航算法,并向运动控制板发送整机的运动速度和方向请求; 亚博 STM32 运动扩展板负责运动学算法&#…

2026/10/7 9:28:44 阅读更多 →

最新新闻

从零搭建Open Code Review机制:流程设计、工具分工与踩坑总结

从零搭建Open Code Review机制:流程设计、工具分工与踩坑总结

我最近在看团队半年的代码审查记录,发现一个很有意思的分化:同一套 open-code-review 实践,有的模块越审越好,有的模块审了两周就开始走形式。差别根本不在工具,而在于团队对“代码审查到底在审什么”这件事的认知。这…

2026/10/13 16:44:26 阅读更多 →
AI应用落地加速:Claude Haiku 5.5、GPT-6免费与Manus重返北京的工程实践

AI应用落地加速:Claude Haiku 5.5、GPT-6免费与Manus重返北京的工程实践

今天上午我习惯性地打开工作后台,准备把本周的自动化任务整体重跑一遍。刚刷开技术群,置顶消息已经被截图刷屏:Claude Haiku 5.5正式发布,GPT-6免费开放,Manus重返北京。三件事挤在同一天,看起来各自独立&a…

2026/10/13 16:44:26 阅读更多 →
知识工作插件体系:从信息收集到高效输出的完整实践

知识工作插件体系:从信息收集到高效输出的完整实践

1. 先想清楚:知识工作到底缺什么1.1 从痛点反推需求我做了个小范围调研,问了一圈身边做技术、做产品、做设计的同事,大家反馈最集中的问题有三个:信息散、找起来慢、重复劳动多。一个技术负责人跟我说,他每天至少有四十…

2026/10/13 16:44:26 阅读更多 →
Agent Skills不是长提示词:SKILL.md、按需加载与权限边界实战

Agent Skills不是长提示词:SKILL.md、按需加载与权限边界实战

在把二十多个技能说明硬塞进系统提示词吃了一个多月苦头之后,我对“Agent Skills 就是长提示词”这个说法真的忍不了了。最初我也觉得,上下文窗口都这么大了,每个技能写一段说明丢进去,模型看到关键词自然会调用,何必搞…

2026/10/13 16:44:26 阅读更多 →
AI编程工具实战指南:从代码生成到结对协作的完整工作流

AI编程工具实战指南:从代码生成到结对协作的完整工作流

最近不少朋友问我,AI 编程工具到底怎么选、怎么用,才能真的提升开发效率,而不是让代码仓库里多一堆“看起来能用”的垃圾代码。我前前后后折腾了大半年,把主流的几种 AI 编程工具、方法论和工作流都实际试过一遍,踩过不…

2026/10/13 16:44:26 阅读更多 →
21天敏捷生命周期实战训练:从价值流到自组织的闭环训练

21天敏捷生命周期实战训练:从价值流到自组织的闭环训练

1. 这不是速成班,是21天重建项目管理思维的实操训练营“敏捷项目管理21天学习计划——敏捷生命周期”,光看标题,很多人第一反应是:又一个打卡式知识付费产品?刷完21天短视频就变敏捷专家?我带过6个跨部门敏…

2026/10/13 16:43:25 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →