全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

React-Native之定时器Timer的实现代码

在web开发中,我们通常需要使用定时器功能,使用setTimeout和setInterval函数。

那么在ReactNative中,是否也提供了定时器的功能呢? 答案是肯定的。

我们还是先看看官网怎么说的。

定时器是一个应用中非常重要的部分。React Native实现了和浏览器一致的定时器Timer。

提供的方法如下:

  • setTimeout, clearTimeout
  • setInterval, clearInterval
  • setImmediate, clearImmediate
  • requestAnimationFrame, cancelAnimationFrame

setTimeout (fn, 1000)  和 setInterval (fn,1000)

和web中的意思一样,前者表示延迟1000毫秒后执行 fn 方法 ,后者表示每隔1000毫秒执行 fn 方法。

requestAnimationFrame(fn)和setTimeout(fn, 0)不同,前者会在每帧刷新之后执行一次,而后者则会尽可能快的执行(在iPhone5S上有可能每秒1000次以上)。

setImmediate则会在当前JavaScript执行块结束的时候执行,就在将要发送批量响应数据到原生之前。注意如果你在setImmediate的回调函数中又执行了setImmediate,它会紧接着立刻执行,而不会在调用之前等待原生代码。

Promise的实现就使用了setImmediate来执行异步调用。

InteractionManager(交互管理器)

原生应用感觉如此流畅的一个重要原因就是在互动和动画的过程中避免繁重的操作。在React Native里,我们目前受到限制,因为我们只有一个JavaScript执行线程。不过你可以用InteractionManager来确保在执行繁重工作之前所有的交互和动画都已经处理完毕。

应用可以通过以下代码来安排一个任务,使其在交互结束之后执行:

InteractionManager.runAfterInteractions(() => { 
  // ...需要长时间同步执行的任务... 
}); 

我们来把它和之前的几个任务安排方法对比一下:

requestAnimationFrame(): 用来执行在一段时间内控制视图动画的代码

setImmediate/setTimeout/setInterval(): 在稍后执行代码。注意这有可能会延迟当前正在进行的动画。

runAfterInteractions(): 在稍后执行代码,不会延迟当前进行的动画。
触摸处理系统会把一个或多个进行中的触摸操作认定为'交互',并且会将runAfterInteractions()的回调函数延迟执行,直到所有的触摸操作都结束或取消了。

InteractionManager还允许应用注册动画,在动画开始时创建一个交互“句柄”,然后在结束的时候清除它。

var handle = InteractionManager.createInteractionHandle(); 
// 执行动画... (`runAfterInteractions`中的任务现在开始排队等候) 
// 在动画完成之后 
InteractionManager.clearInteractionHandle(handle); 
// 在所有句柄都清除之后,现在开始依序执行队列中的任务 

TimerMixin

我们发现很多React Native应用发生致命错误(闪退)是与计时器有关。具体来说,是在某个组件被卸载(unmount)之后,计时器却仍然被激活。为了解决这个问题,我们引入了TimerMixin。如果你在组件中引入TimerMixin,就可以把你原本的setTimeout(fn, 500)改为this.setTimeout(fn, 500)(只需要在前面加上this.),然后当你的组件卸载时,所有的计时器事件也会被正确的清除。

这个库并没有跟着React Native一起发布。你需要在项目文件夹下输入npm i react-timer-mixin --save来单独安装它。

var TimerMixin = require('react-timer-mixin'); 
 
var Component = React.createClass({ 
 mixins: [TimerMixin], 
 componentDidMount: function() { 
  this.setTimeout( 
   () => { console.log('这样我就不会导致内存泄露!'); }, 
   500 
  ); 
 } 
}); 

我们强烈建议您使用react-timer-mixin提供的this.setTimeout(...)来代替setTimeout(...)。这可以规避许多难以排查的BUG。

译注:Mixin属于ES5语法,对于ES6代码来说,无法直接使用Mixin。

如果你的项目是用ES6代码编写,同时又使用了计时器,那么你只需铭记在unmount组件时清除(clearTimeout/clearInterval)所有用到的定时器。

