React-dnd: ν„°μΉ˜ λ°±μ—”λ“œ

에 λ§Œλ“  2014λ…„ 10μ›” 27일  Β·  25μ½”λ©˜νŠΈ  Β·  좜처: react-dnd/react-dnd

ν„°μΉ˜ μž₯치λ₯Ό μœ„ν•΄ μžλ™μœΌλ‘œ μ „ν™˜λ˜λŠ” ν„°μΉ˜ λ°±μ—”λ“œκ°€ μžˆλ‹€λ©΄ ν‚¬λŸ¬ 일 κ²ƒμž…λ‹ˆλ‹€.

enhancement

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚˜λ₯Ό 따라 μ˜€λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄ 여기에 κ²½λ‘œκ°€μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ https://github.com/LouisBrunner/react-dnd-multi-backend

λͺ¨λ“  25 λŒ“κΈ€

κ³Όμ—°! λ‹€μŒ 주에 이것을 μ‚΄νŽ΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

포인터 이벀트λ₯Ό μ‚¬μš©ν•˜μ—¬ 이와 같은 μž‘μ—…μ„ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 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 λ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜„μž¬ λ“œλž˜κ·Έ μœ„μΉ˜μ— λŒ€ν•΄ ν•™μŠ΅ν•˜κ³  λ“œλž˜κ·Έκ°€ λ°œμƒν•  λ•Œ μ‹€μ œ μš”μ†Œλ₯Ό 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.

screen shot 2014-10-28 at 20 30 15

ν•­λͺ©μ΄ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆμ— 걸쳐 화면을 κ°€λ‘œ 질러 λ“œλž˜κ·Έλ˜λŠ” 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/index.js#L14

https://github.com/gaearon/react-dnd/blob/experiments/examples/_drag-around-experimental/DragLayer.js

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).

일뢀 κΈ°λ³Έ ν…ŒμŠ€νŠΈκ°€ 잘 μž‘λ™ν•˜λ©° 이제 λ“œλž˜κ·Έ μ•€ λ“œλ‘­μ΄ ν„°μΉ˜μ™€ 마우슀 이벀트λ₯Ό λ™μ‹œμ— μ§€μ›ν•©λ‹ˆλ‹€.

μž‘λ™ν•˜μ§€ μ•ŠλŠ” μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