Lodash 使用 React Input 去抖动

IT技术 reactjs lodash relay debouncing
2021-05-19 02:17:56

我正在尝试将使用 lodash 的去抖动添加到从输入 onChange 事件调用的搜索函数中。下面的代码生成一个类型错误“期望函数”,我理解这是因为 lodash 期望一个函数。这样做的正确方法是什么,可以全部内联完成吗?到目前为止,我已经尝试了几乎所有关于 SO 的例子都无济于事。

search(e){
 let str = e.target.value;
 debounce(this.props.relay.setVariables({ query: str }), 500);
},
4个回答

debounce 函数可以在 JSX 中内联传递或直接设置为类方法,如下所示:

search: _.debounce(function(e) {
  console.log('Debounced Event:', e);
}, 1000)

小提琴: https : //jsfiddle.net/woodenconsulting/69z2wepo/36453/

如果您使用 es2015+,您可以直接在您的constructor或生命周期方法中定义您的 debounce方法,例如componentWillMount.

例子:

class DebounceSamples extends React.Component {
  constructor(props) {
    super(props);

    // Method defined in constructor, alternatively could be in another lifecycle method
    // like componentWillMount
    this.search = _.debounce(e => {
      console.log('Debounced Event:', e);
    }, 1000);
  }

  // Define the method directly in your class
  search = _.debounce((e) => {
    console.log('Debounced Event:', e);
  }, 1000)
}

这就是我在谷歌搜索一整天后不得不这样做的方式。

const MyComponent = (props) => {
  const [reload, setReload] = useState(false);

  useEffect(() => {
    if(reload) { /* Call API here */ }
  }, [reload]);

  const callApi = () => { setReload(true) }; // You might be able to call API directly here, I haven't tried
  const [debouncedCallApi] = useState(() => _.debounce(callApi, 1000));

  function handleChange() { 
    debouncedCallApi(); 
  }

  return (<>
    <input onChange={handleChange} />
  </>);
}

使用功能性react组件尝试使用useCallback. useCallback记住你的 debounce 函数,所以它不会在组件重新渲染时一次又一次地重新创建。没有useCallback去抖功能将不会与下一个击键同步。

`

import {useCallback} from 'react';
import _debounce from 'lodash/debounce';
import axios from 'axios';

function Input() {
    const [value, setValue] = useState('');

    const debounceFn = useCallback(_debounce(handleDebounceFn, 1000), []);

    function handleDebounceFn(inputValue) {
        axios.post('/endpoint', {
          value: inputValue,
        }).then((res) => {
          console.log(res.data);
        });
    }


    function handleChange (event) {
        setValue(event.target.value);
        debounceFn(event.target.value);
    };

    return <input value={value} onChange={handleChange} />
}

`

这不是那么容易的问题

一方面,为了解决您遇到的错误,您需要将您包裹setVariables在函数中:

 search(e){
  let str = e.target.value;
  _.debounce(() => this.props.relay.setVariables({ query: str }), 500);
}

另一方面,我相信去抖动逻辑必须封装在 Relay 中。