ν°μΉ μ₯μΉλ₯Ό μν΄ μλμΌλ‘ μ νλλ ν°μΉ λ°±μλκ° μλ€λ©΄ ν¬λ¬ μΌ κ²μ λλ€.
κ³Όμ°! λ€μ μ£Όμ μ΄κ²μ μ΄ν΄ λ³΄κ² μ΅λλ€.
ν¬μΈν° μ΄λ²€νΈλ₯Ό μ¬μ©νμ¬ μ΄μ κ°μ μμ μ μννμ΅λλ€. none; λλκ·Έλλ νλͺ© μλμ μμκ° μ΄λ²€νΈ μλ‘ λ§μ°μ€λ₯Ό μ‘μ μ μμ΅λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ€λ₯Έ λ°©λ²μ΄ μλμ§ κΆκΈν©λλ€.
touchmoveλ₯Ό μ¬μ©νλ μ΅μ²¨λ¨ λλκ·Έ μ€ λλ‘ λΌμ΄λΈλ¬λ¦¬λ 무μμ λκΉ? jQuery UI? μ°λ¦¬λ μ’μ ν΄κ²°μ± μ μ°Ύκ³ κ·Έ νΈλ¦μ μ±νν΄μΌν©λλ€.
λλ νλ‘μ νΈμμ μ΄λ€ μ€ μ΄λ κ²λ μ¬μ©νμ§ μμμ§λ§ μΈν°λ· κ²μμ λ€μμ λ°κ²¬νμ΅λλ€.
DOM μ‘°μ (μ : 미리보기λ₯Όμν λ Έλ 볡μ , translateX / Y λ³κ²½ λ±)μ νΌνκ³ λμ μλΉμκ° "λλκ·Έ λ μ΄μ΄"λ₯Ό 그리λλ‘νλ κ²μ΄μ΄ λΌμ΄λΈλ¬λ¦¬μ μ μ μ κ°μ₯ μ’μ κ²μ΄λΌκ³ μκ°ν©λλ€. μλΉμμκ² νμν λ°μ΄ν°λ₯Ό μ 곡ν©λλ€.
μ¦, Card
κ΅¬μ± μμλ₯Ό ν°μΉ λ°±μλλ‘ λλκ·Ένλ©΄ react-dndκ° μ체μ μΌλ‘ μ΄λνλ €κ³ νμ§ μμ΅λλ€. μ± μλ¨μ μΌλΆ "λ μ΄μ΄"κ΅¬μ± μμλ₯Ό λ λλ§νλ κ²μ μ¬μ©μμκ² λ¬λ € μμ΅λλ€. μ΄ μ»΄ν¬λνΈλ react-dndμμ μ 곡νλ DragLayerMixin
λ₯Ό μ¬μ©νμ¬ νμ¬ μμ, μμΉ λ±μ λν΄ νμ΅ν©λλ€. λλκ·Έ λ νλͺ©μ μ νλ³λ‘ λ λλ§νλ λ°©λ²μ κ²°μ νλ©° 100 % Reactμ
λλ€.
var App = React.createClass({
render() {
return (
<div>
{this.props.activeRouteHandler />
<DragDropLayer />
</div>
);
}
});
var { DragLayerMixin } = require('react-dnd');
var DragDropLayer = React.createClass({
mixins: [DragLayerMixin],
render() {
// With non-native dragging backend, rendering items in the process of dragging is your responsibility.
// It's up to you to use translate3d or top/left, render thumbnails or real components, etc.
var {
draggedItem,
draggedItemType,
clientX,
clientY
} = this.getDragLayerState(); // provided by mixin
if (!draggedItem) {
return null;
}
return (
<div style={{zIndex: 10000, pointerEvents: 'none', position: 'absolute'}}>
{draggedItem &&
<div style={{transform: `translate3d(${clientX}, ${clientY}, 0)`}}>
{this.renderItem(draggedItemType, draggedItem)}
</div>
}
</div>
);
},
renderItem(type, item) {
// It's completely up to the consumer to specify how to render different types
switch (type) {
case ItemTypes.Card:
return <Card title={item.title} />;
case ItemTypes.List:
return <img src='thumbnail.jpg' />;
}
});
BTWμ΄ μ κ·Ό λ°©μμ _ μΌλΆ μ±μ κ²½μ° _ λλκ·Έ λ μ΄μ΄ _λ λλκ·Έ κ°λ₯ν νλͺ©μ ν¬ν¨νλ κ²μ΄κΈ° λλ¬Έμ μ λ§ λ©μ§ κ°λ₯μ±μ μ΄μ΄μ€λλ€. λλκ·Έ λ μ΄μ΄λ νμνλ€λ©΄ λΆλ¦¬ ν μ ββμμ§λ§ λΆλ¦¬ ν νμλ μμ΅λλ€.
νλͺ©μ΄ μΌλΆ 컨ν
μ΄λλ‘ λλκ·Έλλ μ±μ κ²½μ°μ΄ 컨ν
μ΄λλ DragLayerMixin
λ₯Ό μ¬μ©νμ¬ νμ¬ λλκ·Έ μμΉμ λν΄ νμ΅νκ³ λλκ·Έκ° λ°μν λ μ€μ μμλ₯Ό μ΄λν μ μμ΅λλ€.
νλͺ©μ΄ μ¬λ¬ 컨ν
μ΄λμ κ±Έμ³ νλ©΄μ κ°λ‘ μ§λ¬ λλκ·Έλλ Trelloμ κ°μ μ±μ κ²½μ° DragLayerMixin
λ₯Ό μ¬μ©νλ λ³λμ μ΅μμ κ΅¬μ± μμλ₯Ό μ¬μ©νμ¬ νμ¬ λλκ·Έ λ νλͺ©μ μ λ μμΉμ λ λλ§νλ κ²μ΄ μ μ© ν μ μμ΅λλ€.
μ΄κ²μ λ§μ μλ―Έκ° μμ΅λλ€. λ°μ€ν¬ν±μ΄λ λͺ¨λ°μΌμ΄λ κ±°μ λͺ¨λ λΈλΌμ°μ λ νλ©΄ μ£Όλ³μ νλͺ©μ λΆλλ½κ² μμ§μΌ μ μμ΄μΌν©λλ€. μ΄λ κ²νλ©΄ μΉ΄λλ₯Ό μ΄λν λ Trelloμ κ°μ λ©μ§ 3D ν¨κ³Όλ₯Ό μ½κ² μΆκ° ν μ μμ΅λλ€.
μ΄κ²μ λν λλκ·Ένλ λμ λ§μ°μ€ 컀μλ₯Ό μ€μ νκ³ λ μ μ°ν μ리 νμ μ λ λλ§μ νμ©ν©λλ€ ... κΈ°λ³Έ DND APIλ‘ μ€μ λ‘ ν μμλ μμ
λΈλΌμ°μ D & D APIμμμ΄ "λλκ·Έ λ μ΄μ΄"APIλ₯Ό μ¬μ©ν μ μλλ‘ λ§λ€ μλ μμ΅λλ€. μ΄ μμ μ κ°μ΄ dragImage
λ₯Ό ν¬λͺ
ν ν½μ
λ‘ μ€μ νκ³ μνλ κ²μ 그립λλ€.
νΈμ λ΄μ κ°κΈ°
μ¬κΈ°μ κ°λ μ¦λͺ μ΄ μμ΅λλ€. http://gaearon.github.io/react-dnd/#/drag -around-experimental
μ΄λνλ λμ κΉλ°μ λλ€ :-) (μμ§ Firefoxμμλ μλνμ§ μμ΅λλ€)
κ΄λ ¨ μμ€ μ½λ :
https://github.com/gaearon/react-dnd/blob/experiments/examples/_drag-around-experimental/Box.js#L69
보μλ€μνΌ λλκ·Έ λ μ΄μ΄μ κ΅¬μ± μμλ₯Ό 그리λ κ²μ μλΉμμ λͺ«μ΄λ―λ‘ λ§€μ° μ μ°ν©λλ€.
μ΄λ² μ£Όμλ μ§μ§λλ₯Ό λ§μ§κΈ°μν λλ€λλ‘ λ§λ¬΄λ¦¬νλ €κ³ λ Έλ ₯ν κ²μ λλ€. κ·Έ νμλ ν°μΉ λͺ¨λμμλ λκ°μ΄νλ κ²μ΄ μ΄λ ΅μ§ μμ κ²μ λλ€.
μ°λ¦¬λ μ΄μ κ°μ λλκ·Έ λ μ΄μ΄λ₯Ό μ¬μ©νμ§λ§ λ§μ°μ€ 컀μλ₯Ό λ³κ²½ν μ μλλ‘ onMouseMove λ±μ μ¬μ©ν©λλ€.
μ°λ¦¬μκ²λ μ¬μνμ§λ§ λ§€μ° μ€μν κ΄μ¬μ¬μ
λλ€. λν ν°μΉ λ° ν¬μΈν° μ΄λ²€νΈμ λν΄ κ±°μ λμΌν μ½λλ₯Ό μ¬μ©ν μ μμ΅λλ€.
κ·Έλλ DragLayer 물건μ μ μκ² μ¬λ°λ₯Έ λ°©ν₯μΌλ‘ λμκ°λ λ¨κ³μ
λλ€. μΌλ¨ ν°μΉ μ§μμνλ©΄ ν¬μΈν° λ° λ§μ°μ€ μ΄λ²€νΈλ₯Ό κΈ°λ₯μΌλ‘ μ¬μ©νλ λ° κ΄μ¬μ΄ μλ€λ©΄μ΄λ₯Ό μ§μνλλ‘ κΈ°κΊΌμ΄ νμ₯ ν μ μμ΅λκΉ?
HTML5 D & D APIλ₯Ό κΈ°λ³Έ λ°±μλλ‘ μ€μ ν λ€μ ν°μΉ κΈ°λ° / mousemove κΈ°λ° λ°±μλλ₯Ό μ΅νΈ μΈνκ³ μΆμ΅λλ€.
HTML5 D & Dκ° κ°μ₯ κ°λ¨ν©λλ€ (λλκ·Έ λ μ΄μ΄κ° νμνμ§ μμΌλ©° λͺ¨λ κ²μ΄ λΈλΌμ°μ μμ κ΄λ¦¬ λ¨). mousemove / touchmoveλ₯Ό μ ννλ €λ©΄ μνλ κ²μ 그릴 μμλ λλκ·Έ λ μ΄μ΄λ₯Ό ꡬνν΄μΌν©λλ€.
λ§μ΄λλ€?
λ¬Όλ‘ μ
λλ€. κ·Έκ² μ κ° λ°λΌλ μΌμ
λλ€.
HTML5 D & Dλ λΉ λ₯΄κ³ (νΉμ§ μΈμλ) μ¬μ©μ΄ λ§€μ° κ°λ¨νλ―λ‘ κΈ°λ³Έμ μΌλ‘ νμ€ν μ νμ
λλ€.
κ·Έλμ λ°©κΈμ΄ λλκ·Έ μ€ λλ‘ ν°μΉλ₯Ό νμ±ν ν΄ λ¬λΌλ μμ²μ λ°μμ΅λλ€. λꡬλ μ§μ΄ μμ μ μννκ³ νμ 곡μ νκ³ μΆμ΅λκΉ?
@μ‘°μ ―
@nelix λ mousemove
λ°±μλμμ μμ
μ μμνμΌλ©° κ·Έ νμ touchmove
λ°±μλλ₯Ό μνν©λλ€.
νμ¬ μ§νμ€μΈ μμ
μ λ³Ό μ μμ΅λλ€ : https://github.com/nelix/react-dnd/commit/8de7f7fe24c7ae397a971c517dada9323e6c27f0λ₯Ό (μ΄ μ§νλκ³ μμ λ©λ¦¬ μμ§μ΄ μμ μμ μ λ§ μΌμνμ§ μμ΅λλ€). DragDropMixin
λ¨μμλ λΆλΆκ³Ό backends/HTML5
(λ° κΈ°ν λ°±μλ)λ‘ μ΄λν΄μΌνλ λΆλΆμ νμ
ν΄μΌν©λλ€.
μμ νκ³ μΆλ€λ©΄ ν΄λΉ 컀λ°μΌλ‘ μμνμ¬ mousemove λ°±μλλ₯Ό κ³μ ꡬνν μ μμ΅λλ€. μλνλ©΄ μ μ¬ν touchmove λ°±μλλ₯Ό ꡬννλ κ²μ΄ μ΄λ ΅μ§ μμ΅λλ€.
μ΄ μμ μνκ³ μΆλ€λ©΄ μ¬κΈ° λλ Gitter roomμμ μ λ°μ΄νΈλ₯Ό μ μ§νμ¬ λ κ°μ§ ꡬνμΌλ‘ λλμ§ μλλ‘νμμμ€.
λ€μμ ν°μΉ μ§μ κ°λ μ¦λͺ μ λλ€. https://github.com/gaearon/react-dnd/pull/143
λΉμ μ κ·Έκ²μ κ°μ§κ³ λ μ μμ΅λλ€ : http://rawgit.com/gaearon/react-dnd/touch-poc/examples/index.html
λ°μ€ν¬ν±μμλ HTML5 λ°±μλλ₯Ό μ¬μ©νκ³ λͺ¨λ°μΌμμλ ν°μΉ λ°±μλλ₯Ό μ¬μ©ν©λλ€.
μ¬μ©μ μ§μ λ λλ§ μμ λ§ λͺ¨λ°μΌμμ λλκ·Έ 미리보기λ₯Ό νμν©λλ€.
μ΄κ²μ λ§€μ° μ λ§ ν΄ λ³΄μ λλ€! μ΄κ²μ΄ μΈμ μ°©λ₯ν μ§μ λν μμ΄λμ΄κ° μμ΅λκΉ? :)
μ λ νμ¬ λ€λ₯Έ νλ‘μ νΈλ‘ λ°μκ³ 7 μκΉμ§ μ§νλ©λλ€.
λλ 7 μμ΄λ 8 μμμ΄ μμ
μ ν μ μμμ§λ λͺ¨λ₯΄μ§λ§ λκ΅°κ° λλ₯Ό μ΄κΈ°λ©΄ κΈ°λ»ν κ²μ
λλ€ :-)
μ΄ μ€λ λμμ 1.1μ΄ μΈκΈλμκ³ v1.1.4κ° λμμ΅λλ€. μμ κ°λ μ¦λͺ μ΄ μ΄λ―Έ 1.1.4μ ν¬ν¨λμ΄ μλμ§ κΆκΈν©λλ€.
μλ.
μ νν λ²μ λ²νΈλ₯Ό μ¬μ©νμ§ λ§μμ΄μΌνλλ° μΈμ λΆλͺ νμ§ λͺ¨λ₯΄κΈ° λλ¬Έμ λλ€. :-)
λλ νμ¬ μ΄κ²μ λν΄ μΌν μκ°μ΄ μμ§λ§ κ°λ μ¦λͺ μ PRμ μμ΅λλ€. νμ¬ APIλ₯Ό λ°μνλλ‘ PRμ μ λ°μ΄νΈνκ³ λκ΅°κ° μ€μ λ‘ κ΅¬νν λκΉμ§ κΈ°λ€λ¦΄ κ²μ λλ€.
https://github.com/gaearon/react-dnd/pull/240 μμ ν λ‘ μ κ³μνκ² μ΅λλ€
λλ₯Ό λ°λΌ μ€λ μ¬λλ€μ μν΄ μ¬κΈ°μ κ²½λ‘κ°μλ κ² κ°μ΅λλ€ https://github.com/LouisBrunner/react-dnd-multi-backend
μ΄ μ€ λν«μ μμ±νμ΅λλ€.
function multiBackends(...backendFactories) {
return function(manager) {
const backends = backendFactories.map(b => b(manager));
return {
setup: (...args) =>
backends.forEach(b => b.setup.apply(b, args)),
teardown: (...args) =>
backends.forEach(b => b.teardown.apply(b, args)),
connectDropTarget: (...args) =>
backends.forEach(b => b.connectDropTarget.apply(b, args)),
connectDragPreview: (...args) =>
backends.forEach(b => b.connectDragPreview.apply(b, args)),
connectDragSource: (...args) =>
backends.forEach(b => b.connectDragSource.apply(b, args)),
};
};
}
λ€μκ³Ό κ°μ΄ μ¬μ©ν©λλ€.
DragDropContext(multiBackends(
ReactDnDHTML5Backend,
ReactDnDTouchBackend,
))
react-dnd-html5-backend
λ° react-dnd-touch-backend
λ λΆλ¦¬ λ μ΄λ²€νΈ μ§ν©μ μμ ν©λλ€. (dragstart, dragend, dragenter, dragleave dragover λ° drop vs touchstart, touchend λ° touchmove).
μΌλΆ κΈ°λ³Έ ν μ€νΈκ° μ μλνλ©° μ΄μ λλκ·Έ μ€ λλ‘μ΄ ν°μΉμ λ§μ°μ€ μ΄λ²€νΈλ₯Ό λμμ μ§μν©λλ€.
μλνμ§ μλ μ΄μ κ° μμ΅λκΉ?
κ°μ₯ μ μ©ν λκΈ
λλ₯Ό λ°λΌ μ€λ μ¬λλ€μ μν΄ μ¬κΈ°μ κ²½λ‘κ°μλ κ² κ°μ΅λλ€ https://github.com/LouisBrunner/react-dnd-multi-backend