ຂ້າມໄປຫາເນື້ອຫາຫຼັກ

ການອ້າງອີງຄ່າທີ່ສົ່ງຄືນ

ທຸກຢ່າງທີ່ສົ່ງຄືນໂດຍ hook useDropup.

ພາບລວມ​

const {
files, // ອາເຣຂອງອອບເຈັກໄຟລ໌
state, // ສະຖານະປັດຈຸບັນ
actions, // Actions ທີ່ມີຢູ່
getDropProps, // Props ສຳລັບພື້ນທີ່ວາງ
getInputProps, // Props ສຳລັບອົງປະກອບ input
openFileDialog, // ເປີດຕົວເລືອກໄຟລ໌
} = useDropup();

files​

ອາເຣຂອງອອບເຈັກ DropupFile ທີ່ເປັນຕົວແທນຂອງໄຟລ໌ທີ່ຖືກເພີ່ມທັງໝົດ.

const { files } = useDropup();

files.forEach(file => {
console.log(file.id); // "abc123"
console.log(file.name); // "photo.jpg"
console.log(file.size); // 1234567
console.log(file.type); // "image/jpeg"
console.log(file.status); // "idle" | "uploading" | "complete" | "error"
console.log(file.progress); // 0-100
console.log(file.preview); // "blob:http://..." (ຮູບພາບເທົ່ານັ້ນ)
console.log(file.uploadedUrl); // "https://..." (ຫຼັງການອັບໂຫຼດ)
console.log(file.error); // DropupError (ຖ້າລົ້ມເຫຼວ)
});

ຄຸນສົມບັດ DropupFile​

ຄຸນສົມບັດປະເພດຄຳອະທິບາຍ
idstringຕົວລະບຸທີ່ບໍ່ຊ້ຳກັນ
fileFileອອບເຈັກ File ດັ້ງເດີມຂອງບຣາວເຊີ
namestringຊື່ໄຟລ໌
sizenumberຂະໜາດເປັນ bytes
typestringປະເພດ MIME
statusFileStatusສະຖານະປັດຈຸບັນ
progressnumberຄວາມຄືບໜ້າການອັບໂຫຼດ (0-100)
previewstring | undefinedURL ຕົວຢ່າງສຳລັບຮູບພາບ
uploadedUrlstring | undefinedURL ຫຼັງການອັບໂຫຼດສຳເລັດ
responseunknownຂໍ້ມູນການຕອບກັບຈາກເຊີບເວີ
errorDropupError | undefinedຂໍ້ຜິດພາດຖ້າການອັບໂຫຼດລົ້ມເຫຼວ
metaRecord<string, unknown>Metadata ທີ່ກຳນົດເອງ

ຄ່າ FileStatus​

ສະຖານະຄຳອະທິບາຍ
'idle'ເພີ່ມໄຟລ໌ແລ້ວ, ບໍ່ໄດ້ອັບໂຫຼດ
'uploading'ການອັບໂຫຼດກຳລັງດຳເນີນ
'complete'ອັບໂຫຼດສຳເລັດ
'error'ອັບໂຫຼດລົ້ມເຫຼວ
'paused'ຢຸດການອັບໂຫຼດຊົ່ວຄາວ (ການອັບໂຫຼດທີ່ສາມາດສືບຕໍ່ໄດ້)

state​

ສະຖານະປັດຈຸບັນຂອງ dropzone.

const { state } = useDropup();

console.log(state.isDragging); // true ເມື່ອລາກຜ່ານ
console.log(state.isDragAccept); // true ເມື່ອໄຟລ໌ທີ່ລາກຖືກຕ້ອງ
console.log(state.isDragReject); // true ເມື່ອໄຟລ໌ທີ່ລາກບໍ່ຖືກຕ້ອງ
console.log(state.isUploading); // true ເມື່ອໄຟລ໌ໃດໜຶ່ງກຳລັງອັບໂຫຼດ
console.log(state.progress); // ຄວາມຄືບໜ້າໂດຍລວມ 0-100
console.log(state.status); // 'idle' | 'uploading' | 'complete' | 'error'

ຄຸນສົມບັດ State​

ຄຸນສົມບັດປະເພດຄຳອະທິບາຍ
isDraggingbooleanໄຟລ໌ກຳລັງຖືກລາກຜ່ານພື້ນທີ່ວາງ
isDragAcceptbooleanໄຟລ໌ທີ່ລາກຜ່ານການກວດສອບ
isDragRejectbooleanໄຟລ໌ທີ່ລາກການກວດສອບລົ້ມເຫຼວ
isUploadingbooleanໄຟລ໌ໃດໜຶ່ງກຳລັງອັບໂຫຼດ
progressnumberຄວາມຄືບໜ້າສະເລ່ຍຂອງໄຟລ໌ທັງໝົດ (0-100)
statusDropupStatusສະຖານະການອັບໂຫຼດໂດຍລວມ

ຄ່າ DropupStatus​