那么也可以实现和TimerMixin同样的效果。例如:

import React,{ 
 Component 
} from 'react-native'; 
 
 
export default class Hello extends Component { 
 componentDidMount() { 
  this.timer = setTimeout( 
   () => { console.log('把一个定时器的引用挂在this上'); }, 
   500 
  ); 
 } 
 componentWillUnmount() { 
  // 如果存在this.timer,则使用clearTimeout清空。 
  // 如果你使用多个timer,那么用多个变量,或者用个数组来保存引用,然后逐个clear 
  this.timer && clearTimeout(this.timer); 
 } 
}; 

注意点:

1、定时器功能比较简单,注意在es6中使用时,需铭记在unmount组件时清除(clearTimeout/clearInterval)所有用到的定时器。
2、可以使用定时器实现一些普通功能:如短信倒计时等
3、对于一些需要延迟执行的特殊场景也可以使用Timer,譬如:目前RN提供的fetch是没有提供设置超时时间的,如果客户端请求后端的一个接口,接口超时了(后端服务设置的超时时间为10s),那么RN界面就一直loading,也不能aborded。那么这时候我们就可以巧妙的使用计时器,如果客户端发出的Request,时间大于某个值(5秒),那么我们直接认为请求失败。
4、今天还发现一个使用setTimeout的场景,在列表页加载下一页的时候,如果接口响应很快,就不会出现loading的效果,这个时候为了有loading的效果,设置一个500毫秒的延时,呵呵....

参考:http://reactnative.cn/docs/0.31/timers.html#content

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


# React  # Native  # 定时器  # Timers  # 详解React Native开源时间日期选择器组件(react-native-datetime)  # react native中的聊天气泡及timer封装成的发送验证码倒计时  # 计时器  # 多个  # 句柄  # 你在  # 会在  # 可以使用  # 则会  # 回调  # 稍后  # 就可以  # 客户端  # 后端  # 是一个  # 几个  # 我就  # 如果你  # 是在  # 就在  # 也会  # 下一页 


相关文章: 深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  建站主机选哪种环境更利于SEO优化?  如何在万网自助建站平台快速创建网站?  音乐网站服务器如何优化API响应速度?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  建站之星如何快速解决建站难题?  如何选择CMS系统实现快速建站与SEO优化?  建站OpenVZ教程与优化策略:配置指南与性能提升  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  教学论文网站制作软件有哪些,写论文用什么软件 ?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何在建站之星绑定自定义域名?  Android自定义控件实现温度旋转按钮效果  如何在橙子建站上传落地页?操作指南详解  建站之星在线版空间:自助建站+智能模板一键生成方案  中山网站制作网页,中山新生登记系统登记流程?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  如何撰写建站申请书?关键要点有哪些?  建站之星安装路径如何正确选择及配置?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  招贴海报怎么做,什么是海报招贴?  如何快速搭建响应式可视化网站?  南宁网站建设制作定制,南宁网站建设可以定制吗?  如何获取PHP WAP自助建站系统源码?  无锡营销型网站制作公司,无锡网选车牌流程?  建站主机服务器选购指南:轻量应用与VPS配置解析  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何将凡科建站内容保存为本地文件?  广州美橙建站如何快速搭建多端合一网站?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  h5网站制作工具有哪些,h5页面制作工具有哪些?  建站之星如何实现PC+手机+微信网站五合一建站?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  北京建设网站制作公司,北京古代建筑博物馆预约官网?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  *服务器网站为何频现安全漏洞?  如何高效生成建站之星成品网站源码?  想学网站制作怎么学,建立一个网站要花费多少?  如何用PHP工具快速搭建高效网站?  太平洋网站制作公司,网络用语太平洋是什么意思?  黑客如何利用漏洞与弱口令入侵网站服务器?  建站之星在线客服如何快速接入解答?  如何选择适配移动端的WAP自助建站平台?  如何用PHP快速搭建高效网站?分步指南  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  电商网站制作公司有哪些,1688网是什么意思?  东莞专业制作网站的公司,东莞大学生网的网址是什么? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。