react组件封装input框的防抖怎么处理

其他教程   发布日期:前天 09:31   浏览次数:78

今天小编给大家分享一下react组件封装input框的防抖怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

防抖

防抖就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间

项目中有些input框需要做防抖处理,防止每次输入都要发起请求或者做判断,也就是减少触发频率,以便提高性能,避免资源浪费

1.类组件版本

  1. //防抖的方法
  2. const debounceOther = (func, wait = 800) => {
  3. let timeout; // 定时器变量
  4. return function () {
  5. clearTimeout(timeout); // 每次触发时先清除上一次的定时器,然后重新计时
  6. timeout = setTimeout(() => {
  7. func(arguments);
  8. }, wait); // 指定 xx ms 后触发真正想进行的操作 handler
  9. };
  10. };

在项目中经常会将许多方法或复用性较高的事件封装,然后在页面引入

例:

防抖只需要看下面例子中getInputValue和inputChange即可

这是基于antd封装的一个弹窗组件,在input框 需要判断输入后是否与原有值重复,不做防抖处理则输入一次判断一次

这里是将有封装好的debounceOther函数的js文件直接引入到这个组件中使用了

  1. import { debounceOther } from ".........";
  2. class RelationModal extends Component {
  3. state = { visible: false, inputErr: '', inputValue: '' };
  4. getInputValue = debounceOther(() => {
  5. let { specSelect } = this.props; //原有数据
  6. //是否存在相同的
  7. let index = specSelect.findIndex(item => item.group === this.state.inputValue);
  8. this.setState({
  9. inputErr: index === -1 ? "" : '节点名称不允许重复'
  10. })
  11. },500)
  12. //拿到inputValue input输入框有变化500毫秒后 调用防抖方法
  13. inputChange = e => {
  14. this.setState({
  15. inputValue:e.target.value
  16. },()=>{
  17. this.getInputValue()
  18. })
  19. };
  20. }

2.函数组件版本

useCallback的作用其实是用来避免子组件不必要的reRender

  1. import {useRef,useCallback,useEffect} from 'react'
  2. function useDebounce(fn,delay,setval){
  3. const {current}=useRef({fn,timer:null})
  4. useEffect(()=>{
  5. current.fn=fn
  6. },[fn])
  7. return useCallback((e)=>{
  8. setval(e.target.value)
  9. if(current.timer){
  10. clearTimeout(current.timer)
  11. }
  12. current.timer=setTimeout(()=>{
  13. current.fn(e)
  14. },delay)
  15. })
  16. }
  17. export default useDebounce

调用

  1. import debounce from '../utils/debounce'
  2. import {useState} from 'react'
  3. function My(){
  4. let [val,setval]=useState('')
  5. const inputval=debounce(()=>{
  6. console.log(val);
  7. },1000,setval)
  8. return <div>
  9. <input type="text" value={val} onChange={(e)=>inputval(e)}/>
  10. </div>
  11. }
  12. export default My

以上就是react组件封装input框的防抖怎么处理的详细内容,更多关于react组件封装input框的防抖怎么处理的资料请关注九品源码其它相关文章!