ສະຖານະຄຳອະທິບາຍ
'idle'ບໍ່ມີການອັບໂຫຼດກຳລັງດຳເນີນ
'uploading'ໜຶ່ງ ຫຼືຫຼາຍໄຟລ໌ກຳລັງອັບໂຫຼດ
'complete'ການອັບໂຫຼດທັງໝົດສຳເລັດ
'error'ໜຶ່ງ ຫຼືຫຼາຍການອັບໂຫຼດລົ້ມເຫຼວ

actions​

ອອບເຈັກທີ່ມີ actions ທັງໝົດທີ່ມີຢູ່.

const { actions } = useDropup();

// ເລີ່ມການອັບໂຫຼດ
actions.upload(); // ອັບໂຫຼດໄຟລ໌ idle ທັງໝົດ
actions.upload(['id1', 'id2']); // ອັບໂຫຼດໄຟລ໌ສະເພາະ

// ຍົກເລີກການອັບໂຫຼດ
actions.cancel(); // ຍົກເລີກການອັບໂຫຼດທັງໝົດ
actions.cancel('file-id'); // ຍົກເລີກໄຟລ໌ສະເພາະ

// ລຶບໄຟລ໌
actions.remove('file-id'); // ລຶບໄຟລ໌ສະເພາະ
actions.reset(); // ລຶບໄຟລ໌ທັງໝົດ

// ລອງໃໝ່ການອັບໂຫຼດທີ່ລົ້ມເຫຼວ
actions.retry(); // ລອງໃໝ່ທັງໝົດທີ່ລົ້ມເຫຼວ
actions.retry(['id1']); // ລອງໃໝ່ໄຟລ໌ສະເພາະ

// ເພີ່ມໄຟລ໌ດ້ວຍໂປຣແກຣມ
actions.addFiles(fileList); // ເພີ່ມ File[] ຫຼື FileList

// ອັບເດດ metadata ໄຟລ໌
actions.updateFileMeta('file-id', { tag: 'important' });

ເມທອດ Action​

upload(fileIds?)​

ເລີ່ມການອັບໂຫຼດໄຟລ໌.

// ອັບໂຫຼດໄຟລ໌ idle ທັງໝົດ
actions.upload();

// ອັບໂຫຼດໄຟລ໌ສະເພາະ
actions.upload(['file-id-1', 'file-id-2']);
ພາລາມິເຕີປະເພດຄຳອະທິບາຍ
fileIdsstring[] (ເປັນທາງເລືອກ)ID ໄຟລ໌ສະເພາະທີ່ຈະອັບໂຫຼດ

cancel(fileId?)​

ຍົກເລີກການອັບໂຫຼດທີ່ກຳລັງດຳເນີນຢູ່.

// ຍົກເລີກການອັບໂຫຼດທັງໝົດ
actions.cancel();

// ຍົກເລີກໄຟລ໌ສະເພາະ
actions.cancel('file-id');
ພາລາມິເຕີປະເພດຄຳອະທິບາຍ
fileIdstring (ເປັນທາງເລືອກ)ID ໄຟລ໌ສະເພາະທີ່ຈະຍົກເລີກ

remove(fileId)​

ລຶບໄຟລ໌ອອກຈາກລາຍການ.

actions.remove('file-id');
ພາລາມິເຕີປະເພດຄຳອະທິບາຍ
fileIdstringID ໄຟລ໌ທີ່ຈະລຶບ

reset()​

ລຶບໄຟລ໌ທັງໝົດ ແລະຣີເຊັດສະຖານະ.

actions.reset();

retry(fileIds?)​

ລອງໃໝ່ການອັບໂຫຼດທີ່ລົ້ມເຫຼວ.

// ລອງໃໝ່ການອັບໂຫຼດທີ່ລົ້ມເຫຼວທັງໝົດ
actions.retry();

// ລອງໃໝ່ໄຟລ໌ສະເພາະ
actions.retry(['file-id-1']);
ພາລາມິເຕີປະເພດຄຳອະທິບາຍ
fileIdsstring[] (ເປັນທາງເລືອກ)ID ໄຟລ໌ສະເພາະທີ່ຈະລອງໃໝ່

addFiles(files)​

ເພີ່ມໄຟລ໌ດ້ວຍໂປຣແກຣມ.

// ຈາກ clipboard
document.addEventListener('paste', (e) => {
const files = e.clipboardData?.files;
if (files) {
actions.addFiles(files);
}
});

// ຈາກແຫຼ່ງອື່ນ
actions.addFiles([file1, file2]);
ພາລາມິເຕີປະເພດຄຳອະທິບາຍ
filesFile[] | FileListໄຟລ໌ທີ່ຈະເພີ່ມ

updateFileMeta(fileId, meta)​

ອັບເດດ metadata ໄຟລ໌.

actions.updateFileMeta('file-id', {
description: 'ຮູບຂອງຂ້ອຍ',
tags: ['vacation', '2024'],
});
ພາລາມິເຕີປະເພດຄຳອະທິບາຍ
fileIdstringID ໄຟລ໌ທີ່ຈະອັບເດດ
metaRecord<string, unknown>Metadata ທີ່ຈະລວມ

