uni-app自定义组件与动画实战:解决App端数组渲染动画失效
1. 从一个真实踩坑说起为什么自定义组件和动画在uni-app里容易翻车做uni-app项目的人十有八九都经历过这样一个阶段页面能跑起来接口能调通列表能渲染感觉自己已经摸到了跨端开发的门道。然后产品经理过来说这个卡片要能点开收起那个按钮要有个弹跳效果列表项要支持左滑删除而且这些交互在App端和H5端都得一致。这时候你才发现真正让人头疼的不是业务逻辑而是组件封装和动画表现。我自己接手过一个商品展示类的项目页面结构不复杂顶部一个轮播中间一个商品列表底部一个操作栏。听起来很简单对吧但实际做的时候问题一个接一个冒出来。商品列表需要支持点击展开详情展开的时候要有一个高度变化的动画操作栏的按钮需要根据用户是否登录、是否有库存、是否在活动期间显示不同的状态和样式轮播图在App端正常到了H5端尺寸计算又出了问题。这些需求单独看都不难但放在一起再加上uni-app本身的跨端特性就变成了一团乱麻。这篇文章就是围绕这个场景展开的。我会从自定义组件的封装思路讲起把组件传值的几种方式掰开揉碎说清楚然后重点分析uni.createAnimation()在App端遇到数组渲染时动画失效的问题给出可复现的解决方案。内容适合已经了解uni-app基础语法、做过一两个页面但还没系统整理过组件化方案的开发者。如果你正在被组件通信或者动画不生效的问题困扰这篇应该能帮你省下不少查文档和试错的时间。2. 自定义组件的设计思路与传值方案选型2.1 为什么一定要做自定义组件很多人刚开始写uni-app的时候习惯把所有代码堆在一个页面文件里。页面少的时候没问题一旦页面超过五个或者同一个模块在多个页面出现维护成本就会急剧上升。我见过一个项目商品卡片在首页、分类页、搜索页、收藏页都出现了每个页面都复制了一份几乎相同的模板和样式。后来产品要求改一下卡片的圆角和阴影开发者改了四个地方漏了一个线上就出现了样式不一致的问题。自定义组件的核心价值在于封装复用和职责分离。把商品卡片封装成一个组件所有页面引用同一个组件样式和逻辑只维护一份。组件内部负责展示和交互外部负责数据获取和业务处理边界清晰之后调试和迭代都会轻松很多。在uni-app里创建自定义组件很简单在components目录下新建一个.vue文件然后在页面中通过import引入并注册即可。但真正决定组件好不好用的是props的设计和事件的设计。props定义组件需要什么数据事件定义组件向外传递什么信息。这两个设计好了组件就是一个黑盒外部不需要关心内部实现。2.2 组件传值的四种方式及适用场景uni-app的组件传值方式主要有四种每种都有它的适用场景和局限性。我整理了一个对比表格方便你快速判断该用哪种。传值方式方向适用场景局限性props父传子父组件向子组件传递数据单向数据流子组件不能直接修改$emit子传父子组件向父组件通知事件只能传递事件和数据不适合跨层级provide/inject跨层级祖先组件向后代组件传递数据非响应式数据变化不会自动更新Vuex/Pinia全局多个组件共享状态引入状态管理库增加复杂度props是最常用的方式父组件通过属性绑定的方式把数据传给子组件。这里有一个容易踩的坑props是单向数据流子组件不能直接修改props的值。如果你在子组件里写了this.title 新标题控制台会报错。正确的做法是在子组件里定义一个data把props的值赋给data然后修改data。或者通过$emit通知父组件让父组件去修改。$emit是子组件向父组件通信的标准方式。子组件通过this.$emit(事件名, 数据)触发事件父组件通过事件名处理函数监听。这里的关键是事件名的命名建议使用kebab-case短横线分隔比如item-click、status-change避免使用驼峰命名因为在某些平台上驼峰事件名可能无法正确匹配。provide/inject适合跨层级传值比如一个主题配置或者用户信息从根组件传递到深层子组件。但要注意provide/inject默认不是响应式的。如果你在provide里传递了一个对象后来修改了这个对象的属性inject接收到的值不会自动更新。如果需要响应式可以传递一个ref或者reactive对象或者使用Vuex/Pinia来管理全局状态。2.3 组件设计中的props验证与默认值props定义的时候建议加上类型验证和默认值。这不仅是为了代码规范更是为了在开发阶段尽早发现问题。比如一个商品卡片组件price属性应该是Number类型如果父组件传了一个字符串控制台会给出警告你就能及时发现数据格式的问题。props: { title: { type: String, default: }, price: { type: Number, default: 0 }, tags: { type: Array, default: () [] }, status: { type: String, default: normal, validator: (value) { return [normal, active, disabled].includes(value) } } }注意数组和对象的默认值必须用工厂函数返回不能直接写default: []。这是因为如果直接写空数组所有组件实例会共享同一个数组引用一个组件修改了数组其他组件也会受到影响。这是一个很隐蔽的bug我在实际项目中遇到过排查了很久才发现是默认值写法的问题。3. uni.createAnimation()在App端数组渲染失效的深度排查3.1 问题现象与复现条件这个问题的典型表现是在H5端列表项的动画正常执行点击展开、收起都有过渡效果但打包到App端之后动画完全失效点击之后元素瞬间变化没有任何过渡。更奇怪的是如果列表不是通过v-for渲染的而是写死的几个元素动画在App端又是正常的。我当时的代码结构大概是这样的一个商品列表通过v-for渲染每个列表项有一个展开收起的按钮点击按钮时通过uni.createAnimation()创建一个动画实例然后改变高度或者透明度。代码逻辑在H5端跑得通App端就是不动。复现条件很明确使用v-for渲染多个元素每个元素都需要独立的动画实例且动画实例在循环内部创建。如果你只创建一个动画实例然后应用到多个元素上在App端也会出问题因为动画实例是绑定到具体元素的多个元素共享一个实例会导致动画错乱。3.2 为什么H5正常而App异常要理解这个问题需要先了解uni-app的跨端渲染机制。H5端最终渲染的是真实的DOM元素uni.createAnimation()在H5端的实现是基于CSS3的transition和transform浏览器原生支持所以动画正常。而App端无论是iOS还是Android的渲染层是原生控件动画的实现依赖于原生端的动画引擎uni.createAnimation()在App端是通过原生模块来驱动动画的。当你在v-for内部创建动画实例时每次循环都会调用uni.createAnimation()生成一个新的动画实例。在H5端这些实例各自绑定到对应的DOM元素互不干扰。但在App端动画实例的创建和绑定机制不同如果在循环内部频繁创建实例可能会导致实例与元素的绑定关系错乱或者动画数据没有正确同步到原生层最终表现为动画不生效。另一个可能的原因是动画数据的更新时机。在App端动画数据需要通过animationData绑定到元素的animation属性上。如果你在循环内部创建实例然后立即调用step()和export()可能在元素还没有完成渲染的时候就执行了动画导致动画丢失。H5端因为DOM操作是同步的这个问题不明显但App端的渲染是异步的时序问题就会被放大。3.3 解决方案与代码实现解决这个问题的核心思路是不要在循环内部创建动画实例而是为每个需要动画的元素预先创建独立的动画实例并通过索引或唯一标识来管理。具体做法是在data中定义一个数组用来存放每个列表项的动画数据。然后在onLoad或者数据初始化的时候为每个列表项创建一个动画实例并把export()出来的动画数据存到数组中。模板中通过索引绑定对应的动画数据。export default { data() { return { list: [], animationData: [] } }, methods: { initAnimations() { this.animationData this.list.map(() { const animation uni.createAnimation({ duration: 300, timingFunction: ease-in-out }) return animation.export() }) }, toggleItem(index) { const animation uni.createAnimation({ duration: 300, timingFunction: ease-in-out }) const item this.list[index] if (item.expanded) { animation.height(0).opacity(0).step() item.expanded false } else { animation.height(200).opacity(1).step() item.expanded true } this.$set(this.animationData, index, animation.export()) } } }模板中的写法view v-for(item, index) in list :keyitem.id view classitem-header clicktoggleItem(index) {{ item.title }} /view view classitem-content :animationanimationData[index] {{ item.content }} /view /view这里有几个关键点需要注意。第一animationData必须是一个数组且长度与list一致每个元素对应一个列表项的动画数据。第二更新动画数据时必须使用this.$set()或者直接替换整个数组不能通过this.animationData[index] xxx的方式赋值因为Vue无法检测到数组索引的直接修改。第三uni.createAnimation()的参数中duration和timingFunction要根据实际需求调整duration太短动画不明显太长又显得拖沓300ms是一个比较适中的值。3.4 替代方案CSS类名切换实现动画如果uni.createAnimation()在App端的问题实在难以解决或者项目对动画的要求不高可以考虑使用CSS类名切换的方式来实现动画。这种方式在H5端和App端都支持而且性能更好代码也更简洁。思路是定义两组CSS类一组是展开状态一组是收起状态通过动态绑定class来切换。过渡效果通过transition属性来实现。.item-content { height: 0; opacity: 0; overflow: hidden; transition: height 0.3s ease-in-out, opacity 0.3s ease-in-out; } .item-content.expanded { height: 200px; opacity: 1; }view classitem-content :class{ expanded: item.expanded } {{ item.content }} /view这种方式的优点是代码简单、性能好、跨端一致。缺点是动画能力有限只能做CSS支持的过渡效果复杂的序列动画或者路径动画就做不了。但对于大多数列表展开收起、淡入淡出、位移旋转的需求CSS类名切换已经足够了。提示如果使用CSS类名切换注意height的过渡需要明确的高度值不能使用auto。如果内容高度不固定可以使用max-height来替代设置一个足够大的值但要注意动画速度会受到影响。4. 完整实战商品列表组件的封装与动画实现4.1 组件结构设计与数据流规划现在把前面的知识点串起来做一个完整的商品列表组件。这个组件需要满足以下需求列表项支持点击展开详情展开时有高度过渡动画每个列表项显示商品名称、价格、标签点击列表项时向父组件传递商品ID和当前展开状态。组件的数据流设计如下父组件通过props传递商品列表数据给子组件子组件内部维护每个列表项的展开状态子组件通过$emit向父组件通知点击事件和状态变化。动画方面采用CSS类名切换的方式避免uni.createAnimation()在App端的不确定性。组件的props定义props: { goodsList: { type: Array, default: () [] }, duration: { type: Number, default: 300 } }子组件内部维护一个expandedMap对象用来记录每个商品的展开状态。为什么不直接在goodsList的每一项上加expanded字段因为props是单向数据流子组件不应该直接修改父组件传递的数据。用一个独立的expandedMap来管理状态既符合Vue的设计原则也避免了数据污染。data() { return { expandedMap: {} } }, methods: { toggleItem(item) { const id item.id const newState !this.expandedMap[id] this.$set(this.expandedMap, id, newState) this.$emit(item-toggle, { id: id, expanded: newState }) } }4.2 模板编写与样式处理细节模板部分需要注意几个细节。第一v-for的key必须使用唯一标识建议使用商品ID不要使用索引因为索引在列表排序或删除时会变化导致渲染错误。第二展开内容的容器需要设置overflow: hidden否则高度过渡时内容会溢出。第三点击事件绑定在列表项的头部而不是整个列表项避免展开后点击内容区域也触发收起。view classgoods-list view classgoods-item v-foritem in goodsList :keyitem.id view classgoods-header clicktoggleItem(item) text classgoods-name{{ item.name }}/text text classgoods-price¥{{ item.price }}/text view classgoods-tags text classtag v-fortag in item.tags :keytag {{ tag }}/text /view /view view classgoods-detail :class{ expanded: expandedMap[item.id] } :style{ transitionDuration: duration ms } text{{ item.description }}/text /view /view /view样式方面.goods-detail的初始状态是height: 0; opacity: 0; overflow: hidden;展开状态是height: auto; opacity: 1;。但前面提到过height: auto无法触发过渡动画。解决方案是使用max-height设置一个足够大的值比如500px同时配合opacity的变化视觉效果上可以接受。.goods-detail { height: 0; max-height: 0; opacity: 0; overflow: hidden; transition-property: max-height, opacity; transition-timing-function: ease-in-out; } .goods-detail.expanded { max-height: 500px; opacity: 1; }transitionDuration通过内联样式动态设置这样父组件可以通过props控制动画时长增加了组件的灵活性。4.3 父组件调用与事件处理父组件引入并注册组件后通过props传递数据通过事件监听处理业务逻辑。template view classpage goods-list :goods-listlist :duration400 item-togglehandleItemToggle / /view /template script import GoodsList from /components/goods-list.vue export default { components: { GoodsList }, data() { return { list: [] } }, onLoad() { this.fetchList() }, methods: { fetchList() { this.list [ { id: 1, name: 商品A, price: 99, tags: [热销, 包邮], description: 这是商品A的详细描述信息 }, { id: 2, name: 商品B, price: 199, tags: [新品], description: 这是商品B的详细描述信息 } ] }, handleItemToggle(e) { console.log(商品ID:, e.id, 展开状态:, e.expanded) } } } /script这里有一个实操心得事件传递的数据结构要统一。我习惯把事件数据封装成一个对象包含id和expanded两个字段这样父组件处理的时候不需要再去查列表数据直接使用事件参数即可。如果事件数据只是一个ID父组件还需要遍历列表找到对应的项代码会更繁琐。5. 常见问题排查与避坑经验汇总5.1 组件传值常见问题速查问题现象可能原因解决方案子组件修改props报错直接修改了props的值用data中转或通过$emit通知父组件父组件数据变化子组件不更新传递的是基本类型且子组件用data接收了使用watch监听props变化或直接使用props$emit事件父组件收不到事件名大小写不一致统一使用kebab-case命名provide的数据不响应provide/inject默认非响应式传递ref或reactive对象数组props默认值共享默认值直接写了[]使用工厂函数() []5.2 动画不生效的排查思路遇到动画不生效按照以下顺序排查。第一确认动画数据是否绑定到了正确的元素上检查模板中的:animation或:class绑定是否正确。第二确认动画数据是否更新了在step()和export()之后打印一下数据看看是否有变化。第三如果是App端不生效检查是否在v-for内部创建了动画实例如果是改成预先创建或者使用CSS类名切换。第四检查元素的初始状态和结束状态是否有差异如果高度从0变到0动画自然看不出来。第五检查duration是否设置得太短比如10ms肉眼几乎看不出动画效果。注意在App端使用uni.createAnimation()时如果元素是通过v-if控制的动画实例需要在元素渲染完成后再创建否则动画会绑定到不存在的元素上。可以在$nextTick中创建动画实例。5.3 性能优化与代码组织建议列表渲染的性能优化核心是减少不必要的渲染。v-for的key要稳定不要用索引。如果列表项组件比较复杂可以考虑使用Object.freeze()冻结不需要响应式的数据减少Vue的响应式开销。动画方面优先使用CSS的transform和opacity这两个属性不会触发浏览器的重排性能最好。height和width的动画会触发重排性能较差如果列表项很多建议用transform: scaleY()来模拟高度变化。代码组织方面建议把组件按照功能分类放在不同的目录下比如components/goods/、components/user/、components/common/。每个组件目录下可以放.vue文件、样式文件、工具函数等。组件的命名要语义化goods-list比list好user-avatar比avatar好。这样在项目规模变大之后查找和维护都会方便很多。5.4 跨端兼容的注意事项uni-app的跨端特性决定了同一套代码在不同平台上的表现可能有差异。除了动画问题还有几个常见的兼容性坑。第一rpx单位在H5端的计算方式与App端不同如果对尺寸要求严格建议使用px或者通过uni.upx2px()进行转换。第二scroll-view在App端和H5端的滚动行为有差异App端需要设置scroll-y或scroll-xH5端还需要设置高度。第三position: fixed在App端的表现与H5端不同App端建议使用uni-app提供的cover-view或者调整布局方案。第四localStorage在App端不支持需要使用uni.setStorageSync()和uni.getStorageSync()。这些兼容性问题最好的解决方式是在开发阶段就同时在H5端和App端进行测试不要等到打包上线才发现问题。我习惯在开发过程中每完成一个功能模块就在两个端各跑一遍确认表现一致后再继续。虽然这样开发速度会慢一些但能避免后期大量的兼容性修复工作。5.5 调试技巧与工具使用App端的调试比H5端麻烦一些但也有一些实用的技巧。第一使用console.log输出日志在HBuilderX的控制台可以看到App端的日志。第二使用uni.showToast()或者uni.showModal()来输出调试信息适合在真机上调试时使用。第三HBuilderX提供了真机运行功能可以直接在手机上查看效果比模拟器更准确。第四如果遇到原生层面的问题可以查看App端的日志文件Android端可以通过adb logcat查看iOS端可以通过Xcode的控制台查看。对于动画调试可以在动画执行前后打印时间戳计算实际执行时间判断动画是否被跳过。也可以在动画的step()之间添加setTimeout观察每一步的效果定位问题出在哪一步。6. 写在最后一些个人体会做uni-app开发这几年我最大的感受是跨端框架的便利性是有代价的。你省去了写两套代码的时间但需要在兼容性上花更多心思。自定义组件和动画这两个点恰好是跨端差异最明显的地方。组件传值的方式选择、动画实现方案的选择都需要根据项目的实际需求和目标平台来决定没有银弹。uni.createAnimation()在App端数组渲染失效的问题我前后遇到过三次每次的场景略有不同但核心原因都是动画实例的创建时机和绑定方式。后来我养成了一个习惯凡是涉及列表动画优先考虑CSS类名切换。只有在CSS无法实现的复杂动画场景下才使用uni.createAnimation()并且一定会预先创建动画实例通过索引管理。这个习惯帮我省了很多调试时间。另外组件的props设计要克制。不要试图把一个组件的所有可能配置都通过props暴露出来那样组件的使用成本会很高。只暴露必要的、常用的配置其他的通过插槽或者事件来处理。组件的职责越单一复用性越高维护成本越低。最后分享一个小技巧在封装组件的时候可以在组件内部加一个debug属性当debug为true时输出关键的日志信息。这样在排查问题时只需要在父组件传一个debug属性就能看到组件内部的运行状态不需要到处加console.log。这个技巧在调试复杂组件时特别有用。

