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控制CSS样式属性语法对照表
Dec 11 Javascript
jquery 模板的应用示例
Nov 12 Javascript
关于JS数组追加数组采用push.apply的问题
Jun 09 Javascript
Node.js 的异步 IO 性能探讨
Oct 08 Javascript
JS 作用域与作用域链详解
Apr 07 Javascript
javascript原生ajax写法分享
Apr 10 Javascript
深入剖析JavaScript中的函数currying柯里化
Apr 29 Javascript
javaScript知识点总结(必看篇)
Jun 10 Javascript
JS实现微信弹出搜索框 多条件查询功能
Dec 13 Javascript
通过实例讲解JS如何防抖动
Jun 15 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
Sep 24 Javascript
Vue触发input选取文件点击事件操作
Aug 07 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
Python中拆分字符串的操作方法
2019/07/23 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
一套中级Java程序员笔试题
2015/01/14 面试题
大学生最常用的自我评价
2013/12/07 职场文书
校园达人秀策划书
2014/01/12 职场文书
迅雷Cued工作心得体会
2014/01/27 职场文书
旷课检讨书3000字
2014/02/04 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript