全网整合营销服务商

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

免费咨询热线: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封装成的发送验证码倒计时  # 计时器  # 多个  # 句柄  # 你在  # 会在  # 可以使用  # 则会  # 回调  # 稍后  # 就可以  # 客户端  # 后端  # 是一个  # 几个  # 我就  # 如果你  # 是在  # 就在  # 也会  # 下一页 


相关文章: 建站之星后台搭建步骤解析:模板选择与产品管理实操指南  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  专业公司网站制作公司,用什么语言做企业网站比较好?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  网站制作难吗安全吗,做一个网站需要多久时间?  如何用狗爹虚拟主机快速搭建网站?  大连 网站制作,大连天途有线官网?  微信小程序 input输入框控件详解及实例(多种示例)  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  网站app免费制作软件,能免费看各大网站视频的手机app?  高防服务器租用如何选择配置与防御等级?  定制建站哪家更专业可靠?推荐榜单揭晓  零服务器AI建站解决方案:快速部署与云端平台低成本实践  网页设计网站制作软件,microsoft office哪个可以创建网页?  如何在Windows虚拟主机上快速搭建网站?  电商网站制作价格怎么算,网上拍卖流程以及规则?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何在腾讯云服务器上快速搭建个人网站?  建站之星北京办公室:智能建站系统与小程序生成方案解析  家庭建站与云服务器建站,如何选择更优?  如何安全更换建站之星模板并保留数据?  如何在IIS中新建站点并配置端口与物理路径?  如何选择香港主机高效搭建外贸独立站?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何在云虚拟主机上快速搭建个人网站?  C#如何使用XPathNavigator高效查询XML  如何快速搭建FTP站点实现文件共享?  建站之星导航配置指南:自助建站与SEO优化全解析  建站之星如何配置系统实现高效建站?  建站之星2.7模板:企业网站建设与h5定制设计专题  网站制作模板下载什么软件,ppt模板免费下载网站?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  表情包在线制作网站免费,表情包怎么弄?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  网站企业制作流程,用什么语言做企业网站比较好?  微信推文制作网站有哪些,怎么做微信推文,急?  历史网站制作软件,华为如何找回被删除的网站?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站之星后台密码如何安全设置与找回?  如何续费美橙建站之星域名及服务?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  建站之星安全性能如何?防护体系能否抵御黑客入侵?  建站之星如何优化SEO以实现高效排名?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  建站VPS配置与SEO优化指南:关键词排名提升策略  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何通过WDCP绑定主域名及创建子域名站点?  如何通过FTP空间快速搭建安全高效网站? 

您的项目需求

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