antd组件onChange回调,需要立即执行改变value与防抖节省接口开销。

普通使用

当我们使用Antd的input或者select进行搜索时,onChange回调会即时执行。

import { Input } from "antd";
export default function HomePage() {
  return (
    <div>
      <Input
        onChange={(v) => {
          console.log("value", v.target.value);
        }}
      />
    </div>
  );
}

当输入123时,控制台打印了三次

在这里插入图片描述

使用防抖节省开销

当我们需要与后台配合使用时,如后台搜索。为了减少接口的调用次数,我们常常使用防抖函数来进行优化。

import { Input } from "antd";
import { debounce } from "lodash-es";
export default function HomePage() {
  return (
    <div>
      <Input
        onChange={debounce((v) => {
          console.log("value", v.target.value);
        }, 500)}
      />
    </div>
  );
}

当每次的输入间隔小于500ms时,输入123,控制台只打印了一次

在这里插入图片描述

页面功能复杂需要value受控

当我们的页面比较复杂时,除自己外,其他的组件或页面也可以操控input的内容显示。这时我们就需要给input一个value来手动控制input的内容。

import { ChangeEvent, useState } from "react";
import { Input } from "antd";
export default function HomePage() {
  const [value, setValue] = useState("123");
  const handleOnchange = (v: ChangeEvent<HTMLInputElement>) => {
    console.log("value", v.target.value);
    setValue(v.target.value);
  };
  return (
    <div>
      <Input value={value} onChange={handleOnchange} />
    </div>
  );
}

初始值123,输入666,和第一次一样打印了三次

在这里插入图片描述

增加防抖函数

import { ChangeEvent, useState } from "react";
import { Input } from "antd";
import { debounce } from "lodash-es";
export default function HomePage() {
  const [value, setValue] = useState("123");
  const handleOnchange = debounce((v: ChangeEvent<HTMLInputElement>) => {
    console.log("value", v.target.value);
    setValue(v.target.value);
  }, 500);
  return (
    <div>
      <Input value={value} onChange={handleOnchange} />
    </div>
  );
}

在这里插入图片描述
这里虽然打印了一次,但是value值始终没有改变。

我防抖了value的改变,因此value值没有即时改变,那么onChange的value也不是即时的,所以我的value始终无法改变。

回调需要部分代码立即执行,部分代码防抖延时执行

为了解决上一个问题,我们需要立即执行value的改变,但是接口请求还是需要防抖延时执行。

import { ChangeEvent, useState } from "react";
import { Input } from "antd";
import { debounce } from "lodash-es";
export default function HomePage() {
  const [value, setValue] = useState("");

  const handleDebounceSearch = debounce((v: string) => {
    console.log("vv", v);
  }, 500);

  const handleOnchange = (v: ChangeEvent<HTMLInputElement>) => {
    setValue(v.target.value); // 立即执行
    handleDebounceSearch(v.target.value); // 防抖延时
  };
  return (
    <div>
      <Input value={value} onChange={handleOnchange} />
    </div>
  );
}

在这里插入图片描述
value可以正常显示了,打印的内容也有明显的延迟,但是还是打印了多次,这是为什么?

状态的改变会刷新组件,这个函数式组件重新渲染,handleDebounceSearch方法重新定义,因此每次onChange执行的handleDebounceSearch方法都不是同一个(引用地址不同)。

将handleDebounceSearch函数的引用地址固定住就可以。

可以使用useRef或者useCallback

useRef

import { ChangeEvent, useEffect, useRef, useState } from "react";
import { Input } from "antd";
import { debounce } from "lodash-es";
export default function HomePage() {
  const [value, setValue] = useState("");

  const handleDebounceSearch = useRef(
    debounce(async (value: string) => {
      console.log("vv", value);
    }, 500)
  ).current;

  useEffect(() => {
    return () => {
      handleDebounceSearch.cancel();
    };
  }, []);

  const handleOnchange = (v: ChangeEvent<HTMLInputElement>) => {
    setValue(v.target.value); // 立即执行
    handleDebounceSearch(v.target.value); // 防抖延时
  };
  return (
    <div>
      <Input value={value} onChange={handleOnchange} />
    </div>
  );
}

useCallback

import { ChangeEvent, useCallback, useEffect, useState } from "react";
import { Input } from "antd";
import { debounce } from "lodash-es";
export default function HomePage() {
  const [value, setValue] = useState("");

  const handleDebounceSearch = useCallback(
    debounce((v: string) => {
      console.log("vv", v);
    }, 500),
    []
  );

  useEffect(() => {
    return () => {
      handleDebounceSearch.cancel();
    };
  }, []);

  const handleOnchange = (v: ChangeEvent<HTMLInputElement>) => {
    setValue(v.target.value); // 立即执行
    handleDebounceSearch(v.target.value); // 防抖延时
  };
  return (
    <div>
      <Input value={value} onChange={handleOnchange} />
    </div>
  );
}

在这里插入图片描述

注意组件卸载时清除定时器handleDebounceSearch.cancel()

小结

  • 回调函数频繁调用,并且有较大的请求开销
  • 可以使用防抖的方法解决次数频繁调用
  • 回调的即时处理与防抖处理可分开处理
  • 要注意防抖函数的定义,引用地址是否相同。
Ant Design的Upload组件onChange返回的状态回调包含了一些重要的属性,我们可以根据这些属性来判断上传状态。 以下是一个示例代码,用于判断上传状态: ```javascript import { Upload, message } from 'antd'; import { LoadingOutlined, PlusOutlined } from '@ant-design/icons'; const UploadComponent = () => { const [loading, setLoading] = useState(false); const [imageUrl, setImageUrl] = useState(''); const handleChange = (info) => { if (info.file.status === 'uploading') { setLoading(true); return; } if (info.file.status === 'done') { setLoading(false); setImageUrl(info.file.response.url); message.success('上传成功!'); } if (info.file.status === 'error') { setLoading(false); message.error('上传失败!'); } }; const uploadButton = ( <div> {loading ? <LoadingOutlined /> : <PlusOutlined />} <div style={{ marginTop: 8 }}>上传</div> </div> ); return ( <Upload name="avatar" listType="picture-card" className="avatar-uploader" showUploadList={false} action="/api/upload" onChange={handleChange} > {imageUrl ? ( <img src={imageUrl} alt="avatar" style={{ width: '100%' }} /> ) : ( uploadButton )} </Upload> ); }; ``` 在这个示例代码中,我们通过useState来保存上传状态,包括loading和imageUrl。在handleChange回调中,我们根据上传状态来更新loading和imageUrl,并显示相应的提示信息。例如,当上传成功时,我们更新imageUrl,并显示一个上传成功的提示信息。 此外,我们还通过Ant Design的Upload组件来实现文件上传。在这个组件中,我们设置了上传的名称、上传类型、上传地址和状态回调等属性。其中,onChange回调中的info参数包含了文件的上传状态、文件名、文件大小、文件类型等信息,我们可以通过这些信息来判断上传状态。 综上所述,我们可以通过onChange返回的状态回调来判断Ant Design的Upload组件的上传状态,并根据上传状态来更新界面和显示提示信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值