当前位置:首页>iOSAPP>把 iOS Mail 的滑动手势搬进 React Native,需要多少行物理代码

把 iOS Mail 的滑动手势搬进 React Native,需要多少行物理代码

  • 2026-07-26 14:29:49
把 iOS Mail 的滑动手势搬进 React Native,需要多少行物理代码

iOS Mail 应用里左滑删除邮件那个手势,大概是被模仿最多的移动交互。手指往左一划,按钮露出来,再一划触发动作。简单到任何人凭直觉就能操作。但把它搬到 React Native 上就会发现,"看起来简单"和"做起来像"之间,隔着整整一层物理学。

rit3zh/expo-ios-like-swipe-actions 这个项目用 Expo + Reanimated 4 + Gesture Handler 完整复刻了 iOS Mail 的滑动手势体验——橡胶带回弹、速度投影判定、破坏性操作的差异化行为、跨线程触觉反馈。代码量不大,但每一个细节都踩在正确的技术点上。我读它的源码时,最深的感受是:作者的功夫落在手感上,而非功能本身。手感这东西虚得很,但虚的东西往往由最硬的数学支撑。

https://github.com/rit3zh/expo-ios-like-swipe-actions


手势是物理,不是位移

大多数 React Native 滑动手势库的做法是线性映射:手指移动多少,组件就平移多少。iOS 不是这样。你在 iOS 上滑动一行邮件,会经历三个阶段——初始阶段 1:1 跟随手指,没有任何阻力;超过按钮宽度后进入阻尼阶段,越滑越重,像在拉一根越来越紧的弹簧;拉到某个临界点后几乎拉不动了,但还没到硬边界,这是弹性极限。

这个项目的核心是 shapeTranslation 函数,完整复现了这套三段式物理模型:

