en-US

You can use DUpload.PictureButton to quickly implement avatar upload. This example uses dBeforeUpload to check the file format and size.

zh-CN

可使用 DUpload.PictureButton 快速实现头像上传,该示例使用 dBeforeUpload 检查文件格式和大小。

import { useState } from 'react';

import { useImmer } from '@react-devui/hooks';
import { DUpload, DToast } from '@react-devui/ui';

let key = 0;
export default function Demo() {
  const [file, setFile] = useState();
  const [toasts, setToasts] = useImmer([]);

  return (
    <>
      <DUpload
        dXHRRequest={{ url: 'https://rd-upload.free.beeceptor.com' }}
        dTrigger={
          <DUpload.PictureButton
            dFile={file}
            onRemove={() => {
              setFile(undefined);
            }}
          />
        }
        dBeforeUpload={(file) => {
          const checkType = file.type === 'image/jpeg' || file.type === 'image/png';
          if (!checkType) {
            setToasts((draft) => {
              key += 1;
              draft.push({
                key,
                visible: true,
                content: 'Only support JPG/PNG file!',
              });
            });
          }

          const checkSize = file.size / 1024 / 1024 < 2;
          if (!checkSize) {
            setToasts((draft) => {
              key += 1;
              draft.push({
                key,
                visible: true,
                content: 'Only support size that smaller than 2MB!',
              });
            });
          }

          return checkType && checkSize;
        }}
        onModelChange={(files, data) => {
          const file = data.files[0];
          if (file.status !== null) {
            setFile(file);
          }
        }}
      >
        {({ trigger }) => trigger}
      </DUpload>
      {toasts.map(({ key, visible, content }) => (
        <DToast
          key={key}
          dVisible={visible}
          dType="error"
          onClose={() => {
            setToasts((draft) => {
              draft.find((n) => n.key === key).visible = false;
            });
          }}
        >
          {content}
        </DToast>
      ))}
    </>
  );
}