getDropProps​

ສົ່ງຄືນ props ທີ່ຈະ spread ໃສ່ອົງປະກອບພື້ນທີ່ວາງ.

const { getDropProps, getInputProps } = useDropup();

<div {...getDropProps()}>
<input {...getInputProps()} />
ວາງໄຟລ໌ທີ່ນີ້
</div>

ກັບ Props ທີ່ກຳນົດເອງ​

<div
{...getDropProps({
className: 'my-dropzone',
onClick: (e) => {
// ຕົວຈັດການຄລິກທີ່ກຳນົດເອງຂອງທ່ານ
console.log('ຄລິກແລ້ວ!');
},
})}
>
<input {...getInputProps()} />
</div>

Props ທີ່ສົ່ງຄືນ​

ຄຸນສົມບັດປະເພດຄຳອະທິບາຍ
onDragEnterfunctionຕົວຈັດການ drag enter
onDragOverfunctionຕົວຈັດການ drag over
onDragLeavefunctionຕົວຈັດການ drag leave
onDropfunctionຕົວຈັດການ drop
onClickfunctionຕົວຈັດການຄລິກ (ເປີດ dialog)
rolestringບົດບາດສຳລັບ accessibility
tabIndexnumberTab index ສຳລັບ focus

getInputProps​

ສົ່ງຄືນ props ທີ່ຈະ spread ໃສ່ input ໄຟລ໌ທີ່ເຊື່ອງໄວ້.

const { getInputProps } = useDropup();

<input {...getInputProps()} />

ກັບ Props ທີ່ກຳນົດເອງ​

<input
{...getInputProps({
id: 'file-input',
name: 'files',
})}
/>

Props ທີ່ສົ່ງຄືນ​

ຄຸນສົມບັດປະເພດຄຳອະທິບາຍ
type'file'ປະເພດ input
acceptstringປະເພດໄຟລ໌ທີ່ຍອมຮັບ
multiplebooleanອະນຸຍາດຫຼາຍໄຟລ໌
onChangefunctionຕົວຈັດການ change
styleobjectສະໄຕລ໌ທີ່ເຊື່ອງໄວ້

openFileDialog​

ຟັງຊັນເພື່ອເປີດຕົວເລືອກໄຟລ໌ດ້ວຍໂປຣແກຣມ.

const { openFileDialog } = useDropup();

<button onClick={openFileDialog}>
ຄົ້ນຫາໄຟລ໌
</button>

ຕົວຢ່າງການນຳໃຊ້​

ລາຍການໄຟລ໌ສົມບູນ​

function FileList() {
const { files, actions, state } = useDropup({
upload: { url: '/api/upload' },
});

return (
<div>
<h3>ໄຟລ໌ ({files.length})</h3>

{files.map(file => (
<div key={file.id}>
{file.preview && (
<img src={file.preview} alt="" width={50} />
)}
<span>{file.name}</span>
<span>{(file.size / 1024).toFixed(1)} KB</span>
<span>{file.status}</span>

{file.status === 'uploading' && (
<progress value={file.progress} max={100} />
)}

{file.status === 'error' && (
<>
<span style={{ color: 'red' }}>{file.error?.message}</span>
<button onClick={() => actions.retry([file.id])}>ລອງໃໝ່</button>
</>
)}

<button onClick={() => actions.remove(file.id)}>ລຶບ</button>
</div>
))}

{state.isUploading && (
<p>ກຳລັງອັບໂຫຼດ... {state.progress}%</p>
)}

<button
onClick={() => actions.upload()}
disabled={state.isUploading || files.length === 0}
>
ອັບໂຫຼດທັງໝົດ
</button>

<button onClick={() => actions.reset()}>
ລ້າງທັງໝົດ
</button>
</div>
);
}

ການຈັດສະໄຕລ໌ສະຖານະການລາກ​

function StyledDropzone() {
const { state, getDropProps, getInputProps } = useDropup({
accept: 'image/*',
});

const getStyle = () => {
if (state.isDragAccept) return { borderColor: 'green', backgroundColor: '#e8f5e9' };
if (state.isDragReject) return { borderColor: 'red', backgroundColor: '#ffebee' };
if (state.isDragging) return { borderColor: 'blue', backgroundColor: '#e3f2fd' };
return { borderColor: 'gray', backgroundColor: 'white' };
};

return (
<div
{...getDropProps()}
style={{
border: '2px dashed',
borderRadius: 8,
padding: 40,
textAlign: 'center',
transition: 'all 0.2s',
...getStyle(),
}}
>
<input {...getInputProps()} />
{state.isDragReject ? (
<p>ຍອມຮັບຮູບພາບເທົ່ານັ້ນ!</p>
) : (
<p>ວາງຮູບພາບທີ່ນີ້</p>
)}
</div>
);
}