រំលងទៅមាតិកាមេ

សំណួរដែលសួរញឹកញាប់

សំណួរ និងចម្លើយទូទៅអំពី Dropup។

ទូទៅ​

Dropup ជាអ្វី?​

Dropup គឺជាបណ្ណាល័យ React សម្រាប់ការផ្ទុកឯកសារឡើងដែលស្រាល និងគ្មានចំណុចប្រទាក់។ វាផ្តល់មុខងារអូសនិងទម្លាក់ ការផ្ទៀងផ្ទាត់ឯកសារ ការតាមដានវឌ្ឍនភាពការផ្ទុកឡើង និងការគាំទ្រសម្រាប់ការផ្ទុកលើពពក - ទាំងអស់នៅក្នុងកញ្ចប់ដែលមានទំហំតិចជាង 10KB ដែលបានបង្ហាប់។

ហេតុអ្វី "គ្មានចំណុចប្រទាក់"?​

គ្មានចំណុចប្រទាក់ មានន័យថា Dropup មិនមានសមាសភាគ UI ណាមួយទេ។ វាផ្តល់តក្កវិជ្ជា និងការគ្រប់គ្រងស្ថានភាព ខណៈពេលដែលអ្នកបង្កើត UI តាមរបៀបដែលអ្នកចង់បាន។ នេះផ្តល់ឱ្យអ្នកនូវការគ្រប់គ្រងពេញលេញលើរូបរាង និងអារម្មណ៍។

ទំហំ bundle គឺប៉ុន្មាន?​

  • ស្នូល (@samithahansaka/dropup): < 10KB ដែលបានបង្ហាប់
  • ជាមួយការគាំទ្រពពក: +2KB ក្នុងមួយអ្នកផ្តល់សេវា
  • ជាមួយការដំណើរការរូបភាព: +5KB
  • ជាមួយពិធីការ tus: +3KB (ត្រូវការ tus-js-client ជា peer)

វាគាំទ្រ TypeScript ទេ?​

បាទ/ចាស! Dropup ត្រូវបានសរសេរក្នុង TypeScript និងរួមបញ្ចូលនិយមន័យប្រភេទយ៉ាងទូលំទូលាយ។ មិនចាំបាច់កញ្ចប់ @types ទេ។

តម្រូវការ React version ណាមួយ?​

React 16.8+ (ត្រូវការការគាំទ្រ hooks)។

ការប្រើប្រាស់​

តើខ្ញុំផ្ទុកឯកសារឡើងយ៉ាងដូចម្តេច?​

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

// ផ្ទុកឡើងឯកសារទាំងអស់
actions.upload();

// ផ្ទុកឡើងឯកសារជាក់លាក់
actions.upload(['file-id-1', 'file-id-2']);

តើខ្ញុំដោះស្រាយកំហុសការផ្ទៀងផ្ទាត់យ៉ាងដូចម្តេច?​

useDropup({
accept: 'image/*',
maxSize: 5 * 1024 * 1024,

onValidationError: (errors) => {
errors.forEach(({ file, errors }) => {
console.log(`${file.name}: ${errors.join(', ')}`);
});
},
});

តើខ្ញុំអាចប្រើតក្កវិជ្ជាផ្ទុកឡើងផ្ទាល់ខ្លួនបានទេ?​

បាទ/ចាស! បញ្ជូនមុខងារជំនួសវត្ថុកំណត់រចនាសម្ព័ន្ធ៖

useDropup({
upload: async (file, options) => {
const { signal, onProgress } = options;

// តក្កវិជ្ជាផ្ទុកឡើងផ្ទាល់ខ្លួនរបស់អ្នក
const response = await customUpload(file.file, {
signal,
onProgress,
});

return { url: response.url };
},
});

តើខ្ញុំបន្ថែមឯកសារដោយកម្មវិធីយ៉ាងដូចម្តេច?​

const { actions } = useDropup();

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

