更新记录

1.0.0(2026-07-15) 下载此版本

gb-long-toast 长文本 Toast 提示

介绍

微信小程序真机上 uni.showToast 对长文本有截断问题,超过约 10 个汉字的内容无法完整显示。本插件通过 monkey-patch 方式重构 uni.showToast / uni.hideToast所有页面无需修改任何调用代码即可自动支持长文本完整显示。

核心特性

  • 零侵入:直接 patch uni.showToast,现有代码无需改动
  • 长文本自动切换:title 超过 10 个字符时自动使用自定义组件,短文本仍走原生
  • 多页面栈管理:支持 tabBar 页面切换、二级页面跳转返回等场景
  • 智能降级:当前页面无组件或组件不属于当前页面时,自动降级走原生 toast(截断但至少有提示)
  • API 完全兼容:支持 icondurationmaskimagesuccesscomplete 等全部参数
  • easycom 自动注册:组件无需手动 import

目录结构

uni_modules/gb-long-toast/
├── components/gb-long-toast/
│   └── gb-long-toast.vue    # 自定义 Toast 组件
├── js/
│   └── toast.js             # 核心 patch 逻辑
├── package.json
└── readme.md

快速上手

第一步:在 main.js 中初始化

// main.js
import Vue from 'vue';
import { patchToast, setupPageShow } from '@/uni_modules/gb-long-toast/js/toast.js';

// 重构 uni.showToast / uni.hideToast
patchToast();

// 注入 Vue.mixin onShow 钩子,支持页面切换自动检测
setupPageShow(Vue);

第二步:在需要长文本 Toast 的页面模板中添加组件

<template>
  <view>
    <!-- 页面内容 -->
    <gb-long-toast />
  </view>
</template>

组件通过 easycom 自动注册,无需手动 import 和 components 声明。

第三步:正常调用 uni.showToast

// 长文本会自动使用自定义组件显示,无需任何修改
uni.showToast({
  title: '您的操作已成功,系统将在3秒后自动跳转到首页',
  icon: 'none'
});

API 说明

调用方式与原生 uni.showToast / uni.hideToast 完全一致,无需学习新 API。

uni.showToast(OBJECT)

参数 类型 必填 说明
title String 提示的内容,长度超过 10 个字符自动使用自定义组件
icon String 图标类型,有效值:success / error / fail / exception / loading / none,默认 none
image String 自定义图标的本地路径。有值时降级走原生 toast(自定义组件不支持自定义图标)
duration Number 提示的延迟时间,单位 ms,默认 1500。loading 模式下不自动关闭
mask Boolean 是否显示透明蒙层,防止触摸穿透,默认 false
success Function 接口调用成功的回调函数
complete Function 接口调用结束的回调函数

uni.hideToast()

隐藏正在显示的 Toast 提示,与原生行为一致。

显示规则

title 长度 image 参数 当前页面有组件 行为
≤ 10 字符 任意 任意 走原生 uni.showToast
> 10 字符 有值 任意 降级走原生(自定义图标优先)
> 10 字符 走自定义 gb-long-toast 组件(完整显示)
> 10 字符 降级走原生(截断但至少有提示)

使用案例

基础用法 - 纯文本提示

uni.showToast({
  title: '操作成功,请在我的页面查看领取记录',
  icon: 'none'
});

带 success 图标

uni.showToast({
  title: '订单已提交成功,请耐心等待审核结果通知',
  icon: 'success'
});

带 error 图标

uni.showToast({
  title: '网络请求失败,请检查网络连接后重试',
  icon: 'error'
});

loading 模式(不自动关闭)

// 显示 loading
uni.showToast({
  title: '正在加载数据,请稍候...',
  icon: 'loading',
  mask: true  // 防止触摸穿透
});

// 手动关闭
uni.showToast({
  title: '加载完成',
  icon: 'success'
});
// 或
uni.hideToast();

防止触摸穿透(mask)

uni.showToast({
  title: '正在处理中,请勿进行其他操作以免数据丢失',
  icon: 'none',
  mask: true
});

自定义显示时长

uni.showToast({
  title: '这是一条持续3秒的提示信息',
  icon: 'none',
  duration: 3000
});

使用回调函数

uni.showToast({
  title: '提交成功,即将跳转到订单详情页面',
  icon: 'success',
  success() {
    console.log('toast 显示成功');
  },
  complete() {
    console.log('toast 调用完成');
  }
});

自定义图标(降级原生)

uni.showToast({
  title: '这个提示有自定义图标',
  icon: 'none',
  image: '/static/custom-icon.png'
});
// 注意:使用 image 参数时会降级走原生 toast,长文本仍可能被截断

多页面场景说明

tabBar 页面切换

插件通过 Vue.mixin 注入全局 onShow 钩子,tabBar 页面切换时自动激活当前页面的 Toast 组件,无需额外处理。

前提条件: 切换到的 tabBar 页面模板中必须包含 <gb-long-toast /> 组件。

<!-- pages/index/index.vue(首页 tabBar) -->
<template>
  <view>
    <gb-long-toast />
    <!-- 页面内容 -->
  </view>
