React-dnd: λ“œλž˜κ·Έ μ†ŒμŠ€κ°€ μ „ν˜€ λ Œλ”λ§λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 09μ›” 15일  Β·  15μ½”λ©˜νŠΈ  Β·  좜처: react-dnd/react-dnd

버그 μ„€λͺ…
DragSource 둜 μž₯μ‹λœ μ»΄ν¬λ„ŒνŠΈλŠ” μ „ν˜€ λ Œλ”λ§λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(λ Œλ” κΈ°λŠ₯이 ν˜ΈμΆœλ˜μ§€ μ•ŠμŒ)

μž¬ν˜„ν•˜κΈ° μœ„ν•΄
λ‹€μŒκ³Ό 같은 ꡬ성 μš”μ†Œλ₯Ό μž‘μ„±ν•˜μ‹­μ‹œμ˜€.

import * as React from "react";
import styled from "styled-components";
import {
  DragSource,
  DragSourceConnector,
  DragSourceMonitor,
  ConnectDragSource
} from "react-dnd";

const ImageHolder = styled.div`
  margin: 10px;
  max-width: 200px;
  width: 200px;
  min-height: 100px;
  position: relative;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  align-items: center;
`;

const ImageNameHolder = styled.div`
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 10px;
  background-color: rgba(0, 0, 0, 0.5);
  font-size: 13px;
`;

interface Props {
  imagePath: string;
  connectDragSource?: ConnectDragSource;
  isDragging?: boolean;
}

@DragSource<Props>(
  "image",
  {
    beginDrag: (props: Props) => props.imagePath
  },
  (connect: DragSourceConnector, monitor: DragSourceMonitor) => ({
    connectDragSource: connect.dragSource(),
    isDragging: monitor.isDragging()
  })
)
export class PhotosBrowserPhoto extends React.Component<Props> {
  render() {
    const { imagePath, connectDragSource } = this.props;
    console.log({ connectDragSource });
    return connectDragSource(
      <div>drag me</div>
    );
  }
}

μ˜ˆμƒλ˜λŠ” 행동
drag me ν…μŠ€νŠΈκ°€ μžˆλŠ” λ“œλž˜κ·Έ κ°€λŠ₯ν•œ κ΅¬μ„±μš”μ†Œ, connectDragSource κ°€ μ½˜μ†”μ— 인쇄됨

μ‹€μ œ 행동
아무것도 λ Œλ”λ§λ˜μ§€ μ•Šκ³  μ½˜μ†”μ΄ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

wontfix

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

μ•„λž˜μ™€ 같이 κ³΅κΈ‰μžλ₯Ό μΆ”κ°€ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

import HTML5Backend from 'react-dnd-html5-backend'
import { DragDropContextProvider } from "react-dnd";

<DragDropContextProvider backend={HTML5Backend}>
 <App/>
</DragDropContextProvider>

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

ES6 ꡬ문을 μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ 같은 일이 μ €μ—κ²Œ μΌμ–΄λ‚˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

import React, { Component } from "react";
import { DragSource } from "react-dnd";
import PropTypes from "prop-types";

import "./Dictionary.css";

const propTypes = {
  entry: PropTypes.object.isRequired,

  // Injected by React DnD:
  isDragging: PropTypes.bool.isRequired,
  connectDragSource: PropTypes.func.isRequired
};

const TYPES = {
  ROW: "row"
};

/**
 * Implements the drag source contract.
 */
const rowSource = {
  beginDrag(props) {
    console.log(props);
    return {
      entry: props.entry
    };
  }
};

/**
 * Specifies the props to inject into your component.
 */
function collect(connect, monitor) {
  return {
    connectDragSource: connect.dragSource(),
    isDragging: monitor.isDragging()
  };
}

class Row extends Component {
  constructor(props) {
    console.log("here");
    super(props);
    this.state = {
      entry: props.entry
    };
  }

  static getDerivedStateFromProps = (props, state) => {
    return {
      entry: props.entry
    };
  };

  render() {
    const { isDragging, connectDragSource } = this.props;
    const { entry } = this.state;

    console.log("dragging:", isDragging);
    return connectDragSource(
      <div style={{ opacity: isDragging ? 0.5 : 1 }} className="row">
        <div>{entry.string}</div>
        <div>{entry.kMandarin}</div>
        <div>{entry.kDefinition}</div>
      </div>
    );
  }
}

Row.propTypes = propTypes;

export default DragSource(TYPES.ROW, rowSource, collect)(Row);

μ‚¬μš©:

    "react-dnd-html5-backend": "^5.0.1",
    "react-dom": "^16.5.1",

