您好,登錄后才能下訂單哦!
今天小編給大家分享一下react組件封裝input框的防抖怎么處理的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
防抖就是指觸發事件后在 n 秒內函數只能執行一次,如果在 n 秒內又觸發了事件,則會重新計算函數執行時間
項目中有些input框需要做防抖處理,防止每次輸入都要發起請求或者做判斷,也就是減少觸發頻率,以便提高性能,避免資源浪費
//防抖的方法 const debounceOther = (func, wait = 800) => { let timeout; // 定時器變量 return function () { clearTimeout(timeout); // 每次觸發時先清除上一次的定時器,然后重新計時 timeout = setTimeout(() => { func(arguments); }, wait); // 指定 xx ms 后觸發真正想進行的操作 handler }; };
在項目中經常會將許多方法或復用性較高的事件封裝,然后在頁面引入
例:
防抖只需要看下面例子中getInputValue和inputChange即可
這是基于antd封裝的一個彈窗組件,在input框 需要判斷輸入后是否與原有值重復,不做防抖處理則輸入一次判斷一次
這里是將有封裝好的debounceOther函數的js文件直接引入到這個組件中使用了
import { debounceOther } from "........."; class RelationModal extends Component { state = { visible: false, inputErr: '', inputValue: '' }; getInputValue = debounceOther(() => { let { specSelect } = this.props; //原有數據 //是否存在相同的 let index = specSelect.findIndex(item => item.group === this.state.inputValue); this.setState({ inputErr: index === -1 ? "" : '節點名稱不允許重復' }) },500) //拿到inputValue input輸入框有變化500毫秒后 調用防抖方法 inputChange = e => { this.setState({ inputValue:e.target.value },()=>{ this.getInputValue() }) }; }
useCallback的作用其實是用來避免子組件不必要的reRender
import {useRef,useCallback,useEffect} from 'react' function useDebounce(fn,delay,setval){ const {current}=useRef({fn,timer:null}) useEffect(()=>{ current.fn=fn },[fn]) return useCallback((e)=>{ setval(e.target.value) if(current.timer){ clearTimeout(current.timer) } current.timer=setTimeout(()=>{ current.fn(e) },delay) }) } export default useDebounce
調用
import debounce from '../utils/debounce' import {useState} from 'react' function My(){ let [val,setval]=useState('') const inputval=debounce(()=>{ console.log(val); },1000,setval) return <div> <input type="text" value={val} onChange={(e)=>inputval(e)}/> </div> } export default My
以上就是“react組件封裝input框的防抖怎么處理”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。