尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
鸿蒙React Native自定义分段控件实现
1. SegmentControl看着简单为什么到了鸿蒙这里就得自己造轮子先说结论分段控件这东西在iOS和Android上都有现成的原生组件但在OpenHarmony的React Native生态里官方并没有直接给你一个SegmentControl /可以直接用。也就是说你在RN上写惯了SegmentedControlIOS /或者用社区库的SegmentedControl /到鸿蒙这边会扑空——要么组件不渲染要么直接报错说找不到原生模块。SegmentControl本质是什么说白了就是一组互斥的按钮排列在同一个容器里高亮显示当前选中的那一个。它和TabBar的区别在于TabBar通常承载页面级别的导航而SegmentControl大多用在页面内部的筛选、视图切换、子分类切换这种轻量场景里。比如一个商品列表页顶部放“全部 / 在售 / 已下架”或者一个图表页放“按日 / 按周 / 按月”。它和RadioButton的区别在于RadioButton是表单提交用的用户选完需要点确认才生效而SegmentControl是即时生效的用户点哪一段当前内容马上切换不需要额外提交动作。那问题来了OpenHarmony上的RN应用为什么不能直接沿用iOS那套思路因为RN在鸿蒙上走的是自研的原生桥接层鸿蒙侧用ArkUI的组件树去承载RN虚拟DOM映射过来的节点。ArkUI虽然有Tabs、有TabContent有Button但并没有一个语义上完全等价于“分段控件”的现成组件。所以正儿八经的做法是在ArkUI侧自定义一个原生视图再通过RN的组件映射机制暴露给JS侧。这条链路写起来不复杂但每一步都有细节尤其是滑块动画和手势联动这两块很容易踩坑。本文就围绕“在OpenHarmony的React Native项目里实现一个可复用的SegmentControl”展开从原生侧组件的搭建、桥接层的暴露、JS侧封装到滑块动画、手势处理、白屏和布局异常排查一条线拉通。适合已经在鸿蒙RN上跑通基础Demo、准备开始写真实业务页面的开发者也适合打算从零开始接触RN鸿蒙化的朋友——你可以把这一篇当作“如何在鸿蒙RN里造一个自定义原生组件”的完整案例参考。2. 准备工作鸿蒙RN项目里自定义组件的完整链路2.1 环境里必须确认的三件事在写SegmentControl之前先把环境捋一遍。我做这块时用的是DevEco Studio 5.x版本RN通过react-native-oh/react-native这个仓库接入OpenHarmony。这里有三件东西在动手前必须确认到位鸿蒙侧entry模块的oh-package.json5里确认已经添加了RN的依赖。如果项目是直接用社区模板初始化的一般没问题但如果是自己手动搭的工程这一步漏掉会直接导致原生模块无法加载。原生侧自定义组件需要继承RNCComponent这类基类并且要注册到RNCComponent的包管理器里。很多新手在这块翻车——组件文件写了也实现了构造和析构但忘了在PackageProvider或者RNCComponentRegister里注册结果是JS侧调用时始终拿不到原生视图。JS侧必须有一个对应的TurboModule声明用gen-rn或者手动编写NativeSegmentControl.ts这样的接口文件。这块的作用是让TypeScript能识别requireNativeComponent返回的组件类型否则后续绑定事件回调时类型全飘红。这三件事里最容易漏的是第二件。鸿蒙RN的组件注册机制和Android的ReactPackage类似但命名和结构略有差异。我建议你在entry/src/main/ets/下建一个segmentcontrol目录把原生组件、包注册逻辑单独归拢在一起不要堆在pages文件夹里后面维护起来会舒服很多。2.2 为什么SegmentControl在ArkUI侧不能直接用Button硬拼有人可能会说不就是一个容器里放几个按钮吗我在ArkUI里直接写Row塞几个Button设置不同的背景色点击时切换状态不就行了还真不行。问题出在“滑块动效”和“事件互斥”这两个点上。先说滑块动效。SegmentControl最核心的视觉反馈是那个高亮背景块滑块能平滑地从一个选项滑到另一个选项。如果你用Button硬拼每个Button都得自己维护一个“是否选中”的状态然后背景色变化直接瞬间切换。这种生硬的效果在原生App里用户一看就觉得廉价。而且当文字长度不一致时滑块宽度也得跟着变用Button加边框的方式很难做到滑块高度、宽度、位置三者的插值动画同时进行。再说事件互斥。从交互角度讲SegmentControl的选项是互斥的但这不是简单用一个selectedIndex状态就能搞定的因为还要处理“连续快速点击”“动画中点击其他项”这类边界情况。如果你在JS侧写一堆if判断来防抖、防重入代码会越写越丑。比较好的做法是把互斥逻辑下沉到原生侧JS只负责接收“当前选中了哪个索引”这个结果。所以我的方案是在ArkUI侧用Row做容器用Stack做滑块层用Text做选项文本手势和点击通过TapGesture处理动画通过animateTo驱动。所有互斥逻辑、动画数值计算全部留在原生侧JS侧拿到的就是一个简单干净的控件。3. ArkUI原生侧实现从透明度变换到滑块动效的完整拆解3.1 容器布局Row Stack堆叠才是关键在ArkUI里写自定义组件首先要确定布局层级。SegmentControl从视觉上分两层底层是选项文字顶层是滑动的白色/高亮背景。这正好对应ArkUI的Stack布局。我最终的布局是这样组织的Stack ├── Row (背景层圆角矩形内部放两个Text) └── 滑块 (单独的一个圆角矩形通过translate或position控制位置)这里有个细节滑块不能放在Row里面否则它的位置会被Row的布局规则约束很难做自由的平移。滑块必须作为Stack的直接子节点通过坐标控制位置和宽度。用Stack的好处是子节点可以重叠滑块坐标可以直接用position或者translate来控制。我实测下来position在动画过程中的表现比translate更稳定因为translate在部分鸿蒙版本上会受父容器padding影响导致偏移量计算不准确。规避这个坑的方法是给Stack设置一个固定的padding滑块用position定位并把滑动距离的计算基准设为Stack的实际内容宽度。代码可以这样起手CustomComponent export struct SegmentControlNative { Prop selectedIndex: number 0 private options: Arraystring [] private tabWidth: number 0 private sliderWidth: number 0 private sliderOffsetX: number 0 private context: CanvasRenderingContext2D new CanvasRenderingContext2D() build() { Stack({ alignContent: Alignment.Start }) { // 背景层两个选项的文本 Row() { ForEach(this.options, (item: string, index: number) { Text(item) .fontSize(14) .fontColor(this.selectedIndex index ? #FFFFFF : #666666) .textAlign(TextAlign.Center) .layoutWeight(1) .height(100%) .onClick(() { this.onSegmentItemClick(index) }) }, (item: string) item) } .width(100%) .height(100%) .borderRadius(8) .backgroundColor(#F2F3F5) // 滑块层 Column() .width(this.sliderWidth) .height(100%) .borderRadius(8) .backgroundColor(#FFFFFF) .shadow({ radius: 8, color: rgba(0,0,0,0.08), offsetY: 2 }) .position({ x: this.sliderOffsetX, y: 0 }) .animation({ duration: 200, curve: Curve.EaseOut }) } .width(100%) .height(36) .clip(true) } }这里sliderWidth和sliderOffsetX是核心变量。初始时sliderWidth等于容器总宽度除以选项数量sliderOffsetX为0。当用户点击第二个选项时sliderOffsetX变为一个选项的宽度滑块就滑到了第二个位置。3.2 滑块宽度计算到底是等宽还是不等宽这里要做一个设计决定SegmentControl每个选项是否等宽iOS原生的SegmentedControl默认是等宽的无论文字长短每段宽度一样。但很多国内App喜欢做“内容自适应宽度”选项文字长的宽短的窄。如果走等宽路线实现最简单sliderWidth containerWidth / options.lengthsliderOffsetX index * sliderWidth而且不需要动态测量文字宽度性能最好。如果走自适应路线就得在onAreaChange回调里逐个测量每个选项的宽度然后用累加方式计算偏移量。这在ArkUI里也不是不能做但需要用到NodeController或者一定技巧性的onAreaChange嵌套代码复杂度直接上一个台阶。我个人的建议是做通用组件时用等宽做业务定制组件时才用自适应。本文按等宽方案展开这个选择在后面接RN桥接层时能省掉大量麻烦。3.3 点击事件与动画状态互斥点击事件直接挂在每个Text上但核心问题是动画播放期间用户又点了另一个选项怎么办我在原生侧用一个isAnimating标志位来控制。当动画开始时置true动画结束回调里置false。如果isAnimating为true新的点击事件直接忽略。这个做法虽然简单但能有效避免滑块动画叠加导致的抖动和回调乱序。private onSegmentItemClick(index: number): void { if (this.isAnimating || index this.selectedIndex) { return } this.isAnimating true this.selectedIndex index // 计算新的滑块位置 this.sliderOffsetX this.tabWidth * index // 触发动画并通过onFinish回调复位标志位 animateTo({ duration: 200, curve: Curve.EaseOut, onFinish: () { this.isAnimating false } }, () { // 这里放需要动画的属性变化 }) }把这段代码嵌到ArkUI组件里一个基础版的原生SegmentControl就成型了。但注意这里有一个隐藏问题sliderOffsetX是通过状态变量驱动的在函数内先赋值再animateTo某些版本上会出现动画不生效的情况。我的经验是把偏移量变化写在animateTo的回调函数里这样保证属性变化在动画事务内提交滑块才会平滑移动而不是瞬间跳变。4. 桥接层把ArkUI组件变成RN能调用的原生视图4.1 实现RNCComponent基类把状态双向绑定打通ArkUI侧的组件写完后接下来就是要让React Native能创建和控制这个原生视图。在鸿蒙RN架构里这需要实现一个继承自RNCComponent的类这个类负责管理ArkUI组件的生命周期、接收props、向JS侧抛出事件。这一步是整个文章最核心的“接线”环节也是最容易出错的地方。我先给出类的基本骨架export class SegmentControlComponent extends RNCComponent { private segmentController: SegmentControlNativeController new SegmentControlNativeController() constructor(ctx: RNCContext) { super(ctx) } // 创建并返回一个ControllerRN会通过这个Controller来操作原生视图 getComponentController(): RNCComponentController { return this.segmentController } // 渲染时返回ArkUI组件 getComponent(): ESObject { return this.segmentController.component } // props变化时由系统调用 receiveComponentProps(props: ESObject): void { const options props.options as string[] const selectedIndex props.selectedIndex as number this.segmentController.updateOptions(options) this.segmentController.setSelectedIndex(selectedIndex) } }和Android的SimpleViewManager类似RNCComponent是鸿蒙侧把自定义视图注册给RN的入口。receiveComponentProps相当于updatePropertiesJS侧每次diff后都会把最新的props通过这个方法灌到原生侧。4.2 通过RNCComponentController管理组件状态RNCComponentController是真正控制ArkUI组件的对象。它负责创建组件实例、设置初始状态、响应props变更、以及向JS侧发送事件。SegmentControl的Controller核心内容如下export class SegmentControlNativeController extends RNCComponentController { selectedIndex: number 0 isAnimating: boolean false options: Arraystring [] width: number 0 buildComponent(): ESObject { return SegmentControlNative({ options: this.options, selectedIndex: this.selectedIndex, width: this.width, onSelectedIndexChange: (index: number) { // 当原生侧点击事件发生时通过事件回调通知JS层 this.emitSegmentControlChange(index) } }) } setSelectedIndex(index: number): void { this.selectedIndex index this.updateComponent() } updateOptions(options: Arraystring): void { this.options options this.updateComponent() } updateWidth(width: number): void { this.width width this.updateComponent() } emitSegmentControlChange(index: number): void { if (this.component) { this.component.emitComponentEvent(onValueChange, { index }) } } }这里有个非常关键的函数onValueChange是JS侧回调的事件名通过emitComponentEvent发出。在RN的桥接协议里事件名两边的命名需要保持一致否则JS侧接收不到。4.3 注册包与导入漏了这步组件就永远找不到写完成组件和Controller后还有一个必经步骤把SegmentControlComponent注册到RN的组件管理器里。在鸿蒙RN工程中通常需要在模块入口的PackageProvider中追加export class MyRNPackageProvider implements RNPackageProvider { createPackages(): RNPackage[] { return [ new RNPackage({ components: [ { name: SegmentControl, component: SegmentControlComponent } ] }) ] } }这里的name: SegmentControl就是RN JS侧requireNativeComponent时用到的组件名必须严格一致。如果这一步漏了JS侧渲染时会直接报 “Invariant Violation: requireNativeComponent: SegmentControl was not found in the UIManager” 之类的错误。我最初做的时候就是忘了在注册表里加上去折腾了大半天把排查过程写在后面。5. JS侧封装让业务代码用起来像原生RN组件一样自然5.1 声明NativeProps类型和事件回调原生桥接层就绪后回到React Native代码侧。首先要写一个类型声明文件让TypeScript知道SegmentControl这个原生组件接受什么props、回调什么事件。import { HostComponent } from react-native import codegenNativeComponent from react-native/Libraries/Utilities/codegenNativeComponent export interface SegmentControlProps { options: string[] selectedIndex: number onValueChange?: (event: { nativeEvent: { index: number } }) void } export default codegenNativeComponentSegmentControlProps(SegmentControl) as HostComponentSegmentControlProps这里要注意codegenNativeComponent的用法第一个参数必须和原生侧注册的组件名一致也就是SegmentControl。如果你在鸿蒙侧注册的是RCTSegmentControl这里就得写成RCTSegmentControl不能凭喜好更改。为了保持和iOS/Android社区库命名风格统一我保留了SegmentControl这个简洁名称。5.2 在业务页面里组合使用封装好类型后业务侧使用就很简单了import SegmentControl from ../components/SegmentControl export function ProductListPage() { const [filter, setFilter] useState(0) return ( View style{{ flex: 1, paddingTop: 44 }} SegmentControl options{[全部, 在售, 已下架]} selectedIndex{filter} onValueChange{(event) { setFilter(event.nativeEvent.index) }} / {/* 下面根据filter渲染对应列表 */} /View ) }从调用方角度看这和RN里使用普通组件没有区别。selectedIndex是受控属性原生侧的点击会通过onValueChange把新的索引传回来JS侧更新state后再把新的selectedIndex传回原生侧完成一次单向数据流循环。这里要特别提醒selectedIndex的受控属性设计是一个重要的架构决策。对比“原生自己维护状态、JS只管读”的非受控方案受控组件能保证JS侧的filter状态和原生侧高亮永远一致避免两边数据不同步这种经典Bug。代价是多一次往返通信但对SegmentControl这种低频交互组件来说性能完全可接受。5.3 增加受控属性的同步校验受控属性有一个易踩的坑JS侧的state更新是异步的如果用户连续快速点击多个选项onValueChange回调可能还没触发JS侧的重新渲染下一次点击就来了。这时原生侧的selectedIndex和JS侧的filter会出现短暂不一致。我的解法是在原生侧增加一个isAnimating防抖同时JS侧在onValueChange里不再做多余判断无条件setState。因为原生侧已经拦截了动画中的重复点击JS侧接收到的都是“合法点击”的结果。这样职责划分清晰原生管手势和动画JS管状态和应用逻辑。6. 滑块动画和手势处理的进阶细节6.1 点击切换与滑动切换两种交互怎么取舍SegmentControl定义上是一个“点击切换”的控件但很多产品经理会要求支持“左右滑动切换选项”。在原生开发里这需要同时处理点击手势和滑动手势并且要做好手势识别优先级。在ArkUI里实现滑动切换可以在容器外层叠一个PanGesture.gesture( PanGesture() .onActionEnd((event: GestureEvent) { const offsetX event.offsetX if (Math.abs(offsetX) 50) { const targetIndex offsetX 0 ? this.selectedIndex 1 : this.selectedIndex - 1 if (targetIndex 0 targetIndex this.options.length) { this.handleIndexChange(targetIndex) } } }) )注意PanGesture的阈值设置。我测过50像素是一个比较舒服的阈值低于这个值很容易被误判为点击高于100像素则会感觉迟钝。手势结束时的速度也是一个辅助判断维度但SegmentControl这种短距离切换场景用距离判断就够了。6.2 动画曲线与耗时怎样让滑块跟手滑块动画的核心是animateTo的curve参数。我对比了Curve.EaseOut和Curve.EaseInOut两种曲线EaseOut减速运动滑块“冲”到目标位置适合从当前位置滑向新位置的场景感觉轻快。EaseInOut两端缓入缓出适合滑块需要折返的场景比如从第1项跳到第3项中间速度均匀。SegmentControl的选项通常挨在一起滑动距离短用EaseOut加200毫秒是我体验下来最跟手的组合。短于120毫秒会显得抽搐长于300毫秒会拖沓尤其是连续切换时会有一种“懒洋洋”的感觉。还有一个容易被忽略的点动画期间如果JS侧突然传入新的selectedIndex原生侧不应立即打断当前动画而应在当前动画结束后再响应对应变化。我在Controller里做了如下处理setSelectedIndex(index: number): void { if (this.isAnimating) { this.pendingIndex index return } this.selectedIndex index this.updateComponent() }在动画onFinish回调里检查pendingIndex是否有值如果有继续执行下一次切换。这样能保证无论用户怎么快速操作滑块状态都不会错乱。7. 启动白屏、布局偏移、触摸失效这段路我替你们踩过了7.1 冷启动白屏React Native鸿蒙化最经典的坑标题热搜词里有“react native 启动白屏”这确实是鸿蒙RN初期最容易遇到的现象。原因通常有几个一是Bundle加载慢。在Debug模式下RN的JSBundle通过本地服务加载如果DevEco Studio的调试服务和模拟器的网络不在同一个网段或者启动顺序不对就会出现白屏。解决方法是确认Metro服务先启动再启动应用或者直接打Release包看是否正常。二是RN视图没有填充父容器。有些新手把RNCView放在ArkUI的Column里但没设置宽高为100%导致RN的rootView实际大小为0。这个问题定位很隐蔽因为DevEco的预览器里可能能看到文字但真机上就是白屏。检查方法很直接在RN的根组件里加一个背景色如果页面有颜色但没内容说明RN引擎活着、JS没执行如果整个区域都空白多半是原生容器尺寸或初始化时序问题。三是原生组件在RN挂载前就尝试创建。SegmentControl如果在AppRegistry.registerComponent完成前就被某个页面引用也可能导致原生视图创建失败。这不是SegmentControl特有的问题而是所有自定义原生组件通用。稳妥做法是确保所有自定义组件注册逻辑在模块加载阶段完成不要在业务代码里动态加载。7.2 滑块初始位置偏移onLayout的时序陷阱SegmentControl在页面刚加载时滑块位置经常会出现偏移或宽度为0的问题。根因是原生侧还没有拿到容器宽度JS侧就已经把selectedIndex传过来了此时tabWidth为0计算出来的sliderOffsetX自然不对。ArkUI里获取容器宽度有两个时机onAreaChange和首次布局。onAreaChange在组件尺寸变化时触发但它在首次布局时也可能不触发如果尺寸没变化。所以更可靠的方案是在Controller里增加一个宽度就绪的标志位宽度未就绪时所有来自JS的索引变更都先存到pending变量里宽度就绪后再应用。onAreaChangeCallback(width: number): void { this.width width this.isWidthReady true // 如果之前有pending的index在这里应用 if (this.pendingIndex.hasValue()) { this.selectedIndex this.pendingIndex.getValue() this.updateComponent() } }这一步看着不起眼但解决的是“组件首帧渲染对不对”的问题。如果漏掉用户在页面的第一屏上会看到滑块在第一个选项和其他选项之间乱跳一下才归位非常影响观感。7.3 触摸事件时灵时不灵检查是否被父容器手势拦截SegmentControl集成进列表页之后我遇到过一个很隐蔽的问题 页面上下滑动时偶尔会触发SegmentControl的点击反馈或者反过来——SegmentControl的点击偶尔会被列表的滚动手势吞掉。排查后确认是手势冲突。鸿蒙的PanGesture和TapGesture在部分场景下会同时响应尤其是当SegmentControl嵌在Scroll或List容器中时。解决方法是给SegmentControl的点击区域单独挂TapGesture并且设置GestureMask来控制手势响应范围。更直接的做法是给SegmentControl容器的hitTestBehavior设置为HitTestMode.Block确保点击事件不会穿透到下层列表。这个坑在纯页面上层使用时不容易暴露一旦嵌到列表Header里马上就会出现。各位如果在真机上测试发现点击事件时灵时不灵优先怀疑这个点。8. 性能优化与后续扩展思路8.1 减少JS与原生侧的无效通信SegmentControl本身交互频率不高但如果在列表页里每个cell都塞一个或者在一个页面上放了五六个SegmentControl比如筛选面板就需要关注性能。一个关键优化是props不变时不触发原生更新。在receiveComponentProps入口处先做一次浅比较receiveComponentProps(props: ESObject): void { const newOptions props.options as Arraystring const newIndex props.selectedIndex as number if (this.lastOptions newOptions this.lastIndex newIndex) { return } this.lastOptions newOptions this.lastIndex newIndex // ... 后续更新逻辑 }codegenNativeComponent在React内部虽然也会做props diff但这是JS侧到原生侧的diff我们的receiveComponentProps里再做一次能避免Props对象引用变化但值相同的情况触发无谓的原生刷新。8.2 从单个控件提升为可复用组件库当你已经实现了一个SegmentControl剩下的工作其实是“如何把它结构化”以便后续可以复用到其他页面。我建议把组件拆成三层原生层SegmentControlComponent Controller只负责UI展现和交互响应不包含任何业务逻辑。桥接层SegmentControl.ts类型声明文件统一管理props和事件名。业务层在业务目录里封装一个FilterSegment.tsx内部使用SegmentControl外部接收options和onChange如果后续要改成自适应宽度、增加图标支持、改变滑块样式都只需要在这一层做扩展。比如自适应宽度需求业务层可以预先在JS侧通过Text的宽度测量接口算出每个选项的宽度然后通过新增props传给原生侧。原生侧保持等宽实现不变业务层用自定义宽度模式覆盖。这样既保证了组件的通用性又不牺牲业务定制的灵活性。8.3 后续可以继续做的事SegmentControl这个起步项目做完后你会对“RN OpenHarmony自定义原生组件”这条链路有一个完整的认知。之后可以尝试的方向包括给SegmentControl增加badge角标能力类似消息未读数支持多行文字或图文混排的选项增加键盘方向键控制的辅助功能支持将Component从纯展示型升级为可以和RN页面生命周期联动的状态型组件这些方向本质上都没有跳出本文建立的框架只是往组件内部添砖加瓦。回到开头那个问题为什么SegmentControl在鸿蒙RN上非得自己造轮子因为生态还没有成熟到“开箱即用”。但换个角度想正因为如此现在我们踩过的坑、总结出的模式才显得尤其珍贵。等官方补齐生态后你再回头看会发现“自定义原生组件”这条路其实也没什么神秘可言核心就是ArkUI侧做好视图桥接层做好通信JS侧做好封装——三件事而已。
RELATED

相关推荐

Windows 11瘦身到3GB:tiny11builder完整实操指南

Windows 11瘦身到3GB:tiny11builder完整实操指南

Windows 11瘦身到3GB:tiny11builder完整实操指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 重装完笔记本,你发现C盘又小了30个G。开源…

📅 2026/9/8 21:43:50
3步精简Windows 11,老电脑重获新生

3步精简Windows 11,老电脑重获新生

3步精简Windows 11,老电脑重获新生 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 那台用了五六年的笔记本,装完系统后开机要等好一会儿&a…

📅 2026/9/8 21:43:50
Ryujinx 使用指南:在 PC 上运行 Switch 游戏的完整步骤

Ryujinx 使用指南:在 PC 上运行 Switch 游戏的完整步骤

Ryujinx 使用指南:在 PC 上运行 Switch 游戏的完整步骤 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx 是一款用 C# 编写的开源 Nintendo Switch 模拟器,让你在电脑里运行 .xc…

📅 2026/9/8 21:43:50
MORE NEWS

更多资讯

📰

Puppeteer Browser.screens() 深度解析:获取屏幕信息与屏幕模拟的 API 实现

Puppeteer Browser.screens() 深度解析:获取屏幕信息与屏幕模拟的 API 实现 【免费下载链接】puppeteer JavaScript API for Chrome and Firefox 项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer 在自动化浏览器时,多显示器…

📰

Claude Sonnet 4.6 运行时安全注入指令(safety_instructions_from_anthropic)深度解析

Claude Sonnet 4.6 运行时安全注入指令(safety_instructions_from_anthropic)深度解析 【免费下载链接】system_prompts_leaks Extracted system prompts from Anthropic - Claude Fable 5.1, Opus 5, Claude Design, Claude Code. OpenAI - ChatGPT GPT…

📰

RPCS3 自动更新完整指南:查版本、选通道、三步开启并验证

RPCS3 自动更新完整指南:查版本、选通道、三步开启并验证 【免费下载链接】rpcs3 PlayStation 3 emulator and debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 本文带你走一遍 RPCS3 内置的更新系统:如何查看当前版本、分支与…

📰

XLD无损音频转换指南:CD抓轨、FLAC转码,3步搞定

XLD无损音频转换指南:CD抓轨、FLAC转码,3步搞定 【免费下载链接】awesome-macOS  A curated list of awesome applications, softwares, tools and shiny things for macOS. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-macOS …

📰

Aider 基准测试中的 LLM 速度对比:GPT-4 Turbo 与 gpt-3.5-turbo-1106 的推理延迟实测

Aider 基准测试中的 LLM 速度对比:GPT-4 Turbo 与 gpt-3.5-turbo-1106 的推理延迟实测 【免费下载链接】aider aider is AI pair programming in your terminal 项目地址: https://gitcode.com/GitHub_Trending/ai/aider 本文为 Aider 基准测试系列的速度专题…

📰

SpringBoot+Vue+MySQL校园疫情防控毕设实战指南

毕业设计这东西,选对题目基本就成功了一大半。如果一个题目能同时满足“技术栈主流、业务逻辑完整、有实际应用场景、代码量适中、论文好写”这几个条件,那它就是传说中的“神仙题目”。今天我想认真聊聊这个经典组合——SpringBootVueMySQL打造的校园疫…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