Reasons and solutions for the failure of React event throttling effect

Reasons and solutions for the failure of React event throttling effect

Today, when I was working on a react project, I throttled an input onKeyDown event, but the throttling effect failed.

Problem code:

render() {
    return (
      <div className="search-bar">
        <input className="search-input" type="text" placeholder="Please enter the user name to search (English)" onKeyDown={this.throttle(this.handleKeyDown)}/>
      </div>
    )
  }
throttle = (fn) => {
    let valid = true
    const context = this

    return function() {
      if (!valid) return
      valid = false

      const args = arguments

      fn.apply(context, args)

      setTimeout(() => {
        valid = true
      }, 1000);
    }
  }

  handleKeyDown = (e) => {
    let { value } = e.target
    const keyCode = e.keyCode

    if (keyCode !== 13) return

    if (!value.trim()) return
    
    // Send search this.props.search(value)
  }

The problem here is:

this.props.search(value) in handleKeyDown() method
The component props are refreshed, triggering the react update flow lifecycle. Re-executed render();

In this way, the throttle() method will be re-executed;

throttle = (fn) => {
    console.log('%c throttle initialization', 'color: red');
    let valid = true
    const context = this

    return function() {
      if (!valid) return
      valid = false

      const args = arguments

      fn.apply(context, args)

      setTimeout(() => {
        valid = true
      }, 1000);
    }
  }

If you add printing to the code, you will see throttle initialization print multiple lines in the console;

Solution 1:

Put the throttling initialization position into the event function assignment

render() {
    return (
      <div className="search-bar">
        <input className="search-input" type="text" placeholder="Please enter the user name to search (English)" onKeyDown={this.handleKeyDown}/>
      </div>
    )
  }
handleKeyDown = this.throttle((e) => {
    let { value } = e.target
    const keyCode = e.keyCode

    if (keyCode !== 13) return

    if (!value.trim()) return
    
    // Send search this.props.search(value)
  })

Solution 2: Assign initialization in the constructor

render() {
    return (
      <div className="search-bar">
        <input className="search-input" type="text" placeholder="Please enter the user name to search (English)" onKeyDown={this.handleKeyDown}/>
      </div>
    )
  }
constructor(props) {
    super(props)
    this.handleKeyDown = this.throttle(this.handleSearch)
  }

  handleSearch = (e) => {
    let { value } = e.target
    const keyCode = e.keyCode

    if (keyCode !== 13) return

    if (!value.trim()) return
    
    // Send search this.props.search(value)
  }

Summary of mining pits:

To better understand the triggering mechanism of the react life cycle

The above is the detailed content of the reasons and solutions for the failure of React event throttling effect. For more information about the failure of React event throttling effect, please pay attention to other related articles on 123WORDPRESS.COM!

You may also be interested in:
  • How to introduce scss into react project
  • How to introduce Angular components in React
  • React introduces container components and display components to Vue
  • React internationalization react-intl usage
  • React Synthetic Events Explained
  • A brief comparison of Props in React
  • Detailed explanation of the solution for migrating antd+react projects to vite
  • React implementation example using Amap (react-amap)
  • A brief introduction to React

<<:  Examples of optimization techniques for slow query efficiency in MySQL IN statements

>>:  Explanation of Linux kernel optimization configuration for high-concurrency nginx server

Recommend

Navicat connection MySQL error description analysis

Table of contents environment Virtual Machine Ver...

How to implement the webpage anti-copying function (with cracking method)

By right-clicking the source file, the following c...

A brief analysis of CSS3 using text-overflow to solve text layout problems

Basic syntax The use of text-overflow requires th...

Detailed steps to install mysql in Win

This article shares the detailed steps of install...

Basic ideas and codes for implementing video players in browsers

Table of contents Preface Summary of audio and vi...

How to use CocosCreator object pool

Table of contents Preface: Specific operations St...

Practical record of solving MySQL deep paging problem

Table of contents Preface Why does limit deep pag...

Example usage of JavaScript tamper-proof object

Table of contents javascript tamper-proof object ...

Detailed explanation of how to use the Vue license plate input component

A simple license plate input component (vue) for ...

React error boundary component processing

This is the content of React 16. It is not the la...

How to implement remote automatic backup of MongoDB in Linux

Preface After reading the previous article about ...

Solution for converting to inline styles in CSS (css-inline)

Talk about the scene Send Email Embedding HTML in...

MySQL 5.6 installation steps with pictures and text

MySQL is an open source small relational database...

Do you know how to use vue-cropper to crop pictures in vue?

Table of contents 1. Installation: 2. Use: 3. Bui...