Vant Toast 轻提示组件完全指南:辅助函数调用、配置选项与源码实现原理
Vant Toast 轻提示组件完全指南辅助函数调用、配置选项与源码实现原理【免费下载链接】vantA lightweight, customizable Vue UI library for mobile web apps.项目地址: https://gitcode.com/GitHub_Trending/va/vantToast轻提示是移动端开发中使用频率最高的反馈组件之一在页面中间弹出黑色半透明提示用于消息通知、加载中、操作成功/失败等场景。Vant 的 Toast 组件同时提供了「组件式」与「函数式」两套使用形态并以单例队列、全局默认配置、动态更新等机制保证开发体验。本文以 Toast 官方文档 为主线结合 组件源码、函数调用实现 与 单元测试带你掌握 Toast 的全部用法与底层原理读完后你可以直接在项目中按需唤起提示、定制样式并规避常见的按需引入坑。介绍与引入Toast 用于在页面中间弹出黑色半透明提示常见于三类场景消息通知、加载提示、操作结果提示。在 Vant 中引入 Toast 的方式有两种组件式通过app.use全局注册van-toast组件函数式直接导入showToast等辅助函数无需注册组件调用即可弹出。全局注册组件的代码如下更多注册方式可参考 组件注册文档import { createApp } from vue; import { Toast } from vant; const app createApp(); app.use(Toast);函数调用机制showToast 系列辅助函数为了便于使用Vant 提供了一系列辅助函数通过它们可以快速唤起全局的 Toast 组件。例如使用showToast函数调用后会直接在页面中渲染对应的轻提示import { showToast } from vant; showToast(提示内容);从源码来看这些函数并非黑魔法而是基于 Vue 的createApp动态挂载实现。核心实现在 function-call.tsx 中showToast内部先判断inBrowser非浏览器环境直接返回空实例避免 SSR 报错随后通过getInstance()获取实例并把「全局默认配置 → 指定类型的默认配置 → 本次调用参数」三层合并后调用toast.open(...)showLoadingToast、showSuccessToast、showFailToast均由createMethod(type)工厂函数生成本质是showToast(extend({ type }, parseOptions(options)))即在参数中注入对应的type实例的挂载由 mount-component.ts 中的mountComponent完成createApp创建应用、把根节点插入document.body后app.mount(root)关闭时app.unmount()并移除 DOM 节点。也就是说函数调用与组件式最终渲染的是同一个VanToast组件函数式只是帮你省去了模板与注册的步骤。核心用法代码演示全解文字提示使用showToast方法在屏幕中间展示一条文字提示import { showToast } from vant; showToast(提示内容);加载提示使用showLoadingToast方法展示加载提示通过forbidClick选项可以禁用背景点击防止用户在加载期间误触其他操作import { showLoadingToast } from vant; showLoadingToast({ message: 加载中..., forbidClick: true, });forbidClick的底层实现值得注意当 Toast 显示且forbidClick为true时Toast.tsx 会调用 lock-click.ts 中的lockClick向document.body添加van-toast--unclickable类名配合 index.less 中* { pointer-events: none; }规则屏蔽所有子元素的点击事件。lockClick内部使用计数器lockCount保证多个 Toast 并发时锁与解锁次数正确配对——这一行为在 lock-click.spec.ts 中有完整验证。成功/失败提示使用showSuccessToast展示成功提示showFailToast展示失败提示import { showSuccessToast, showFailToast } from vant; showSuccessToast(成功文案); showFailToast(失败文案);从源码看这两个函数与showLoadingToast一样都是createMethod生成的success与fail类型在渲染图标时会自动使用同名的内置 Iconicon || type因此不传icon也会出现对勾/叉号图标。自定义图标通过icon选项可以自定义图标支持传入图标名称或图片链接等同于 Icon 组件的name属性详见 Icon 组件文档import { showToast } from vant; showToast({ message: 自定义图标, icon: like-o, }); showToast({ message: 自定义图片, icon: https://fastly.jsdelivr.net/npm/vant/assets/logo.png, });通过loadingType属性可以自定义加载图标类型默认是圆形加载circular可以切换为spinnerimport { showLoadingToast } from vant; showLoadingToast({ message: 加载中..., forbidClick: true, loadingType: spinner, });图标渲染逻辑集中在 Toast.tsx 的 renderIcon有icon或类型为success/fail时渲染Icon组件类型为loading时渲染Loading组件loadingType透传给 Loading。index.spec.ts 中验证了iconSize会同时作用于 Icon 的fontSize与 Loading 转圈的宽高。自定义位置Toast 默认渲染在屏幕正中位置通过position属性可以控制展示位置import { showToast } from vant; showToast({ message: 顶部展示, position: top, }); showToast({ message: 底部展示, position: bottom, });从 index.less 可以看到top/bottom通过top: var(--van-toast-position-top-distance)默认 20%等样式变量控制距离屏幕边缘的距离。文字换行方式通过wordBreak选项可以控制 Toast 中文字过长时的截断方式默认值为break-all可选值为break-word和normalimport { showToast } from vant; // 换行时截断单词 showToast({ message: This message will contain a incomprehensibilities long word., wordBreak: break-all, }); // 换行时不截断单词 showToast({ message: This message will contain a incomprehensibilities long word., wordBreak: break-word, });对应的 CSS 实现位于 index.less 的--break-normal与--break-word规则break-all是默认的word-break: break-allbreak-word走word-break: normal; word-wrap: break-wordnormal则两者都还原为普通换行。动态更新提示执行 Toast 方法时会返回对应的 Toast 实例通过修改实例上的message属性可以实现动态更新提示的效果import { showLoadingToast, closeToast } from vant; const toast showLoadingToast({ duration: 0, forbidClick: true, message: 倒计时 3 秒, }); let second 3; const timer setInterval(() { second--; if (second) { toast.message 倒计时 ${second} 秒; } else { clearInterval(timer); closeToast(); } }, 1000);动态更新之所以可行是因为 function-call.tsx 的 createInstance 中创建了一个响应式messageref并通过watch监听它的变化同步到组件state.message实例对外暴露{ open, close, message }ToastWrapperInstance类型在 types.ts 中定义了该形态。单例模式Toast 默认采用单例模式即同一时间只会存在一个 Toast如果需要在同一时间弹出多个 Toast可调用allowMultipleToast开启多实例模式import { showToast, showSuccessToast, allowMultipleToast } from vant; allowMultipleToast(); const toast1 showToast(第一个 Toast); const toast2 showSuccessToast(第二个 Toast); toast1.close(); toast2.close();源码中的单例/多实例逻辑非常清晰getInstance 维护一个实例队列queue默认模式下始终复用队尾实例开启allowMultiple后每次调用都新建实例并入队closeToast 在单例模式关闭queue[0]多实例模式按 FIFO 顺序queue.shift()?.close()传入closeToast(true)则关闭全部多实例模式下onClosed 会在动画结束后把实例从队列移除并unmount清理 DOM避免内存泄漏见测试 function.spec.ts。修改默认配置通过setToastDefaultOptions函数可以全局修改showToast等方法的默认配置resetToastDefaultOptions用于重置import { setToastDefaultOptions, resetToastDefaultOptions } from vant; // 全局修改所有 Toast 的默认时长 setToastDefaultOptions({ duration: 2000 }); // 只修改 loading 类型 Toast 的默认配置 setToastDefaultOptions(loading, { forbidClick: true }); // 重置全部默认配置 resetToastDefaultOptions(); // 重置指定类型的默认配置 resetToastDefaultOptions(loading);其实现要点如下全局默认配置保存在currentOptions类型专属配置保存在defaultOptionsMapMapToastType, ToastOptions每次showToast时按「全局默认 → 类型默认 → 本次参数」的优先级合并见 showToast 的 extend 调用因此类型级配置不会覆盖调用时显式传入的选项resetToastDefaultOptions()不带参数时会将currentOptions恢复为defaultOptions并清空类型映射。以上行为均有对应测试function.spec.ts验证。使用 Toast 组件嵌入自定义内容如果需要在 Toast 内嵌入组件或其他自定义内容可以直接使用 Toast 组件并通过message插槽定制。使用前需要通过app.use等方式注册组件见 toast/index.ts 的withInstall导出van-toast v-model:showshow stylepadding: 0 template #message van-image :srcimage width200 height140 styledisplay: block / /template /van-toastimport { ref } from vue; export default { setup() { const show ref(false); return { show }; }, };当提供message插槽时renderMessage 会优先渲染插槽内容而忽略messageprop。组件式用法完整示例可参考 toast 的演示页面。API 参考方法Vant 导出了以下 Toast 相关的辅助函数方法名说明参数返回值showToast展示文字提示ToastOptions \| stringToast 实例showLoadingToast展示加载提示ToastOptions \| stringToast 实例showSuccessToast展示成功提示ToastOptions \| stringToast 实例showFailToast展示失败提示ToastOptions \| stringToast 实例closeToast关闭当前展示的提示closeAll: booleanvoidallowMultipleToast允许同时存在多个 Toast-voidsetToastDefaultOptions修改默认配置影响所有的showToast调用。传入 type 可以修改指定类型 Toast 的默认配置type \| ToastOptionsvoidresetToastDefaultOptions重置默认配置影响所有的showToast调用。传入 type 可以重置指定类型 Toast 的默认配置typevoidToastOptions 数据结构调用showToast等方法时支持传入以下选项与 types.ts 中ToastOptions定义一一对应参数说明类型默认值type提示类型可选值为loadingsuccessfailhtmlToastTypetextposition位置可选值为topbottomToastPositionmiddlemessage文本内容支持通过\n换行stringwordBreak文本内容的换行方式可选值为normalbreak-allbreak-wordToastWordBreakbreak-allicon自定义图标支持传入图标名称或图片链接等同于 Icon 组件的name属性string-iconSize图标大小如20px2em默认单位为pxnumber | string36pxiconPrefix图标类名前缀等同于 Icon 组件的class-prefix属性stringvan-iconoverlay是否显示背景遮罩层booleanfalseforbidClick是否禁止背景点击booleanfalsecloseOnClick是否在点击后关闭booleanfalsecloseOnClickOverlay是否在点击遮罩层后关闭booleanfalseloadingType加载图标类型可选值为spinner详见 Loading 组件文档stringcircularduration展示时长(ms)值为 0 时toast 不会消失number2000className自定义类名string | Array | object-overlayClass自定义遮罩层类名string | Array | object-overlayStyle自定义遮罩层样式object-transition动画类名等价于 transition 的name属性stringvan-fadeteleport指定挂载的节点等同于 Teleport 组件的to属性string | Elementbodyz-index将组件的 z-index 层级设置为一个固定值number | string2000onClose关闭时的回调函数Function-onOpened完全展示后的回调函数Function-两点补充说明type: html此类型下message会通过innerHTML渲染 HTML 内容见 renderMessage测试 function.spec.ts 验证了该行为注意传入的 HTML 需自行保证安全性z-index默认值2000来自 use-global-z-index.ts全局 z-index 从 2000 起每次读取自动 1 递增保证 Toast、Popup、Dialog 等浮层组件后出现者层级更高也可用setGlobalZIndex手动调整基数。Props通过组件调用Toast时支持以下 Props与ToastOptions含义相同仅命名转为 kebab-case参数说明类型默认值type提示类型可选值为loadingsuccessfailhtmlToastTypetextposition位置可选值为topbottomToastPositionmiddlemessage文本内容支持通过\n换行stringword-break文本内容的换行方式可选值为normalbreak-allbreak-wordToastWordBreakbreak-allicon自定义图标支持传入图标名称或图片链接等同于 Icon 组件的name属性string-icon-size图标大小如20px2em默认单位为pxnumber | string36pxicon-prefix图标类名前缀等同于 Icon 组件的class-prefix属性stringvan-iconoverlay是否显示背景遮罩层booleanfalseforbid-click是否禁止背景点击booleanfalseclose-on-click是否在点击后关闭booleanfalseclose-on-click-overlay是否在点击遮罩层后关闭booleanfalseloading-type加载图标类型可选值为spinnerstringcircularduration展示时长(ms)值为 0 时toast 不会消失number2000class-name自定义类名string | Array | object-overlay-class自定义遮罩层类名string | Array | object-overlay-style自定义遮罩层样式object-transition动画类名等价于 transition 的name属性stringvan-fadeteleport指定挂载的节点等同于 Teleport 组件的to属性string | Elementbodyz-index将组件的 z-index 层级设置为一个固定值number | string2000组件底层基于Popup实现从 toastProps 可以看出show、overlay、teleport、transition、overlayClass、overlayStyle、closeOnClickOverlay、zIndex等属性会被pick出来后透传给 Popup 组件同时 Toast 显式设置了lockScroll{false}避免弹出 Toast 时锁定页面滚动。Events通过组件调用Toast时支持以下事件事件名说明回调参数close关闭时的回调函数-opened完全展示后的回调函数-此外组件内部通过update:show事件支持v-model:show双向绑定。Slots使用Toast组件时支持以下插槽名称说明message自定义文本内容类型定义组件导出以下类型定义完整声明见 types.tsimport type { ToastType, ToastProps, ToastOptions, ToastPosition, ToastWordBreak, ToastWrapperInstance, } from vant;主题定制组件提供了下列 CSS 变量用于自定义样式可在根节点或通过 ConfigProvider 组件 覆盖变量的默认值定义在 index.less 中名称默认值描述--van-toast-max-width70%最大宽度--van-toast-font-sizevar(--van-font-size-md)字号--van-toast-text-colorvar(--van-white)文字颜色--van-toast-loading-icon-colorvar(--van-white)加载图标颜色--van-toast-line-heightvar(--van-line-height-md)行高--van-toast-radiusvar(--van-radius-lg)圆角--van-toast-backgroundfade(var(--van-black), 70%)背景色实际实现为rgba(0, 0, 0, 0.7)--van-toast-icon-size36px图标大小--van-toast-text-min-width96px文字提示最小宽度--van-toast-text-paddingvar(--van-padding-xs) var(--van-padding-sm)文字提示内边距--van-toast-default-paddingvar(--van-padding-md)默认内边距--van-toast-default-width88px默认宽度--van-toast-default-min-height88px默认最小高度--van-toast-position-top-distance20%顶部位置距离--van-toast-position-bottom-distance20%底部位置距离这些变量同时定义了ToastThemeVars类型见 types.ts使用 TypeScript 时可通过该类型获得完整的变量名提示。常见问题引用 showToast 时出现编译报错如果引用showToast方法时出现以下报错说明项目中使用了babel-plugin-import插件导致代码被错误编译These dependencies were not found: * vant/es/show-toast in ./src/xxx.js * vant/es/show-toast/style in ./src/xxx.jsVant 从 4.0 版本开始不再支持babel-plugin-import插件请参考 迁移指南 移除该插件。按需引入组件时使用 showToast 出现样式异常在使用按需引入组件方案集成 Vant 时使用showToast等函数无需进行显式导入否则会造成样式异常// 以下方式是不需要的 import { showToast } from vant原因在于显式导入showToast等函数时vant/auto-import-resolver将不会自动导入 Toast 的样式资源导致 Toast 组件样式缺失。解决方案有两种使用showToast时不进行显式导入如果必须显式导入showToast则同时手动导入 Toast 组件的相关样式import { showToast } from vant import vant/lib/toast/style小结Toast 是 Vant 中「函数式 API」设计最具代表性的组件之一showToast系列辅助函数通过动态挂载 单例队列 三层配置合并在保持轻量的同时提供了类型化、可动态更新、支持多实例的完整能力。配合setToastDefaultOptions全局配置、CSS 变量主题定制以及组件式message插槽几乎可以覆盖移动端所有轻提示场景。若需深入源码推荐从 function-call.tsx 的实例生命周期与 Toast.tsx 的渲染逻辑读起再对照 function.spec.ts 与 index.spec.ts 中的测试用例理解每个选项的实际行为。【免费下载链接】vantA lightweight, customizable Vue UI library for mobile web apps.项目地址: https://gitcode.com/GitHub_Trending/va/vant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