functionshapeTranslation(raw, limit, cellWidth, fullSwipe, elasticRatio) {"worklet";if (abs <= limit) return raw;          // 1:1 跟随const overflow = abs - limit;if (fullSwipe && abs <= cw) {const easedProgress = progress * (FULL_SWIPE_RESISTANCE + (1 - FULL_SWIPE_RESISTANCE) * progress);return sign * (limit + remaining * easedProgress);  }return sign * (elasticPeak + rubberBand(pastCw, refDim));  // 橡胶带回弹}

关键在于 rubberBand 函数,它直接实现了 Apple 经典的橡胶带公式:

functionrubberBand(overflow, dim, c = RUBBER_COEF) {"worklet";return (1 - 1 / ((overflow * c) / dim + 1)) * dim;}

RUBBER_COEF = 0.55。系数越小,阻力增长越快;系数越大,手感越松。这意味着组件的每一毫米滑动都在实时计算一个非线性函数——1:1 区间过渡到渐进阻力区间,再过渡到橡胶带区间。曲线决定手感。响应再快,曲线不对,总觉得别扭。

放手之后,速度说了算

滑动手势最难的不是跟手,而是手指离开屏幕之后怎么办。这个项目在 onEnd 里做了一个三路判定——提交(commit)、保持打开(open)、关闭(close)。提交的条件不是单一的"滑过某个位置",而是三个触发器取或:

const wantsCommit =  fullSwipeEnabled &&  !closingVelocity &&  (absPos >= commitAt ||              // 位置超过提交阈值    absProj >= commitAt ||             // 投影位置超过提交阈值    (vx * closingSign < -1600 && absPos >= limit));  // 高速滑动

第三行最值得注意:即使没滑到位,只要速度超过 1600 px/s 且已经滑过了按钮区域(absPos >= limit),也算提交。这就是速度投影——手指的动量被当成意图信号。你轻轻一推和用力一甩,结果完全不同。

提交阈值的计算本身也是一个函数:

functioncommitThreshold(limit, cw, overshoot, ratio, expansionOffset) {"worklet";const ratioPoint = cw * ratio;const offsetPoint = expansionOffset === undefined    ? ratioPoint : limit + expansionOffset;returnMath.max(limit + overshoot, Math.min(ratioPoint, offsetPoint));}

嵌套的 Math.max 和 Math.min 确保阈值不会因为按钮太少而太近,也不会因为按钮太多而太远。手指离开屏幕的那一刻,才是真正的交互开始。很多人做手势只关注手指在屏幕上时的跟随效果,忽略了手指离开后的惯性判定——那才是决定"像不像原生"的关键。

破坏性操作的细节魔鬼

iOS Mail 有一个很多人没注意到的细节——左滑点击删除(红色破坏性按钮),邮件不会自动收回,而是停留在打开状态;左滑点击标记已读(蓝色普通按钮),操作执行后行会自动收回。这个差异行为在 handleActionPress 中分三路处理:destructive 加主导按钮时动画滑到提交位置并保持打开,通过 scheduleOnRN 触发 committed 回调;destructive 但非主导按钮时直接执行 action.onPress(),不关闭行;非 destructive 的任何按钮,先 closeRow(true) 关闭行,等待 releaseDurationMs 后执行 onPress

这不是 bug,是 iOS 的设计哲学——破坏性操作给了用户反悔窗口,而非破坏性操作执行完毕后自动收起,减少多余的手势。一个组件把这种细节都做进去了,功夫落在体验的还原上,而非功能的实现。

手势与滚动的边界战争,以及跨线程的触觉

在列表里做滑动手势,最大的敌人是垂直滚动。手指不可能绝对水平移动,稍微往下一点,列表就开始滚,滑动就断了。这个项目的解决方案是 activeOffsetX 和 failOffsetY 的组合:

Gesture.Pan()  .activeOffsetX([-1212])    // 水平移动超过 12px 才激活  .failOffsetY([-1212])      // 垂直移动超过 12px 就失败

12px 的激活窗口不是随便选的。太小了会误触发,太大了手势迟钝。这个数字恰好是手指宽度的一个合理折中。

触觉反馈是这个项目技术含量最高的细节之一。问题在于:手势回调跑在 UI 线程(Reanimated worklet),但 expo-haptics 只能在 JS 线程调用。两个线程之间不能直接通信。项目的解法是用 react-native-worklets 的 scheduleOnRN,把触觉事件从 worklet 线程调度回 JS 线程:

const handleHaptic = useCallback((kind"reveal" | "commit") => {    onHapticCue?.(kind);  },  [onHapticCue],);// 在 worklet onUpdate 中:if (hasCrossedReveal.value === 0) {  hasCrossedReveal.value = 1;scheduleOnRN(handleHaptic, "reveal");}

两个关键节点都会触发触觉反馈:越过按钮宽度时(reveal)——“按钮出来了”;越过提交阈值时(commit)——“马上就要触发了”。而且这两个标记都有迟滞回退:reveal 在回退到 limit * 0.88(12% 余量)时才重置,commit 在回退到 commitAt - 12(12px 余量)时才重置。用户不会在阈值附近来回摩擦时收到重复震动。你的手指在 UI 线程上滑动,但震动的 API 在 JS 线程——跨线程,是手感好的前提。

组件 API 与性能

大多数滑动手势库的用法是传一个配置数组——<SwipeActions leftActions={[{ text: 'Archive', onPress: fn }]} />。这个项目的做法完全不同——它用的是 Compound Component 模式加 Slot 标记:

<SwipeActions.Root><SwipeActions.Main><Text>Hello</Text></SwipeActions.Main><SwipeActions.Containerside="right"onPress={fn}destructive><SwipeActions.Iconicon="trash" /><SwipeActions.Title>Delete</SwipeActions.Title></SwipeActions.Container></SwipeActions.Root>

Main 和 Container 组件各有一个静态 .slot 属性,子元素解析器通过 child.type.slot 来分类。Container 上的 onPressdestructiveside 等 props 被提取出来组装成 ISwipeAction 对象。这种做法的好处是配置即 JSX——开发者不需要在脑子里把 JSON 数组翻译成 UI,而是直接看到组件的嵌套关系。类型安全、可读性、可扩展性都更好。

性能方面,所有组件都是 React.memo,所有动画状态都用 Shared Value(translateX、cellWidth、isOpen 全部在 UI 线程运行),用 useAnimatedStyle 而不是 setState,手势移动时不触发 React 重渲染,Gesture.Pan() 放在 useMemo 里防止每次渲染重新创建,用 useAnimatedReaction 而不是轮询。结果就是:手势过程中几乎不会触发 React 渲染循环,所有动画都在 60fps 的 UI 线程上运行。

调参的艺术

这个项目有一个 swipe-constants.ts 文件,里面列着所有"魔法数字":

常量
作用
RUBBER_COEF
0.55
橡胶带阻力系数
ELASTIC_RATIO
0.42
弹性极限比例
FULL_SWIPE_RESISTANCE
0.82
全滑阻力起始值
CLOSE_VELOCITY
120 px/s
低于此速度则关闭
VELOCITY_COMMIT
1600 px/s
高于此速度则提交
MIN_OPEN_TRANSLATION
18 px
保持打开的最小滑动
PROJECTION_COEF
0.12
速度投影系数

还有 iOS 的缓动曲线:[0.22, 0.82, 0.18, 1],一个自定义的 cubic bezier,模拟原生 iOS 的弹簧感。这些数字不是从数学公式推导出来的,而是反复调到"感觉对了"为止。手感不是算出来的,是调出来的。但调的前提是有一个正确的模型。

总结

这个项目做对了几件事。橡胶带公式、速度投影、破坏性差异行为、触觉反馈节点,每一个选择都指向同一个目标——让用户觉得像原生。shapeTranslation 函数的三段式阻力模型是整组件的灵魂,没有正确的物理曲线,再好的组件结构也只是看起来像。跨线程回调用 scheduleOnRN 桥接 worklet 与 JS 线程,onHapticCue 作为可选 prop 让消费者自己决定是否接入 expo-haptics。Compound Component API 把配置写进 JSX,开发者写的是组件嵌套,不是 JSON 数组。所有动画在 UI 线程跑,性能优化做到极致却不外露,开发者只需要 <SwipeActions.Root> 就好。

做手势组件的人很多,能把物理模型当核心来写的,少见。


项目地址:https://github.com/rit3zh/expo-ios-like-swipe-actions

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-26 18:23:02 HTTP/2.0 GET : https://c.mffb.com.cn/a/487491.html
  2. 运行时间 : 0.239802s [ 吞吐率:4.17req/s ] 内存消耗:4,611.34kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=5d4363dddc486a8aa8d4b8cf5f3cd12c
  1. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/runtime/temp/cefbf809ba1a84190cb04b0cb7abcf79.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000796s ] mysql:host=127.0.0.1;port=3306;dbname=c_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001268s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003407s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.014905s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001633s ]
  6. SELECT * FROM `set` [ RunTime:0.001327s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001469s ]
  8. SELECT * FROM `article` WHERE `id` = 487491 LIMIT 1 [ RunTime:0.008068s ]
  9. UPDATE `article` SET `lasttime` = 1785061382 WHERE `id` = 487491 [ RunTime:0.012851s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.001259s ]
  11. SELECT * FROM `article` WHERE `id` < 487491 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.009608s ]
  12. SELECT * FROM `article` WHERE `id` > 487491 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002977s ]
  13. SELECT * FROM `article` WHERE `id` < 487491 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003429s ]
  14. SELECT * FROM `article` WHERE `id` < 487491 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.014864s ]
  15. SELECT * FROM `article` WHERE `id` < 487491 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002920s ]
0.243687s