</template>

<!-- pages/user/user.vue(我的 tabBar) -->
<template>
  <view>
    <gb-long-toast />
    <!-- 页面内容 -->
  </view>
</template>

二级页面跳转与返回

从 tabBar 页面进入二级页面再返回时,插件自动处理组件切换:

  • 当前页面有组件 → 使用自定义组件完整显示
  • 当前页面无组件 → 降级走原生 toast(截断但有提示)

页面未放置组件

如果某个页面没有放置 <gb-long-toast /> 组件,长文本 Toast 会自动降级走原生 uni.showToast。虽然文本会被截断,但至少保证了提示不会丢失。

建议: 所有需要长文本 Toast 的页面都应放置 <gb-long-toast /> 组件,以获得完整显示效果。

工作原理

┌──────────────────────────────────────────────────────────────────┐
│                       uni.showToast (已被 patch)                  │
├─────────────┬──────────────────────┬─────────────────────────────┤
│  title ≤ 10 │  title > 10          │  image 有值                 │
│  走原生     │  无 image             │  走原生(降级)             │
│             ├──────────────────────┤                              │
│             │  组件属于当前页面     │  组件不属于当前页面/无组件   │
│             │  调用组件 show()     │  降级走原生(截断但有提示)  │
│             │  完整显示            │                              │
└─────────────┴──────────────────────┴─────────────────────────────┘

页面可见性追踪:
  currentVisiblePageVm    // 当前可见页面的 VM 实例
  pageToastMap            // 页面→组件映射
  toastStack              // 组件实例栈,栈顶为当前活跃组件

  页面切换时(onShow):
  1. 记录 currentVisiblePageVm = this
  2. pageToastMap.get(this) → activateToast(instance) → 提升到栈顶
  3. showToast 时校验 top._pageVm === currentVisiblePageVm

注意事项

  1. 建议所有页面都放置 <gb-long-toast /> 组件,未放置组件的页面长文本 Toast 会降级走原生,仍可能被截断
  2. image 参数有值时会降级走原生 Toast,长文本仍可能被截断,建议短文本才使用自定义图标
  3. icon: 'loading' 模式下 Toast 不会自动关闭,需手动调用 uni.hideToast() 或再次调用 uni.showToast() 覆盖
  4. 插件内部使用 Vue.mixin 注入 onShow,如项目已有全局 mixin 的 onShow,两者会合并执行,不会冲突
  5. 从子页面返回当前页面时,如果当前页面没有组件,Toast 会自动降级走原生,确保提示不会丢失

平台兼容性

uni-app(4.23)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

gb-long-toast 长文本 Toast 提示

介绍

微信小程序真机上 uni.showToast 对长文本有截断问题,超过约 10 个汉字的内容无法完整显示。本插件通过 monkey-patch 方式重构 uni.showToast / uni.hideToast所有页面无需修改任何调用代码即可自动支持长文本完整显示。

核心特性

  • 零侵入:直接 patch uni.showToast,现有代码无需改动
  • 长文本自动切换:title 超过 10 个字符时自动使用自定义组件,短文本仍走原生
  • 多页面栈管理:支持 tabBar 页面切换、二级页面跳转返回等场景
  • 智能降级:当前页面无组件或组件不属于当前页面时,自动降级走原生 toast(截断但至少有提示)
  • API 完全兼容:支持 icondurationmaskimagesuccesscomplete 等全部参数
  • easycom 自动注册:组件无需手动 import

目录结构

uni_modules/gb-long-toast/
├── components/gb-long-toast/
│   └── gb-long-toast.vue    # 自定义 Toast 组件
├── js/
│   └── toast.js             # 核心 patch 逻辑
├── package.json
└── readme.md

快速上手

第一步:在 main.js 中初始化

// main.js
import Vue from 'vue';
import { patchToast, setupPageShow } from '@/uni_modules/gb-long-toast/js/toast.js';

// 重构 uni.showToast / uni.hideToast
patchToast();

// 注入 Vue.mixin onShow 钩子,支持页面切换自动检测
setupPageShow(Vue);

第二步:在需要长文本 Toast 的页面模板中添加组件

<template>
  <view>
    <!-- 页面内容 -->
    <gb-long-toast />
  </view>
</template>

组件通过 easycom 自动注册,无需手动 import 和 components 声明。

第三步:正常调用 uni.showToast

// 长文本会自动使用自定义组件显示,无需任何修改
uni.showToast({
  title: '您的操作已成功,系统将在3秒后自动跳转到首页',
  icon: 'none'
});

API 说明

调用方式与原生 uni.showToast / uni.hideToast 完全一致,无需学习新 API。

uni.showToast(OBJECT)

参数 类型 必填 说明
title String 提示的内容,长度超过 10 个字符自动使用自定义组件
icon String 图标类型,有效值:success / error / fail / exception / loading / none,默认 none
image String 自定义图标的本地路径。有值时降级走原生 toast(自定义组件不支持自定义图标)
duration Number 提示的延迟时间,单位 ms,默认 1500。loading 模式下不自动关闭
mask Boolean 是否显示透明蒙层,防止触摸穿透,默认 false
success Function 接口调用成功的回调函数
complete Function 接口调用结束的回调函数

