React入门:编写带防抖节流的按钮组件

Posted hans774882968

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React入门:编写带防抖节流的按钮组件相关的知识,希望对你有一定的参考价值。

用IDEA创建一个react-app项目,过程无任何疑点,略。目录结构和默认的一样,略。

配置eslint

IDEA会自动搜索eslint-plugin.js(不在项目里),如果

<路径>\\plugins\\javascriptLanguage\\languageService\\eslint\\bin\\eslint-plugin.js

报错,就把this.cliEngine = require(this.basicPath + "lib/cli-engine");改成this.cliEngine = require(this.basicPath + "lib/cli-engine").CLIEngine;但是这不是一劳永逸的,旧版本的项目还得改回去……

react项目默认无eslintrc文件,但默认已经npm install eslint。所以直接eslint --init创建eslintrc即可

修改默认端口

最简便的方法是安装cross-env。

npm install cross-env -g

然后package.json,把start的命令修改为

"scripts": {
  "start": "cross-env PORT=3030 react-scripts start",
  ……
}

参考:https://blog.csdn.net/qq_34362251/article/details/100882429

写代码

构造函数那里,对于onClick所调用的成员方法要加上:

this.debounce = this.debounce.bind(this)
this.throttle = this.throttle.bind(this)

只是为了保持this,因为onClick会丢失this。

防抖节流实现,背下来吧:

  // debounce已达到预期效果!
  debounce(f,time = 1000){
    let timer = null
    return () => {
      if(timer) {
        clearTimeout(timer)
      }
      timer = setTimeout(f.bind(this),time)
    }
  }
  // throttle已达到预期效果!
  throttle(f,time = 1000){
    let timer = null
    return () => {
      if(timer) return
      timer = setTimeout(() => {
        f.apply(this)
        timer = null
      },time)
    }
  }

修改变量,不要直接赋值,应该使用this.setState

  updateVal1(){
    this.setState({
      val1: this.state.val1 + 1
    })
  }
  updateVal2(){
    this.setState({
      val2: this.state.val2 + 1
    })
  }

完整代码

Button.js

import React, {Component} from 'react'

class Button extends Component {
  constructor (props) {
    super(props)
    this.state = {
      val1: 0,
      val2: 0,
      test1: -1,
      test2: -2
    }
    this.debounce = this.debounce.bind(this)
    this.throttle = this.throttle.bind(this)
  }
  updateVal1 () {
    this.setState({
      val1: this.state.val1 + 1
    })
  }
  updateVal2 () {
    this.setState({
      val2: this.state.val2 + 1
    })
  }
  // debounce已达到预期效果!
  debounce (f,time = 1000) {
    let timer = null
    return () => {
      if(timer) {
        clearTimeout(timer)
      }
      timer = setTimeout(f.bind(this),time)
    }
  }
  // throttle已达到预期效果!
  throttle (f,time = 1000) {
    let timer = null
    return () => {
      if(timer) return
      timer = setTimeout(() => {
        f.apply(this)
        timer = null
      },time)
    }
  }
  render () {
    return (
      <div>
        <button style={{margin: '10px'}} onClick={this.debounce(this.updateVal1)}>
          防抖:点击+1 | {this.state.val1}
        </button>
        <button style={{margin: '10px'}} onClick={this.throttle(this.updateVal2)}>
          节流:点击+1 | {this.state.val2}
        </button>
        <span style={{margin: '10px'}}>测试1{this.state.test1}</span>
        <span style={{margin: '10px'}}>测试2{this.state.test2}</span>
      </div>
    )
  }
}

export default Button

App.js

import React from 'react'
import './App.css'
import Button from './Button'

function App () {
  return (
    <div className="wsw">
      <Button/>
    </div>
  )
}

export default App

以上是关于React入门:编写带防抖节流的按钮组件的主要内容,如果未能解决你的问题,请参考以下文章

防抖节流一步一步详细讲解,从简单到复杂,从入门到深入了解,再到 Vue 项目中是怎样调用防抖节流方法的

防抖节流 从简单到复杂,一步一步从入门到深入了解

JavaScript性能优化8——防抖与节流

JavaScript性能优化8——防抖与节流

微信小程序全局封装防抖节流函数

react实现防抖节流