1986 NDX收盘价格复盘

1986 NDX收盘价格复盘

📈 一、价格与收益概况项目日期收盘价备注年初1986-01-02131.26首个交易日年内绝对最低收盘1986-01-09128.80全年最低点(早于上涨)年内最高收盘1986-07-03164.517月上旬高点回撤最低收盘(从高点算起)1986-09-15134.94下…

2026/9/13 18:47:46 阅读更多 →
飞控二次开发路径详解:从树莓派外挂到源码级修改

飞控二次开发路径详解:从树莓派外挂到源码级修改

开头先聊一个挺普遍的现象:我周围不少朋友一接到飞控二次开发的需求,第一反应就是去拉开源飞控的源码,然后埋头开始读。读了两周,文件目录还没理清楚,该写的功能反而一点没动。飞控二次开发和普通嵌入式项目不一样&…

2026/9/13 18:47:46 阅读更多 →
Slint 内部过程宏 crate 深度解析:i-slint-core-macros 的五大宏、RTTI 机制与版本锁定实践

Slint 内部过程宏 crate 深度解析:i-slint-core-macros 的五大宏、RTTI 机制与版本锁定实践

Slint 内部过程宏 crate 深度解析:i-slint-core-macros 的五大宏、RTTI 机制与版本锁定实践 【免费下载链接】slint Slint is an open-source declarative GUI toolkit to build native user interfaces for Rust, C, JavaScript, or Python apps. 项目地址: http…

