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

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

ທຸກຢ່າງທີ່ສົ່ງຄືນໂດຍ 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>
);
}