តើខ្ញុំអាចមានតំបន់ទម្លាក់ច្រើនបានទេ?​

បាទ/ចាស! ការហៅ useDropup នីមួយៗបង្កើត instance ឯករាជ្យ៖

const images = useDropup({ accept: 'image/*' });
const documents = useDropup({ accept: '.pdf' });

// ប្រើដោយឡែកពីគ្នា
<div {...images.getDropProps()}>...</div>
<div {...documents.getDropProps()}>...</div>

ការផ្ទុកឡើង​

តើខ្ញុំបង្ហាញវឌ្ឍនភាពការផ្ទុកឡើងយ៉ាងដូចម្តេច?​

const { files } = useDropup({ upload: { url: '/api/upload' } });

{files.map(file => (
<div key={file.id}>
{file.name}: {file.progress}%
</div>
))}

តើខ្ញុំបោះបង់ការផ្ទុកឡើងយ៉ាងដូចម្តេច?​

const { actions } = useDropup();

// បោះបង់ឯកសារជាក់លាក់
actions.cancel('file-id');

// បោះបង់ការផ្ទុកឡើងទាំងអស់
actions.cancel();

តើខ្ញុំព្យាយាមផ្ទុកឡើងឡើងវិញសម្រាប់ឯកសារដែលបរាជ័យយ៉ាងដូចម្តេច?​

const { actions } = useDropup();

// ព្យាយាមឡើងវិញឯកសារជាក់លាក់
actions.retry(['file-id']);

// ព្យាយាមឡើងវិញទាំងអស់ដែលបរាជ័យ
actions.retry();

វាគាំទ្រការផ្ទុកឡើងជាបំណែកទេ?​

បាទ/ចាស! ប្រើ createChunkedUploader៖

import { createChunkedUploader } from '@samithahansaka/dropup';

useDropup({
upload: createChunkedUploader({
url: '/api/upload/chunk',
chunkSize: 5 * 1024 * 1024, // 5MB
}),
});

តើខ្ញុំអាចផ្ទុកឡើងទៅ S3 ដោយផ្ទាល់បានទេ?​

បាទ/ចាស! ប្រើ cloud uploader៖

import { createS3Uploader } from '@samithahansaka/dropup/cloud/s3';

useDropup({
upload: createS3Uploader({
getPresignedUrl: async (file) => {
const res = await fetch('/api/s3/presign', {
method: 'POST',
body: JSON.stringify({ filename: file.name }),
});
return res.json();
},
}),
});

ការផ្ទៀងផ្ទាត់​

តើខ្ញុំកំណត់ប្រភេទឯកសារយ៉ាងដូចម្តេច?​

// តាមប្រភេទ MIME
useDropup({ accept: 'image/*' });

// តាមផ្នែកបន្ថែម
useDropup({ accept: '.pdf, .doc' });

// ច្រើន
useDropup({ accept: ['image/*', 'application/pdf'] });

តើខ្ញុំកំណត់ដែនកំណត់ទំហំយ៉ាងដូចម្តេច?​

useDropup({
maxSize: 10 * 1024 * 1024, // អតិបរមា 10MB
minSize: 1024, // អប្បបរមា 1KB
});

តើខ្ញុំកំណត់ចំនួនឯកសារយ៉ាងដូចម្តេច?​

useDropup({
maxFiles: 5,
});

តើខ្ញុំអាចបន្ថែមការផ្ទៀងផ្ទាត់ផ្ទាល់ខ្លួនបានទេ?​

បាទ/ចាស! ប្រើ customRules៖

useDropup({
customRules: [
(file) => {
if (file.name.includes('draft')) {
return 'ឯកសារព្រាង មិនត្រូវបានអនុញ្ញាតទេ';
}
return true;
},
],
});

ការមើលមុន​

តើខ្ញុំបង្ហាញការមើលមុនរូបភាពយ៉ាងដូចម្តេច?​