相关新闻

深入理解NOR Flash:存储原理、硬件电路与嵌入式驱动开发要点

深入理解NOR Flash:存储原理、硬件电路与嵌入式驱动开发要点

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

2026/10/17 13:08:17 阅读更多 →
PowerBuilder选课成绩系统实战解析:DataWindow与C/S架构技术内幕

PowerBuilder选课成绩系统实战解析:DataWindow与C/S架构技术内幕

1. 项目概述1.1 为什么今天还要看 PowerBuilder很多入行三五年的开发者可能都没听说过 PowerBuilder,甚至有人把它归为“上古技术”。但我可以负责任地说,PowerBuilder 至今仍然在大量高校、政务、医疗、制造等行业的存量信息系统中运行,承担…

2026/10/17 13:08:17 阅读更多 →
Flutter跨平台开发实战:从项目架构到性能优化的完整避坑指南

Flutter跨平台开发实战:从项目架构到性能优化的完整避坑指南

1. 从零搭建一个Flutter应用,我踩过的坑和总结的实战经验移动端跨平台开发这件事,做了几年之后你会发现,真正让人头疼的从来不是“能不能跑起来”,而是“跑起来之后能不能稳住”。Flutter作为目前跨平台方案里比较成熟的一个选择&…

2026/10/17 13:07:17 阅读更多 →

