νμ©λ νμΌ νμ₯μλ₯Ό μ ννκ³ μ¬μ©μκ° λλκ·Ένλ νμΌμ μμμΌ νμ§λ§ μ½μμμ κ²½κ³ κ° λ°μν©λλ€. NativeDragSources.js:61 Browser doesn't allow reading "files" until the drop event.
λλ‘ λμμ λκΈ° μ μ νμΌ νμ₯λͺ
μ νμΈνκ±°λ νμΌ μλ₯Ό λλκ·Ένλ κ°μ₯ μ’μ λ°©λ²μ 무μμ
λκΉ?
μμ€μμ λκΈ°λ₯Ό νμ©νμ§ μκ±°λ μ νμ λ°λΌ λμμμ νμ©λμ§ μμμ νμνλλ‘ νμκ² μ΅λκΉ?
canDrag
false
λ₯Ό λ°νν΄μΌ ν©λλ€.types
λ₯Ό μ¬μ©νμ¬ μ μ΄ν΄μΌ ν©λλ€.@theTechie μλμ, νμ¬ λκ³ μλ νμΌ νμ₯μλ₯Ό μ½λ λ°©λ²μ μ°Ύκ³ μμ΅λλ€.
λͺ¨λ μμ€ λ° λμ λ©μλλ λ λ²μ§Έ μΈμλ‘ monitor
λ₯Ό λ°μ΅λλ€. ( canDrop
ν¬ν¨)
monitor.getItem()
λ₯Ό μ¬μ©νμ¬ νμ¬ λλκ·Έλ νλͺ©μ κ°μ Έμ¬ μ μμ΅λλ€.
μ°Έμ‘°:
canDrop(props, monitor): Optional. Use it to specify whether the drop target is able to accept the item. If you want to always allow it, just omit this method. Specifying it is handy if you'd like to disable dropping based on some predicate over props or monitor.getItem(). Note: You may not call monitor.canDrop() inside this method.
monitor
λ₯Ό μ¬μ©ν μ μμ΅λλ€.
νμΌμλ μλνμ§ μμ΅λλ€
μ΄μνλ€.
νμΌ μμ€ν
μμ λμμΌλ‘ νμΌμ λλκ·Έ μ€ λλ‘νκ³ μλ€κ³ μκ°νμλκΉ?
λλ λΉμ·ν μΌμνκ³ κ·Έκ²μ΄ λλ₯Ό μν΄ μΌνλ κ² κ°μ΅λλ€. μ½λλ₯Ό 곡μ ν μ μλ€λ©΄ 무μμ΄ μλͺ»λμλμ§ μ μ μμ΅λλ€.
canDrop λ©μλμμ νμΌ νμ₯μλ₯Ό μ½λ λ°©λ²μ λ³΄μ¬ μ£Όμκ² μ΅λκΉ?
μμμ μ΄λ―Έ μΈκΈνλ―μ΄ canDrop
monitor.getItem().files
λ κΈ°λ³Έ File
κ°μ²΄μ λ°°μ΄μ μ 곡ν΄μΌ ν©λλ€.
λ΄ μ£Όλ¨Ή λκΈμ μ½μΌμμμ€. canDropμμ νμΌμ μ½μ λ λ΄κ° μΈκΈν κ²κ³Ό κ°μ μ€λ₯κ° λ°μν©λλ€. canDropμμ νμΌμ μ½λ μμ μμ κ° μμ΅λκΉ? μλλ©΄ κ·Έλ₯ μ€λͺ μλ₯Ό μ°Έμ‘°ν©λκΉ? μ€λ₯λ λλ‘ μ΄λ²€νΈκΉμ§ νμΌμ μ½μ μ μλ€κ³ λ§ν©λλ€. NativeDragSources.js:61 λΈλΌμ°μ λ λλ‘ μ΄λ²€νΈκΉμ§ "νμΌ" μ½κΈ°λ₯Ό νμ©νμ§ μμ΅λλ€.
λ κ°μ§ λ€λ₯Έ λ²μ μ μ¬μ© μ€μΌ μ μμΌλ©° μ΄ μ ν μ¬νμ λμ€μ μΆκ°λμμ΅λλ€. 2.1.4λ₯Ό μ¬μ©νκ³ μμ΅λλ€.
μκ² μ΅λλ€. μ΅μ λ²μ μ ν μ€νΈνκ³ μλνλμ§ μλ € λλ¦¬κ² μ΅λλ€.
canDrop
μ μλ νμΌμ MIME μ νμΌλ‘ νν°λ§νλ €κ³ ν λλ μ΄ λ¬Έμ κ° λ°μν©λλ€. monitor.getItem().files
λ₯Ό νΈμΆνμλ§μ μμ κ²½κ³ κ° λ°μν©λλ€(Chrome 56.0.2924.87, react-dnd 2.2.4, react-dnd-html5-backend 2.2.4).
MDN μ λ°λ₯΄λ©΄ μ μ΄λ event.dataTransfer
μμ±μ μ¬μ©νμ¬ μνν μ μμ§λ§ λ΄κ° λ³Ό μ μλ ν react-dndλ ν΄λΉ κ°μ²΄λ ν΄λΉ μ 보λ₯Ό μ΄λμλ λ
ΈμΆνμ§ μμ΅λλ€.
@theTechie
λ κ°μ§ λ€λ₯Έ λ²μ μ μ¬μ© μ€μΌ μ μμΌλ©° μ΄ μ ν μ¬νμ λμ€μ μΆκ°λμμ΅λλ€. 2.1.4λ₯Ό μ¬μ©νκ³ μμ΅λλ€.
μλμ, κ°μ λ²μ μ μ¬μ©ν©λλ€. λν κ°λ₯ν μ΅μ λ²μ (2.2.4)μΌλ‘ μ λ°μ΄νΈλκ³ λμΌν μ€λ₯κ° λ°μν©λλ€.
canDrop λ©μλλ λ€μκ³Ό κ°μ΅λλ€.
canDrop: function (props, monitor) {
let files = monitor.getItem().files;
console.log('Files: ', files);
return true;
}
κ·Έκ²μ λΉμ μ νΈμμ μ΄λ»κ² μλ ν μ μμ΅λκΉ? μμ μκ° μμ΅λκΉ?
μμ
μμ λ₯Ό 곧 곡μ νκ² μ΅λλ€.
2017λ
3μ 6μΌ μμμΌ μ€ν 4:12 Andrey Karavaychik [email protected]
μΌλ€:
@theTechie https://github.com/theTechie
λ κ°μ§ λ€λ₯Έ λ²μ μ μ¬μ© μ€μΌ μ μμΌλ©° μ΄ μ ν μ¬νμ
λμ€μ μΆκ°λμμ΅λλ€. 2.1.4λ₯Ό μ¬μ©νκ³ μμ΅λλ€.μλμ, κ°μ λ²μ μ μ¬μ©ν©λλ€. λν κ°λ₯ν μ΅μ λ²μ μΌλ‘ μ λ°μ΄νΈλ¨
(2.2.4) λμΌν μ€λ₯κ° λ°μν©λλ€.[μ΄λ―Έμ§: μ΄λ―Έμ§]
https://cloud.githubusercontent.com/assets/710513/23606619/8acabe7a-0272-11e7-8db1-b1c88870cf92.pngcanDrop λ©μλλ λ€μκ³Ό κ°μ΅λλ€.
canDrop: κΈ°λ₯(μν, λͺ¨λν°) {
let νμΌ = monitor.getItem().files;
console.log('νμΌ: ', νμΌ);
trueλ₯Ό λ°νν©λλ€.
}κ·Έκ²μ λΉμ μ νΈμμ μ΄λ»κ² μλ ν μ μμ΅λκΉ? μμ μκ° μμ΅λκΉ?
β
λΉμ μ΄ μΈκΈλμκΈ° λλ¬Έμ μ΄κ²μ λ°λ κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/react-dnd/react-dnd/issues/584#issuecomment-284361793 ,
λλ μ€λ λ μμκ±°
https://github.com/notifications/unsubscribe-auth/AA_31panjV9Uo11jF63f2Pkx4FBKiV6Aks5ri-MtgaJpZM4K5hkG
.>
λ¬Έμ μΈμ¬,
κ°κ°
@andrewQwer - μ λ§ μ£μ‘ν©λλ€!
λ΄κ° ꡬνν κ²μ λν μλͺ»λ λ©λͺ¨λ¦¬κ° μκ³ monitor.getItem().files
in canDrop
μ μ¬μ©νμ§ μμ΅λλ€. λ΄κ° νλ μΌμ νμΌ μλ₯Ό ν λ² μ μ§νμ¬ μμ ν μ μλ νμΌ μλ₯Ό μ ννλ κ²λΏμ
λλ€. λ¨μ΄μ‘λ€.
μ€ν΄μ μμ§κ° μμ΄ μ£μ‘ν©λλ€!
μΆμ : μ΄λ₯Ό λ¬μ±ν μ μλ λ°©λ²μ μ°Ύκ³ μμ΅λλ€. κ°λ₯νλ©΄ μλ € λλ¦¬κ² μ΅λλ€.
λλ μ΄κ²μ΄ κ²°μ½ κ°λ₯ν κ²μ΄λΌκ³ μκ°νμ§ μλλ€. λλκ·Έν νλͺ©μ λν μ 보 μ½κΈ°λ 보μμ μν΄ μλμ μΌλ‘ μ νλμ΄ μλ κ² κ°μ΅λλ€.
event.dataTransfer
κ°μ²΄(μ: types
)λ₯Ό ν΅ν΄ νμΌμ λν μΌλΆ μ 보λ₯Ό λ
ΈμΆν μ μμ΅λκΉ? λλ κ·Έκ²μ΄ λͺ¨λ μ¬μ© μ¬λ‘λ₯Ό λ§μ‘±μν¬ μλ μμ§λ§ μ μ΄λ μΌλΆλ λμμ΄ λ κ²μ΄λΌλ κ²μ μκ³ μμ΅λλ€.
μ΄κ²μ HTML5 λ°±μλμ μΆκ°ν΄μΌ ν μ¬νμΌ μ μμ§λ§ νμΌ/ν΄λκ° μμ λκΈ° μ μ νμΌμ΄ νμ©λλ MIME μ ν μ§ν©μ λ§λμ§ νμΈν μ μμ΅λλ€. νΉν react-dropzoneμ μ΄ μμ μμ λ³Ό μ μλ κ²μ²λΌ dropzone μμ νλͺ©μ λμ λ μ΄ μμ μ μνν©λλ€.
μμ§ μ΄ λ¬Έμ μ λν ν΄κ²°μ± μ΄ μμ΅λκΉ?
μ΄ λ¬Έμ λ μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ€λλ κ²μΌλ‘ νμλμμ΅λλ€. λ μ΄μ νλμ΄ μμΌλ©΄ νμλ©λλ€. κ·νμ κΈ°μ¬μ κ°μ¬λ립λλ€.
μ€λλμ§ μμ
λν react-dropzoneκ³Ό κ°μ μ΄λ―Έμ§, λΉλμ€μ κ°μ νΉμ νμΌμ μμ ν μ μλ λ°©λ²μ μ°Ύκ³ μμ΅λλ€. λꡬλ μ§ ν΄κ²°μ± μ΄ μμ΅λκΉ?
μ΄ λ¬Έμ λ μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ€λλ κ²μΌλ‘ νμλμμ΅λλ€. λ μ΄μ νλμ΄ μμΌλ©΄ νμλ©λλ€. κ·νμ κΈ°μ¬μ κ°μ¬λ립λλ€.
λλ λ¬Έμ κ°μλ€. "NativeDragSource.ts"μ μλΉν νλμ½λ©λ κ² κ°μ΅λλ€.
DragSourceλ₯Ό μμ±νμ§λ§ κ°μ μ‘μΈμ€νκΈ° μν΄ λΈλΌμ°μ μμ νμ©νμ§ μλλ€λ μ½μ κ²½κ³ λ§ μΆκ°ν©λλ€.
κ·Έλ¬λ λΈλΌμ°μ λ μ΄λ₯Ό νμ©ν©λλ€. λ³΄νΈ λͺ¨λμΌ λΏμ΄λ©° νμΌμ λ³κ²½νκ±°λ DATAμ μ‘μΈμ€νλ κ²μ νμ©νμ§ μμ΅λλ€(νμΌμ μμ±μ΄ μλ νλͺ©μ μ΄κ±°ν μ μμ΄μΌ ν©λλ€. (DropZoneμ΄ νλ κ²μ²λΌ) .
λκ°λ₯Ό μλνκ³ λΉμ μκ² λμμ¬ κ²μ λλ€
@LeopoldLerch @darthtrevino μ¬μ ν files
λͺ©λ‘μ μ‘μΈμ€ν μ μμ΅λλ€. νΈλ²μμ νμΌμ MIME μ νμ νμΈνκ³ νμΌμ μ ν¨ν νμμΈμ§μ λ°λΌ ν
λ리 μμμ λ³κ²½νκ³ μΆμ΅λλ€. useDrop
νν¬μ canDrop
λ©μλλ₯Ό μ¬μ©νκ³ μμ΅λλ€. κ·Έλ¦¬κ³ λ΄κ° λλ‘νμ λ νμΌ λ°°μ΄μ λ°νν©λλ€. λλ‘ μμ μλ‘ λ§μ°μ€λ₯Ό κ°μ Έ κ°λ©΄ λΉ λ°°μ΄μ΄ μμ΅λλ€.
λ¬Έμ λ λΈλΌμ°μ κ° μ λ¬νλ μ΄λ²€νΈλ μλ κ·Έλλ‘μ΄λ©° λ³κ²½ν μ μλ€λ κ²μ λλ€. λΈλΌμ°μ λ dragstartμμλ§ λ°μ΄ν°μ λν μ‘μΈμ€λ₯Ό μ 곡ν©λλ€. κ·Έ νμλ λͺ¨λ νμ μ΄λ²€νΈκ° λ³΄νΈ λͺ¨λμ μμΌλ―λ‘ λ°μ΄ν°μ μ‘μΈμ€ν μ μμ΅λλ€.
useDropμ onHover λ©μλλ₯Ό μ¬μ©νλ©΄ λΈλΌμ°μ κ° "dragenter"μμ μ‘μΈμ€νλ κ²μ νμ©νμ§ μκΈ° λλ¬Έμ λΉ λ©νλ°μ΄ν°λ₯Ό μ»κ² λ©λλ€. dragstart(λλ μμ§ κΈ°λ₯)μ κ°μ²΄λ₯Ό μ μ₯νλλΌλ λΈλΌμ°μ λ λ°°κ²½μμ μμ±μ μ§μΈ κ²μ λλ€. μλνλ©΄ λΉμ μ κ°μ²΄μ 볡μ¬λ³Έμ΄ μλλΌ κ°μ²΄μ λν μ°Έμ‘°λ₯Ό κ°μ§κ³ μκΈ° λλ¬Έμ λλ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ μ μΌν λ°©λ²μ "μμ§" κΈ°λ₯μ μ¬μ©νλ κ²μ λλ€. μ¬κΈ°μμ νλͺ©μ "νλͺ©" λλ "νμΌ"μ μ‘μΈμ€ν μ μμ΅λλ€(μ¬μ©νλ λΈλΌμ°μ μ λ°λΌ IE11μ ondrop μ μ μ‘μΈμ€λ₯Ό νμ©νμ§ μμ΅λλ€).
κ·Έλ¬λ λͺ¨λ κ²μ μ€μ€λ‘ ν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄ μ ν¨μ± κ²μ¬ λ° κΈ°μ΅. useRef. μλ₯Ό λ€μ΄
collect: monitor => {
const item: DataTransfer = monitor.getItem();
const isOver = monitor.isOver();
let _canDrop: VerificationResult = null;
if (item) {
if (item.items) {
if (item.items.length > 0) {
draggedFilesValid.current = allFilesAccepted(
fromList<DataTransferItem>(item.items),
accept,
multiple,
maxSize,
minSize
)
? VerificationResult.Valid
: VerificationResult.Invalid;
}
}
} else {
draggedFilesValid.current = null;
}
if (isOver && item && item.files) {
_canDrop = VerificationResult.Unknown;
if (draggedFilesValid.current != null) {
_canDrop = disabled
? VerificationResult.Invalid
: draggedFilesValid.current;
}
}
return {
isDragActive: item != null,
canDrop: _canDrop
};
}
@LeopoldLerch
μ€λͺ
κ°μ¬ν©λλ€! λλ μ΄λ° μ’
λ₯μ ν΄κ²° λ°©λ²μ μλ ν κ²μ
λλ€
κ°μ₯ μ μ©ν λκΈ
event.dataTransfer
κ°μ²΄(μ:types
)λ₯Ό ν΅ν΄ νμΌμ λν μΌλΆ μ 보λ₯Ό λ ΈμΆν μ μμ΅λκΉ? λλ κ·Έκ²μ΄ λͺ¨λ μ¬μ© μ¬λ‘λ₯Ό λ§μ‘±μν¬ μλ μμ§λ§ μ μ΄λ μΌλΆλ λμμ΄ λ κ²μ΄λΌλ κ²μ μκ³ μμ΅λλ€.