为了账号安全,请及时绑定邮箱和手机立即绑定

React 使用 debounce 和 setState

React 使用 debounce 和 setState

沧海一幻觉 2022-05-26 10:24:54
背景假设我们都知道debounce函数 from lodash。如果用户快速输入1, 12, 123, ,它允许我们在一定的延迟时间后1234仅使用 , 进行一次警报。1234这非常用于减少请求量,用于优化。描述对于普通的输入字段,我们可以使用那种debounce并且它可以工作。问题:一旦我们setState在同一个回调中添加了debounce,debounce将无法正常工作。有谁知道原因?import React, { useState } from "react";import "./styles.css";import { debounce } from "lodash";export default function App() {  const [input, setInput] = useState("");  const debouceRequest = debounce(value => {    alert(`request: ${value}`);  }, 1000);  const onChange = e => {    setInput(e.target.value); // Remove this line will lead to normal debounce    debouceRequest(e.target.value);  };  return (    <div className="App">      <input onChange={onChange} />    </div>  );}
查看完整描述

1 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

试试这个(使用 useCallback):


import React, { useState, useCallback } from "react";

import "./styles.css";

import { debounce } from "lodash";


const request = debounce(value => {

  alert(`request: ${value}`);

}, 1000);


export default function App() {

  const [input, setInput] = useState("");


  const debouceRequest = useCallback(value => request(value), []);


  const onChange = e => {

    debouceRequest(e.target.value);

    setInput(e.target.value); // Remove this line will lead to normal denounce

  };


  return (

    <div className="App">

      <input onChange={onChange} />

    </div>

  );

}


查看完整回答
反对 回复 2022-05-26
  • 1 回答
  • 0 关注
  • 373 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号