最新新闻

codex针对java+vue的Prompt提示词:用TaoToken统一Key跑通前后端联调

codex针对java+vue的Prompt提示词:用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/17 15:00:39 阅读更多 →
Oracle 11g 升级 19C 实战避坑:DBUA 报错、RMAN 恢复与时区版本全解析

Oracle 11g 升级 19C 实战避坑:DBUA 报错、RMAN 恢复与时区版本全解析

简介:这份Oracle 11g到19C数据库升级详尽指导手册,面向具备一定运维能力的数据库管理员(DBA)及运维工程师,聚焦利用DBUA工具将11g单机数据库安全迁移至19C的完整流程。内容涵盖前期备份与恢复、升级路线选择、环境说明…

2026/10/17 15:00:39 阅读更多 →
ZooKeeper节点类型详解:持久、临时、顺序节点的原理与实战避坑

ZooKeeper节点类型详解:持久、临时、顺序节点的原理与实战避坑

我这几年在分布式系统上踩的坑,有一大半都跟ZooKeeper的节点类型有关。不管是做分布式锁、服务注册发现,还是元数据存储,选错了节点类型,轻则功能异常,重则线上事故。今天就把这四种节点的特点、原理和使用场景彻底讲透…

2026/10/17 15:00:39 阅读更多 →
好写作AI:期刊论文选题到投稿全流程实操指南