2026/9/13 18:47:46 阅读更多 →

最新新闻

PDF补丁丁:给没有目录的200页文档补上书签导航,50份PDF一次跑完

PDF补丁丁:给没有目录的200页文档补上书签导航,50份PDF一次跑完

PDF补丁丁:给没有目录的200页文档补上书签导航,50份PDF一次跑完 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 …

2026/9/13 19:37:08 阅读更多 →
Label Studio 模板快速上手:用预定义标注界面加速数据标注与机器学习工作流

Label Studio 模板快速上手:用预定义标注界面加速数据标注与机器学习工作流

Label Studio 模板快速上手:用预定义标注界面加速数据标注与机器学习工作流 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/la…

2026/9/13 19:37:08 阅读更多 →
LabVIEW视觉目标跟踪原理与实现:从模板匹配到卡尔曼滤波

LabVIEW视觉目标跟踪原理与实现:从模板匹配到卡尔曼滤波

简介:面向 LabVIEW 开发者与机器视觉学习者的目标跟踪与颜色跟踪示例包,适合用 LabVIEW 完成视觉算法验证、课程设计或项目原型开发。资源围绕视觉 labview 主题,提供从图像获取、预处理、特征提取到跟踪算法实现的可运行 VI,以及…

2026/9/13 19:37:08 阅读更多 →
pybind11 版本发布指南:从版本号规范到完整的发布流程实战