ការមើលមុនត្រូវបានបើកដោយលំនាំដើម៖

const { files } = useDropup();

{files.map(file => (
file.preview && <img src={file.preview} alt="" />
))}

តើខ្ញុំត្រូវសម្អាត preview URLs ទេ?​

ទេ! Dropup ដកហូត Object URLs ដោយស្វ័យប្រវត្តិនៅពេលឯកសារត្រូវបានលុប ឬ component unmount។

តើខ្ញុំអាចបិទការមើលមុនបានទេ?​

useDropup({ generatePreviews: false });

ការដោះស្រាយបញ្ហា​

ឯកសារមិនផ្ទុកឡើង​

  1. ពិនិត្យថា upload ត្រូវបានកំណត់រចនាសម្ព័ន្ធ៖

    useDropup({ upload: { url: '/api/upload' } });
  2. ប្រាកដថាអ្នកហៅ actions.upload() (លុះត្រាតែ autoUpload: true)

  3. ពិនិត្យ browser console សម្រាប់កំហុសបណ្តាញ

Preview URLs មិនដំណើរការ​

  1. ប្រាកដថាឯកសារគឺជារូបភាព
  2. ពិនិត្យថា generatePreviews មិនមែន false
  3. ផ្ទៀងផ្ទាត់ថាវត្ថុឯកសារមាន property preview ត្រឹមត្រូវ

អូស និងទម្លាក់មិនដំណើរការ​

  1. ប្រាកដថាអ្នក spread getDropProps() លើធាតុ container
  2. រួមបញ្ចូល input លាក់៖ <input {...getInputProps()} />
  3. ពិនិត្យថា disabled មិនមែន true

កំហុស TypeScript​

  1. ធ្វើបច្ចុប្បន្នភាពទៅ Dropup version ចុងក្រោយ
  2. ប្រាកដថា tsconfig.json មាន moduleResolution ត្រឹមត្រូវ
  3. ពិនិត្យថា @samithahansaka/dropup នៅក្នុង dependencies មិនមែន devDependencies

ការលេចធ្លាយអង្គចងចាំ​

  1. ប្រាកដថា components ដែលប្រើ useDropup unmount យ៉ាងត្រឹមត្រូវ
  2. ហៅ actions.reset() មុនពេល unmount ប្រសិនបើចាំបាច់
  3. កុំផ្ទុកឯកសារក្នុង external state ដោយមិនមានការសម្អាត

ភាពឆបគ្នា​

វាដំណើរការជាមួយ Next.js ទេ?​

បាទ/ចាស! ប្រើ directive 'use client'៖

'use client';
import { useDropup } from '@samithahansaka/dropup';

វាដំណើរការជាមួយ React Native ទេ?​

បាទ/ចាស! ប្រើ native adapter៖

import { NativeAdapter } from '@samithahansaka/dropup/native';

useDropup({ adapter: NativeAdapter });

វាគាំទ្រ SSR ទេ?​

បាទ/ចាស! Dropup មានសុវត្ថិភាព SSR។ វាប្រើ browser APIs តែពេលដែលមាន។

ការគាំទ្រ Browser?​

Browser ទំនើបទាំងអស់៖

  • Chrome 60+
  • Firefox 55+
  • Safari 12+
  • Edge 79+

ការរួមចំណែក​

តើខ្ញុំអាចរួមចំណែកយ៉ាងដូចម្តេច?​

  1. Fork repository
  2. បង្កើត feature branch
  3. បញ្ជូន pull request

មើល CONTRIBUTING.md សម្រាប់ព័ត៌មានលម្អិត។

តើខ្ញុំរាយការណ៍ bugs យ៉ាងដូចម្តេច?​

បើក issue នៅ github.com/samithahansaka/dropup/issues។

មាន roadmap ទេ?​

ពិនិត្យ GitHub issues និង discussions សម្រាប់មុខងារដែលបានគ្រោង។