好写作AI:期刊论文选题到投稿全流程实操指南

凌晨三点,对着屏幕上那块光标闪了一晚上的空白文档,手边的咖啡已经第三杯了。讲实话,这种场景在科研生活里太常见了:Introduction写不出逻辑链、文献综述堆了几十篇却不知道从哪句话开始、明明实验数据都齐了结果讨论部分憋不出来…

2026/10/17 15:00:39 阅读更多 →
Spring Boot内嵌Tomcat启动链路:原理、定制与避坑实战

Spring Boot内嵌Tomcat启动链路:原理、定制与避坑实战

简介:《Spring Boot启动过程(四)之内嵌Tomcat启动》是一份面向中高级Spring Boot开发者的PDF解析文档,帮助厘清启动阶段内嵌Web容器的创建、配置与初始化链路。文档以源码调用顺序为主线,先解释createEmbeddedServletC…

2026/10/17 15:00:39 阅读更多 →
分布式计算与并行计算区别详解:选型与实战指南

分布式计算与并行计算区别详解:选型与实战指南

我一直觉得,很多人一听到“分布式计算”和“并行计算”,第一反应是“这不差不多嘛,都是把任务拆开同时算”。实际上这两个概念在大数据处理里的定位差异非常大,用错场景轻则性能没提升,重则整套架构白搭。这篇文章我就…

2026/10/17 14:59:38 阅读更多 →

日新闻

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 阅读更多 →