pybind11 版本发布指南:从版本号规范到完整的发布流程实战

pybind11 版本发布指南:从版本号规范到完整的发布流程实战 【免费下载链接】pybind11 Seamless operability between C11 and Python 项目地址: https://gitcode.com/GitHub_Trending/py/pybind11 本篇指南以 pybind11 官方文档 docs/release.rst 为骨架&…

2026/9/13 19:37:08 阅读更多 →
基于Spring Boot的教务系统开发:状态流转、权限与并发控制

基于Spring Boot的教务系统开发:状态流转、权限与并发控制

简介:基于 Java 与 SSM 架构开发的教务查询系统,面向刚接触 SSM 整合的 Java 后端初学者,定位为可运行的练手项目。代码覆盖 Spring、SpringMVC、MyBatis 三大框架的完整整合,并引入 Shiro 安全框架、C3P0 数据源、Log4j 日志和 B…

2026/9/13 19:37:08 阅读更多 →
Kaiser窗+双谱线插值实现高精度谐波频率估计

Kaiser窗+双谱线插值实现高精度谐波频率估计

简介:本资源是一份面向信号处理初学者与MATLAB实践者的谐波分析教学代码,聚焦于高精度频谱估计中的关键算法实现。压缩包ct877.zip仅含1个核心文件ct877.m,为纯MATLAB脚本(.m类型),体积精简仅7KB&#xff0…

2026/9/13 19:36:08 阅读更多 →

日新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/13 16:51:11 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/12 18:29:34 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/12 19:02:44 阅读更多 →