uni.hideToast()

隐藏正在显示的 Toast 提示,与原生行为一致。

显示规则

title 长度 image 参数 当前页面有组件 行为
≤ 10 字符 任意 任意 走原生 uni.showToast
> 10 字符 有值 任意 降级走原生(自定义图标优先)
> 10 字符 走自定义 gb-long-toast 组件(完整显示)
> 10 字符 降级走原生(截断但至少有提示)

使用案例

基础用法 - 纯文本提示

uni.showToast({
  title: '操作成功,请在我的页面查看领取记录',
  icon: 'none'
});

带 success 图标

uni.showToast({
  title: '订单已提交成功,请耐心等待审核结果通知',
  icon: 'success'
});

带 error 图标

uni.showToast({
  title: '网络请求失败,请检查网络连接后重试',
  icon: 'error'
});

loading 模式(不自动关闭)

// 显示 loading
uni.showToast({
  title: '正在加载数据,请稍候...',
  icon: 'loading',
  mask: true  // 防止触摸穿透
});

// 手动关闭
uni.showToast({
  title: '加载完成',
  icon: 'success'
});
// 或
uni.hideToast();

防止触摸穿透(mask)

uni.showToast({
  title: '正在处理中,请勿进行其他操作以免数据丢失',
  icon: 'none',
  mask: true
});

自定义显示时长

uni.showToast({
  title: '这是一条持续3秒的提示信息',
  icon: 'none',
  duration: 3000
});

使用回调函数

uni.showToast({
  title: '提交成功,即将跳转到订单详情页面',
  icon: 'success',
  success() {
    console.log('toast 显示成功');
  },
  complete() {
    console.log('toast 调用完成');
  }
});

自定义图标(降级原生)

uni.showToast({
  title: '这个提示有自定义图标',
  icon: 'none',
  image: '/static/custom-icon.png'
});
// 注意:使用 image 参数时会降级走原生 toast,长文本仍可能被截断

多页面场景说明

tabBar 页面切换

插件通过 Vue.mixin 注入全局 onShow 钩子,tabBar 页面切换时自动激活当前页面的 Toast 组件,无需额外处理。

前提条件: 切换到的 tabBar 页面模板中必须包含 <gb-long-toast /> 组件。

<!-- pages/index/index.vue(首页 tabBar) -->
<template>
  <view>
    <gb-long-toast />
    <!-- 页面内容 -->
  </view>
</template>

<!-- pages/user/user.vue(我的 tabBar) -->
<template>
  <view>
    <gb-long-toast />
    <!-- 页面内容 -->
  </view>
</template>

二级页面跳转与返回

从 tabBar 页面进入二级页面再返回时,插件自动处理组件切换:

  • 当前页面有组件 → 使用自定义组件完整显示
  • 当前页面无组件 → 降级走原生 toast(截断但有提示)

页面未放置组件

如果某个页面没有放置 <gb-long-toast /> 组件,长文本 Toast 会自动降级走原生 uni.showToast。虽然文本会被截断,但至少保证了提示不会丢失。

建议: 所有需要长文本 Toast 的页面都应放置 <gb-long-toast /> 组件,以获得完整显示效果。

工作原理

┌──────────────────────────────────────────────────────────────────┐
│                       uni.showToast (已被 patch)                  │
├─────────────┬──────────────────────┬─────────────────────────────┤
│  title ≤ 10 │  title > 10          │  image 有值                 │
│  走原生     │  无 image             │  走原生(降级)             │
│             ├──────────────────────┤                              │
│             │  组件属于当前页面     │  组件不属于当前页面/无组件   │
│             │  调用组件 show()     │  降级走原生(截断但有提示)  │
│             │  完整显示            │                              │
└─────────────┴──────────────────────┴─────────────────────────────┘

页面可见性追踪:
  currentVisiblePageVm    // 当前可见页面的 VM 实例
  pageToastMap            // 页面→组件映射
  toastStack              // 组件实例栈,栈顶为当前活跃组件

  页面切换时(onShow):
  1. 记录 currentVisiblePageVm = this
  2. pageToastMap.get(this) → activateToast(instance) → 提升到栈顶
  3. showToast 时校验 top._pageVm === currentVisiblePageVm

注意事项

  1. 建议所有页面都放置 <gb-long-toast /> 组件,未放置组件的页面长文本 Toast 会降级走原生,仍可能被截断
  2. image 参数有值时会降级走原生 Toast,长文本仍可能被截断,建议短文本才使用自定义图标
  3. icon: 'loading' 模式下 Toast 不会自动关闭,需手动调用 uni.hideToast() 或再次调用 uni.showToast() 覆盖
  4. 插件内部使用 Vue.mixin 注入 onShow,如项目已有全局 mixin 的 onShow,两者会合并执行,不会冲突
  5. 从子页面返回当前页面时,如果当前页面没有组件,Toast 会自动降级走原生,确保提示不会丢失

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。