添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

防抖延时是经常用到的动能,比如处理滚动事件做一些复杂计算,这样就会频繁调用回调函数,很容易造成页面的卡顿。这种情况下,我们更希望把多次计算合并成一次,只操作一个精确点,我们普遍把这种方式成为debounce(防抖)和throttle(节流)

当持续触发事件时,一定时间段内没有再触发事件,事件处理函数就会执行一次,如果设定事件到来之前,又触发了事件就重新开始延时。也就是说当一个用户一直触发这个函数,且每次触发函数的间隔小于设定时间,那么防抖的情况下只会执行一次。把防抖封装成一个插件,每次使用只需要调用即可。

// debounce.js  防抖封装
let timeout = null
const debounce = (cb, wait = 500) => {
  if (timeout !== null) clearTimeout(timeout)
  timeout = setTimeout(() => {
    timeout = null
    cb && cb()
  }, wait);
module.exports = debounce;

我们可以放在App.js中全局调用,省掉每次的import导入。

 // App.js
 // 在app.js引入文件
import debounce from './src/utils/debounce'; 
// 定义一个全局变量debounce
global.debounce = debounce // 防抖 默认1000毫秒 使用方法 debounce(() => this.handle())

我们也可以在文件中单独引用直接在页面头部引用

// home.js
import debounce from './src/utils/debounce';   // 引入

注意 当前的debounce已经在App.js定义成全局变量,如果未定义需要单独引用

import React, { Component } from 'react'
import {
  Text,
  View,
  TextInput
} from 'react-native'
// 防抖测试
export default class Home extends Component {
  constructor(props) {
    super(props);
    this.state = {
      text: '',
      changeText: ''
  // 数据处理
  requstData = () => {
    this.setState({
      changeText: this.state.text
  inputValue = (text) => {
    this.setState({
      text: text
    // 使用防抖
    debounce(() => this.requstData(), 500)
  render() {
    return (
      <View style={{ flex: 1 }}>
        <Text style={{ fontSize: 20, color: '#000', fontWeight: 'bold' }}>防抖</Text>
        <TextInput
          style={{ height: 40, borderColor: 'gray', borderWidth: 1 }}
          onChangeText={(text) => this.inputValue(text)}
          value={this.state.text}
        <Text style={{ marginTop: 50, fontSize: 20, color: 'blue', fontWeight: 'bold' }}>
          防抖效果:{this.state.changeText}
        </Text>
      </View>
                    防抖延时是经常用到的动能,比如处理滚动事件做一些复杂计算,这样就会频繁调用回调函数,很容易造成页面的卡顿。这种情况下,我们更希望把多次计算合并成一次,只操作一个精确点,我们普遍把这种方式成为debounce(防抖)和throttle(节流)当持续触发事件时,一定时间段内没有再触发事件,事件处理函数就会执行一次,如果设定事件到来之前,又触发了事件就重新开始延时。也就是说当一个用户一直触发这个函数...
				
React Native中的懒包捆绑加载 这个仓库是一个在React Native应用程序中延迟加载javascript捆绑包的工作示例。 您可以在找到详细的博客文章。 在本地运行项目 在XCode中打开 通过单击“ Play按钮或使用Cmd + R运行项目 退出打开的打包程序窗口,以便从预先构建的捆绑包而不是本地Metro打包程序加载应用程序。 这是必需的,因为延迟加载当前仅适用于预构建的捆绑软件。
不得不说React-Native的Component生命周期还真是坑,文档里说在执行到componentDidMount方法后就可以开开心心的搞事了,没想到在这里加载完网络数据执行state更新的时候居然会影响到Navigator中新页面的启动。具体的问题是这样的: componentDidMount() { this._fetchData(); 在componentD
本组件用于封装视图,使其可以正确响应触摸操作。当按下的时候,封装的视图的不透明度会降低。这个过程并不会真正改变视图层级,大部分情况下很容易添加到应用中而不会带来一些奇怪的副作用。(译注:此组件与TouchableHighlight的区别在于并没有额外的颜色变化,更适于一般场景) &lt;TouchableOpacity style={styles.touch} onPre...
实现思路: 视频播放采用react-native-video,非常好用的视频播放库,列表整体采用FlatList实现,每一个item都占一整屏(flex设为1),再给FlatList设定pagingEnabled属性(滑动滚动一屏),viewabilityConfig中设定可见区域滑动的阈值。 实现过程: 我的代码使用了react-native-ui-lib库,所以直接复制控件的属性会...
debounce去抖:使用场景 例如:一个搜索框,输入1,请求数据得到包含1的数据;再输入2,得到包含12的数据…假如用户想得到1234的数据,就要调用4次接口得到,浪费请求资源,本地数据渲染也会走多次。 debounce可以解决此问题 this.getData 请求方法 500 延迟时间 option 配置 lodash在opitons参数中定义了一些选项,主要是以下三个: leading,函数在每个等待时延的开始被调用,默认值为false trailing,函数在每个等待时延的结束被调
在web开发中,我们通常需要使用定时器功能,使用setTimeout和setInterval函数。 那么在ReactNative中,是否也提供了定时器的功能呢? 答案是肯定的。 我们还是先看看官网怎么说的。 定时器是一个应用中非常重要的部分。React Native实现了和浏览器一致的定时器Timer。 提供的方法如下: setTimeout, clearTimeout
import React, {Component} from 'react'; import {Text} from 'react-native'; export default class TimerDemo extends Component{ static navigationOptions = { headerTitle:"定时器",//标题
记录一个坑,在react native项目调试中,如果打开了Debug JS Remotely,即在chrome中打开了调试控制台,此时项目中setTimeout和setInterval的时间间隔会失效,表现为:不管延迟时间设置为多少,都是会马上执行或者没反应。 关掉chrome debug就好了。 这个问题折磨了我好久,后来发现它早就出现在react native的Issues中了 http...
react-native中有时候需要定时执行一些后台任务,比如定时发送消息,定时统计数据等.这个时候就需要使用另外注册一个视图来做这些东西了,不然在同步任务中做这些任务,一旦任务比较耗时就会卡住后面的进程,甚至导致后面的进程不再渲染页面. 注册另外一个入口 在合适的位置:页面启动或者某个需要的时候,注册并启动我们的另外一个视图.这个时候其实相当于启动了另外一个线程. 这里注意一下,这个视图里的东西...
语法 ES6 Step1:介绍RN的定时器就是一个创建方法。并没有像iOS一样的NSTimer类 根据官方提供的文档,定时器有四种形式: • setTimeout, clearTimeout • setInterval, clearInterval
setTimeout, clearTimeoutsetInterval, clearIntervalsetImmediate, clearImmediaterequestAnimationFrame, cancelAnimationFrame requestAnimati
tomcat启动报错java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException? 44820 tomcat启动报错java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException? 「已注销」: [code=html] [/code]