React Native:使用lodash debounce

Nor*_*ldt 17 javascript lodash reactjs react-native

我正在玩React Native和lodash的辩护.

使用以下代码只会使其像延迟而不是去抖动一样工作.

<Input
 onChangeText={(text) => {
  _.debounce(()=> console.log("debouncing"), 2000)()
 }
/>
Run Code Online (Sandbox Code Playgroud)

如果我输入像"foo"这样的输入,我希望控制台只记录一次debounce.现在它记录"debounce"3次.

Geo*_*nov 63

去抖动函数应该在render方法之外的某个地方定义,因为每次调用它时它都必须引用函数的同一个实例,因为它反对创建一个新的实例,就像现在当你把它放在onChangeText处理函数中时一样.

定义去抖功能的最常见位置在组件的对象上.这是一个例子:

class MyComponent extends React.Component {
  constructor() {
    this.onChangeTextDelayed = _.debounce(this.onChangeText, 2000);
  }

  onChangeText(text) {
    console.log("debouncing");
  }

  render() {
    return <Input onChangeText={this.onChangeTextDelayed} />
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您有任何理由立即调用去抖动的函数(例如,发生onBlur事件时),则非常适合。只需调用`this.onChangeTextDelayed.flush()`,最后的超时将立即被跳过。 (2认同)

Sam*_*ale 29

2019 年:使用“useCallback”反应钩子

在尝试了许多不同的方法之后,我发现使用“useCallback”是解决多个调用问题最简单、最有效的方法。

根据Hooks API 文档,“useCallback 返回回调的记忆版本,该版本仅在依赖项之一发生更改时才会更改。”

传递一个空数组作为依赖确保回调只被调用一次。这是一个简单的实现。

import React, { useCallback } from "react";
import { debounce } from "lodash";

const handler = useCallback(debounce(someFunction, 2000), []);

const onChange = (event) => {
    // perform any event related action here

    handler();
 };
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


rul*_*bir 6

正如其他答案已经指出的,去抖函数引用必须创建一次,并通过调用相同的引用来谴责相关函数(即changeTextDebounced在我的示例中)。

首先要导入的东西

import {debounce} from 'lodash';
Run Code Online (Sandbox Code Playgroud)

对于类组件

class SomeClassComponent extends React.Component {
  componentDidMount = () => {
    this.changeTextDebouncer = debounce(this.changeTextDebounced, 500);
  }

  changeTextDebounced = (text) => {
    console.log("debounced");
  }

  render = () => {
    return <Input onChangeText={this.changeTextDebouncer} />;
  }
}
Run Code Online (Sandbox Code Playgroud)

对于功能组件

const SomeFnComponent = () => {
  const changeTextDebouncer = useCallback(debounce(changeTextDebounced, 500), []);

  const changeTextDebounced = (text) => {
    console.log("debounced");
  }

  return <Input onChangeText={changeTextDebouncer} />;
}
Run Code Online (Sandbox Code Playgroud)