μ˜ˆμƒ: λ Œλ”λ§λœ ꡬ성 μš”μ†Œ 및 μ½˜μ†” 둜그 μ°Έμ‘°
μ‹€μ œ: 아무것도 λ Œλ”λ§λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 아무것도 κΈ°λ‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€

λ‚΄ μ•±μ˜ λ£¨νŠΈμ— κ³΅κΈ‰μž ꡬ성 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” 그것이 ν•„μš”ν•˜λ‹€λŠ” 것을 예제 μ½”λ“œμ—μ„œ λΆ„λͺ…νžˆ μ–ΈκΈ‰ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ €λŠ” 예제λ₯Ό λ³΄λŠ” κ²ƒμœΌλ‘œ 라이브러리 μ‚¬μš©μ„ μ‹œμž‘ν•˜λŠ” 방법을 μ΄ν•΄ν•˜κΈ°μ— μΆ©λΆ„ν•˜λ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” 이 if -statementμž…λ‹ˆλ‹€.
https://github.com/react-dnd/react-dnd/blob/934efc81871f30c6038e2dc52be1504fe38132e7/packages/react-dnd/src/decorateHandler.tsx#L210

μ»¨ν…μŠ€νŠΈκ°€ μ—†μœΌλ©΄ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 검사λ₯Ό λΉ„ν™œμ„±ν™”ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

μ•„λž˜μ™€ 같이 κ³΅κΈ‰μžλ₯Ό μΆ”κ°€ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

import HTML5Backend from 'react-dnd-html5-backend'
import { DragDropContextProvider } from "react-dnd";

<DragDropContextProvider backend={HTML5Backend}>
 <App/>
</DragDropContextProvider>

fyi: 방금 Portal을 μ‚¬μš©ν•  λ•Œ λ¬Έμ œκ°€ λ°œμƒν–ˆκ³  였래된 ReactDOM.unstable_renderSubtreeIntoContainer APIλ₯Ό ReactDOM.createPortal 둜 κ΅μ²΄ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

λ Œλ”λ§ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 λ§Žμ€ μ‹œκ°„μ„ ν• μ• ν•˜μ§€ μ•Šμ€ μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? μ—¬κΈ°μ—μ„œ 닡을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. μƒ˜ν”Œμ„ μ§„μ§€ν•˜κ²Œ μˆ˜ν–‰ν•˜μ‹­μ‹œμ˜€. κ°μ‚¬ν•©λ‹ˆλ‹€.

React 16.8.1에 λŒ€ν•΄ μ‘΄μž¬ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ‚΄ κ΄€λ¦¬μžλŠ” μƒμ„±λ˜μ§€ μ•ŠμœΌλ©° DragSource λ‚΄λΆ€μ˜ Context.ConsumerλŠ” μžμ‹μ„ λ Œλ”λ§ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이것은 λ¬Έμ„œμ˜ λΉ λ₯Έ μ‹œμž‘ μ„Ήμ…˜ 어디에도 μ—†μŠ΅λ‹ˆλ‹€.

이것은 μ‹€μ œλ‘œ λ¬Έμ„œμ— μžˆμ–΄μ•Ό ν•˜λŠ” 첫 번째 κ²ƒμž…λ‹ˆλ‹€ ...

λ™μΌν•œ λ¬Έμ œκ°€ μžˆμ§€λ§Œ νŠΉμ • ν”„λ‘œλ•μ…˜ λΉŒλ“œμ—μ„œλ§Œ λ°œμƒν•©λ‹ˆλ‹€( DragDropContextProvider κ°€ λ‚΄ νŠΈλ¦¬μ— μžˆλŠ”μ§€ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€). λ°˜μ‘ 개발 도ꡬλ₯Ό μ‚¬μš©ν•  λ•Œ DragDropContextProvider κ°€ μ†μ‹€λ˜κ³  ꡬ성 μš”μ†Œ νŠΈλ¦¬μ—μ„œ Unknown 둜 λ‚˜νƒ€λ‚©λ‹ˆλ‹€(μŠ€ν¬λ¦°μƒ· μ°Έμ‘°).
Screen Shot 2019-03-14 at 2 31 16 AM

v7.3.2μ—μ„œ λ‹€μŒμœΌλ‘œ λ‹€μš΄κ·Έλ ˆμ΄λ“œ

  • "λ°˜μ‘-dnd": "7.1.0",
  • "react-dnd-html5-backend": "7.1.0"

λ‚˜λ₯Ό μœ„ν•΄ 그것을 κ³ μΉœλ‹€.

λ‚˜λŠ” λ˜ν•œ 같은 버그에 μ§λ©΄ν–ˆλ‹€.
개발 μ€‘μ—λŠ” ν‘œμ‹œλ˜μ§€λ§Œ ν”„λ‘œλ•μ…˜μ—λŠ” ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

