在鸿蒙应用开发中,如果团队已经基于 React Native 构建跨端业务,轻提示组件的选型往往比原生开发更讲究。原因很简单:ToastAndroid 是 Android 专属 API,在鸿蒙上无法直接复用,而 RN 自带的 Toast 能力又不够统一。react-native-easy-toast 这个纯 JS 实现的轻提示库,恰好填补了这个空档,在鸿蒙上几乎零配置即可运行,为跨平台 Toast 体验提供了一致方案。
# 安装与引入
react-native-easy-toast 是纯 JS 库,不需要原生链接,安装命令非常简单:
- yarn add react-native-easy-toast
复制代码
安装完成后,在组件中引入即可,注意 DURATION 常量需要从库中显式导入:
- import Toast, { DURATION } from 'react-native-easy-toast';
复制代码
基础用法通过 ref 调用 show 方法,和普通 RN 组件一样,适合在函数组件中使用:
- import React, { useRef } from 'react';
- import Toast, { DURATION } from 'react-native-easy-toast';
- export default function MyScreen() {
- const toastRef = useRef<Toast>(null);
- const showToast = () => {
- toastRef.current?.show('Hello World', DURATION.LENGTH_SHORT);
- };
- return (
- <View>
- <Toast ref={toastRef} />
- <Button title="显示 Toast" onPress={showToast} />
- </View>
- );
- }
复制代码
# 显示时长与位置控制
Toast 支持三种位置:bottom(默认)、center、top。位置既可以通过 Toast 组件的 position Prop 统一设置,也可以在调用 show 方法时按需传入第三个参数,灵活性比较高:
- toastRef.current?.show('顶部提示', DURATION.LENGTH_SHORT, 'top');
- toastRef.current?.show('居中提示', DURATION.LENGTH_SHORT, 'center');
- toastRef.current?.show('底部提示', DURATION.LENGTH_SHORT, 'bottom');
复制代码
时长方面,DURATION 提供了 LENGTH_SHORT、LENGTH_LONG 等常见档位,直接传数字虽然也能运行,但在鸿蒙上可能产生不可预期行为,因此官网并不推荐。
# 自定义样式与高级用法
实际项目中,默认 Toast 样式往往不能满足设计稿要求。react-native-easy-toast 支持通过 style 和 textStyle 自定义容器与文本样式,还提供了淡入淡出动画时长、透明度等参数:
- <Toast
- ref={toastRef}
- position="center"
- positionValue={200}
- fadeInDuration={300}
- fadeOutDuration={500}
- opacity={0.9}
- textStyle={{ color: '#fff', fontSize: 14 }}
- style={{ backgroundColor: '#333', borderRadius: 20, paddingHorizontal: 20 }}
- />
复制代码
更实用的能力是永久显示模式。比如在加载中场景,Toast 可以一直停留在屏幕上,直到业务操作完成再手动关闭:
- toastRef.current?.show('加载中...', DURATION.FOREVER);
- toastRef.current?.close();
复制代码
这种模式非常适合表单提交、网络请求等待、操作确认等需要阻塞交互的场景。
# 鸿蒙适配踩坑记录
在鸿蒙上使用这个库,有几个细节需要特别注意,否则很容易踩坑。
## 1. DURATION 必须从库导入
不要贪图方便直接传数字常量。库内部对 DURATION 的枚举值有强依赖,直接传数字可能导致显示时长异常,甚至出现不可预期的行为。正确做法始终是从库中导入 DURATION。
## 2. FOREVER 模式必须手动关闭
使用 DURATION.FOREVER 时,如果不在适当生命周期(如页面卸载、请求完成)调用 close(),Toast 会一直霸占屏幕,影响后续交互和页面跳转。建议在 useEffect 清理函数中补充 close() 兜底。
## 3. 多 Toast 同时显示存在覆盖问题
这个库不保证同时显示多个 Toast,后触发的 Toast 会覆盖前一个。如果业务上有连续触发提示的需求,需要自己做节流或队列处理,避免提示信息被吞掉。
## 4. Modal 中嵌套 Toast 的层级问题
在鸿蒙的 Modal 中使用 Toast 时,必须确保 Toast 组件渲染在 Modal 层级内部,否则可能会出现 Toast 被 Modal 遮挡或者层级错乱的问题。如果 Toast 在外层,弹窗内的提示会看不到。
# 完整示例
下面是一个可直接运行的完整示例,覆盖了显示与关闭两个核心操作:
- import React, { useRef } from 'react';
- import { View, Text, TouchableOpacity } from 'react-native';
- import Toast, { DURATION } from 'react-native-easy-toast';
- export default function ToastExample() {
- const toast = useRef<Toast>(null);
- return (
- <View style={{ flex: 1, justifyContent: 'center' }}>
- <Toast ref={toast} />
- <TouchableOpacity onPress={() => {
- toast.current?.show('操作成功', DURATION.LENGTH_SHORT);
- }}>
- <Text>显示 Toast</Text>
- </TouchableOpacity>
- <TouchableOpacity onPress={() => {
- toast.current?.close();
- }}>
- <Text>关闭 Toast</Text>
- </TouchableOpacity>
- </View>
- );
- }
复制代码
# 适用场景总结
从项目实践来看,react-native-easy-toast 在鸿蒙上主要解决三类问题:一是替代 ToastAndroid 的跨端能力,让代码在 Android、iOS、鸿蒙上保持一致;二是通过 FOREVER 模式实现加载状态提示,避免用户重复操作;三是通过统一样式配置减少各端视觉差异。
具体可覆盖的场景包括:
- 表单提交成功/失败提示
- 网络状态变化提示
- 操作结果反馈(如删除确认、收藏成功)
- 加载状态提示(配合 FOREVER)
- 错误/警告信息提示
如果你正在鸿蒙上做 React Native 跨端开发,这个库可以作为轻提示的首选方案。关键是记住:DURATION 从库导入、FOREVER 必须手动关闭、多 Toast 做好防抖、Modal 内注意层级,这样基本不会遇到大坑。 |