最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-27 22:28:23
文档

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

React-Native之定时器Timer的实现代码:在web开发中,我们通常需要使用定时器功能,使用setTimeout和setInterval函数。 那么在ReactNative中,是否也提供了定时器的功能呢? 答案是肯定的。 我们还是先看看官网怎么说的。 定时器是一个应用中非常重要的部分。React Native实现了和浏
推荐度:
导读React-Native之定时器Timer的实现代码:在web开发中,我们通常需要使用定时器功能,使用setTimeout和setInterval函数。 那么在ReactNative中,是否也提供了定时器的功能呢? 答案是肯定的。 我们还是先看看官网怎么说的。 定时器是一个应用中非常重要的部分。React Native实现了和浏

在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

    声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

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

    React-Native之定时器Timer的实现代码:在web开发中,我们通常需要使用定时器功能,使用setTimeout和setInterval函数。 那么在ReactNative中,是否也提供了定时器的功能呢? 答案是肯定的。 我们还是先看看官网怎么说的。 定时器是一个应用中非常重要的部分。React Native实现了和浏
    推荐度:
    标签: 计时器 代码 React
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top