제 ν™˜κ²½μž…λ‹ˆλ‹€.

  • "λ°˜μ‘-dnd": "7.1.0",
  • "react-dnd-html5-backend": "7.1.0"
const render = () => {
  ReactDOM.render(
    <DragDropContextProvider backend={HTML5Backend}>
      <Provider store={store}>
        <ConnectedRouter history={history}>
          <AppContainer>
            <App />
          </AppContainer>
        </ConnectedRouter>
      </Provider>
    </DragDropContextProvider>,
    document.getElementById('app')
  );
};

γ‚Ήγ‚―γƒͺγƒΌγƒ³γ‚·γƒ§γƒƒγƒˆ 2019-03-22 17 13 46

DragDropContextProviderλ₯Ό μ•Œ 수 μ—†μŒ

이 λ¬Έμ œλŠ” 졜근 ν™œλ™μ΄ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ 였래된 κ²ƒμœΌλ‘œ ν‘œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 더 μ΄μƒμ˜ ν™œλ™μ΄ μ—†μœΌλ©΄ νμ‡„λ©λ‹ˆλ‹€. κ·€ν•˜μ˜ 기여에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

그것이 μžλ™μœΌλ‘œ λ‹«νžˆκΈ° 전에 ν•΄κ²°λ˜μ—ˆλŠ”μ§€ μ•„λŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

λ‚΄κ°€ ν•΄κ²°ν•œ 방법
제 κ²½μš°μ—λŠ” λͺ¨λ‘ devμ—μ„œ 잘 μž‘λ™ν–ˆμ§€λ§Œ ν”„λ‘œλ•μ…˜μ—μ„œλŠ” μ™„μ „νžˆ κΉ¨μ‘ŒμŠ΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” useDrag κ°€μ Έμ˜€κΈ° κ²½λ‘œμ—μ„œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€...

κ°€μ Έμ˜€κΈ°κ°€ μž‘λ™ν•˜μ§€ μ•ŠμŒ
import {useDrag} from "react-dnd/lib/index";

μž‘μ—… κ°€μ Έμ˜€κΈ°
import {useDrag} from "react-dnd";

즉, 첫 번째 μˆ˜μž…μ΄ μ–΄λ–»κ²Œ μ‹œμž‘λ˜μ—ˆλŠ”μ§€ μ •λ§λ‘œ λͺ¨λ¦…λ‹ˆλ‹€.

λ˜ν•œ μ•± λ£¨νŠΈμ—μ„œ DndProviderλ₯Ό κ°€μ Έμ˜¬ ν•„μš”κ°€ μ—†λ‹€κ³  μžμ‹  있게 말할 수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμ œκ°€ κ°€μ Έμ˜€κΈ°λ‘œ 인해 λ°œμƒν–ˆλ‹€λŠ” 것을 μ•ŒκΈ° μœ„ν•΄ 이전에 μˆ˜ν–‰ν–ˆμ§€λ§Œ κ°€μ Έμ˜€κΈ° "μˆ˜μ •" 후에 μ•± 루트 λŒ€μ‹  ꡬ성 μš”μ†Œ 쀑 ν•˜λ‚˜μ—μ„œ DndProviderλ₯Ό λ³΅μ›ν–ˆμœΌλ©°(더 κΉ¨λ—ν•œ μ½”λ“œμš©) μž‘λ™ν•©λ‹ˆλ‹€. μ’‹μ•„.

λ¬Έλ§₯:

  • "λ°˜μ‘": "^16.8.3",
  • "λ°˜μ‘-dnd": "^9.0.1",
  • "react-dnd-html5-backend": "^9.0.0",

이 λ¬Έμ œλŠ” 졜근 ν™œλ™μ΄ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ 였래된 κ²ƒμœΌλ‘œ ν‘œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 더 μ΄μƒμ˜ ν™œλ™μ΄ μ—†μœΌλ©΄ νμ‡„λ©λ‹ˆλ‹€. κ·€ν•˜μ˜ 기여에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

아직 해결책이 μ—†λ‚˜μš”? 이 μ£Όμ œμ—μ„œ μ œμ•ˆλœ λ‚΄μš©μ΄ 도움이 λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

"λ°˜μ‘-dnd": "^11.1.3",
"react-dnd-html5-backend": "^11.1.3",

μƒνƒœ μœ„μΉ˜λ₯Ό λ³€κ²½ν•  λ•Œλ§Œ λͺ¨λ“  것이 잘 μž‘λ™ν•©λ‹ˆλ‹€. μ½˜μ†” λ‘œκ·Έμ—μ„œ λ³€κ²½ 사항을 λ³Ό 수 μžˆλŠ” λ™μ•ˆ λ Œλ”λ§μ„ λ³Ό 수 μ—†μŠ΅λ‹ˆλ‹€.

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