React Native开发封装Toast与加载Loading组件示例


Posted in Javascript onSeptember 08, 2018

在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Native官方并没有提供者这两个常用组件,需要开发者自己根据需求来自定义。作者就在其他组件的基础上在进行二次封装,使用起来更加简单,更具扩展性,同学们只需将Toast与Loading文件拖到项目中,install对应的组件库即可

效果图

React Native开发封装Toast与加载Loading组件示例 

Toast和Loading Demo地址

https://github.com/guangqiang-liu/react-native-toastAndLoading

Demo使用使用到的三方组件

  • react-native-root-toast:用来显示
  • toast react-native-root-siblings:用来Loading在App最上层添加视图
  • react-native-vector-icons:IconFont

注意

react-native-vector-icons 需要link 才能使用,同学们需要注意

Toast组件

toast组件这里作者分类8种不同的使用场景,目前能想到的就这多场景了,后面同学们有其他场景,可以自行添加即可,Toast组件中使用到的Icon图标,同学们也可以自行修改

  • 只显示最简单的文本的toast
  • 只显示最简单的文本的长toast,显示时长 + 500毫秒
  • 显示success的toast,success的Toast带有一个成功的对号icon
  • 显示success的toast,支持回调,使用场景类似于登录成功,显示1500毫秒toast,然后在回调函数中跳转到其他页面
  • 显示success的长toast,显示时长 + 500毫秒
  • 显示success的长toast,显示时长 + 500毫秒,支持回调,使用场景类似于登录成功,显示1000毫秒toast,然后跳转到其他页面
  • 显示warning的toast,使用场景类似于登录表单,手机号填写错误
  • 显示报错的toast,使用场景类似于登录表单,提交表单失败

 Loading组件

Loading组件最常用的使用场景就是网络请求时,数据还没有请求回来之前,页面最上层显示一个正在加载的loading框,一来能够防止用户在网络请求时又做其他的操作,二来可以给用户一个更好的体验,不至于页面空白,显得突兀

  1. loading支持手动调用显示:show()
  2. 支持手动关闭显示:hidden()

这里作者建议使用redux来控制Loading的显示与隐藏,这样不用在每一个需要网络请求的页面都手动去调用显示与隐藏,更高端的Loading使用技巧可以参照作者的 https://github.com/guangqiang-liu/OneM

Toast核心源码

const Toast = {

 toast: null,

 show: msg => {
 this.toast = RootToast.show(msg, {
 position: 0,
 duration: 1500
 })
 },

 showLong: msg => {
 this.toast = RootToast.show(msg, {
 position: 0,
 duration: 2000
 })
 },

 showSuccess: (msg, options) => {
 let toast = RootToast.show(
 Platform.OS === 'ios' ?
 <View style={styles.container}>
  <Icon name='check' size={50} color={'#fff'}/>
  <Text style={styles.message}>{msg}</Text>
 </View> : msg, {
 duration: 1500,
 position: RootToast.positions.CENTER,
 ...options,
 })
 setTimeout(function () {
 RootToast.hide(toast)
 typeof options === 'function' ? options && options(): null
 }, 2000)
 },

 showLongSuccess: (msg, options) => {
 let toast = RootToast.show(
 Platform.OS === 'ios' ?
 <View style={styles.container}>
  <Icon name='check' size={50} color={'#fff'}/>
  <Text style={styles.message}>{msg}</Text>
 </View> : msg, {
 duration: 2000,
 position: RootToast.positions.CENTER,
 ...options,
 })
 setTimeout(function () {
 RootToast.hide(toast)
 typeof options === 'function' ? options && options(): null
 }, 2500)
 },

 showWarning: (msg, options) => {
 let toast = RootToast.show(
 Platform.OS === 'ios' ?
 <View style={styles.container}>
  <Icon name='warning' size={40} color={'#fff'}/>
  <Text style={styles.message}>{msg}</Text>
 </View> : msg, {
 duration: RootToast.durations.SHORT,
 position: RootToast.positions.CENTER,
 ...options,
 })
 setTimeout(function () {
 RootToast.hide(toast)
 }, RootToast.durations.SHORT + 500)
 },

 showError: (msg, options) => {
 let toast = RootToast.show(
 Platform.OS === 'ios' ?
 <View style={styles.container}>
  <Icon name='close' size={40} color={'#fff'}/>
  <Text style={styles.message}>{msg}</Text>
 </View> : msg, {
 duration: RootToast.durations.SHORT,
 position: RootToast.positions.CENTER,
 ...options,
 })
 setTimeout(function () {
 RootToast.hide(toast)
 }, RootToast.durations.SHORT + 500)
 }

}

Loading核心源码

const HUD = {

 show: () => {
 sibling = new RootSiblings(
 <View style={styles.maskStyle}>
 <View style={styles.backViewStyle}>
  <ActivityIndicator size="large" color="white" />
 </View>
 </View>
 )
 },

 hidden: ()=> {
 if (sibling instanceof RootSiblings) {
 sibling.destroy()
 }
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js生成的验证码的实现与技术分析
Sep 17 Javascript
jQuery中:text选择器用法实例
Jan 03 Javascript
jQuery实现冻结表格行和列
Apr 29 Javascript
Jquery 效果使用详解
Nov 23 Javascript
AngularJS  $on、$emit和$broadcast的使用
Sep 05 Javascript
详解webpack+es6+angular1.x项目构建
May 02 Javascript
JavaScript 中Date对象的格式化代码方法汇总
Sep 06 Javascript
echarts饼图扇区添加点击事件的实例
Oct 16 Javascript
vue将单页面改造成多页面应用的方法
Nov 25 Javascript
使用Angular自定义字段校验指令的方法示例
Feb 01 Javascript
微信小程序云开发 搭建一个管理小程序
May 17 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
Jul 19 Javascript
原生JS实现前端本地文件上传
Sep 08 #Javascript
JS实现可视化文件上传
Sep 08 #Javascript
js实现文件上传功能 后台使用MultipartFile
Sep 08 #Javascript
vue-router的HTML5 History 模式设置
Sep 08 #Javascript
vue移动端下拉刷新和上拉加载的实现代码
Sep 08 #Javascript
react 父子组件之间通讯props
Sep 08 #Javascript
js代码规范之Eslint安装与配置详解
Sep 08 #Javascript
You might like
一个简单计数器的源代码
2006/10/09 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
jQuery入门知识简介
2010/03/04 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
关于跨站脚本攻击问题
2011/12/22 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
express express-session的使用小结
2018/12/12 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
高中军训感言500字
2014/02/24 职场文书
体操比赛口号
2014/06/10 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
导游词之舟山普陀山
2019/11/06 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
redis实现的四种常见限流策略
2021/06/18 Redis