React-dnd: ์‹ค์ œ ๋“œ๋ž˜๊ทธ ์š”์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2016๋…„ 04์›” 20์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: react-dnd/react-dnd

๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅํ•œ ํ…์ŠคํŠธ๊ฐ€ ์žˆ์ง€๋งŒ ๋„ˆ๋น„/๋†’์ด๊ฐ€ ์‹ค์ œ ํฌ๊ธฐ์˜ ์•ฝ 20%์ธ ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์Šคํฌ๋ฆฐ์ƒท์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋ ค๋ฉด ํฌ๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท ์ž์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

triage wontfix

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ชจ๋‹ˆํ„ฐ ํ•ญ๋ชฉ์„ ํ†ตํ•ด ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋‹ˆํ„ฐ ํ•ญ๋ชฉ์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” beginDrag ์˜ DragSource ์‚ฌ์–‘์—์„œ ๋ฐ˜์‘ ๊ตฌ์„ฑ ์š”์†Œ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ฐ€์ ธ์™€ ํ•ญ๋ชฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— findDOMNode ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋…ธ๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋จผ์ € ๊ตฌ์„ฑ ์š”์†Œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ญ๋ชฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  beginDrag({ id }, monitor, component) {
    return {
      id,
      component
    };
  },

๋‚˜์ค‘์— DragLayer์—์„œ ํ•ญ๋ชฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

const CustomDragLayer = DragLayer(monitor => ({
  item: monitor.getItem(),
  isDragging: monitor.isDragging() // useful
}))(CustomDragLayer);

์ด์ œ CustomDragLayer ์†Œํ’ˆ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

class CustomDragLayer extends Component {
  constructor(props) {
    super(props);
    this.width;
    this.height;

    // Now you can eacily get height or width from node 
    const node = findDOMNode(props.item.component);
    console.log(node.clientWidth);
  }
...

๊ณต์ง€ ๋ฐฉ๋ฒ• findDOMNode ์—์žˆ๋Š” constructor , ๊ทธ๊ฒƒ์€์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ render ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ๋“œ๋ž˜๊ทธ ์†Œ์Šค๋Š” ์•„๋งˆ ์ •์  ํฌ๊ธฐ๊ฐ€ ์‹ค์ œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  6 ๋Œ“๊ธ€

DragLayer์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค(http://gaearon.github.io/react-dnd/examples-drag-around-custom-drag-layer.html).

์•ˆ๋…•ํ•˜์„ธ์š”. ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜๊ณ  dnd๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. connectDragPreview์— ์•„๋ฌด ํšจ๊ณผ๋„ ์—†์ด ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ๋„ˆ๋น„/๋†’์ด ๋ฐ style.w/h๋กœ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ์ƒ…์ƒ…์ด ๋’ค์ ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •์— ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์‹ค์ œ html ์š”์†Œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ์— ๊นŠ์ˆ™์ด ๋ฌปํ˜€ ์žˆ์–ด ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์€ connectDragPreview/dragPreview๊ฐ€ ํฌ๊ธฐ ์กฐ์ • ์˜ต์…˜์„ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ์ „๋‹ฌ๋œ ์ด๋ฏธ์ง€).

๋‹ค์Œ์€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์„ค์ •ํ•ด๋„ onload ํ•จ์ˆ˜๋‚˜ setDragImage ํ•จ์ˆ˜์—์„œ ์•„๋ฌด ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

componentDidMount = () => {
this.setDragImage();
};

componentDidUpdate = () => {
this.setDragImage();
};

setDragImage = () => {
const ์ด๋ฏธ์ง€ = ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€();
image.src = this.props.imgUrl;
image.onload = () => {
์ด๋ฏธ์ง€ ๋„ˆ๋น„ = ์ด๋ฏธ์ง€ ๋†’์ด = 35;
this.props.connectDragPreview(์ด๋ฏธ์ง€);
}
};

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋‹ˆํ„ฐ ํ•ญ๋ชฉ์„ ํ†ตํ•ด ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋‹ˆํ„ฐ ํ•ญ๋ชฉ์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” beginDrag ์˜ DragSource ์‚ฌ์–‘์—์„œ ๋ฐ˜์‘ ๊ตฌ์„ฑ ์š”์†Œ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ฐ€์ ธ์™€ ํ•ญ๋ชฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— findDOMNode ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋…ธ๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋จผ์ € ๊ตฌ์„ฑ ์š”์†Œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ญ๋ชฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  beginDrag({ id }, monitor, component) {
    return {
      id,
      component
    };
  },

๋‚˜์ค‘์— DragLayer์—์„œ ํ•ญ๋ชฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

const CustomDragLayer = DragLayer(monitor => ({
  item: monitor.getItem(),
  isDragging: monitor.isDragging() // useful
}))(CustomDragLayer);

์ด์ œ CustomDragLayer ์†Œํ’ˆ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

class CustomDragLayer extends Component {
  constructor(props) {
    super(props);
    this.width;
    this.height;

    // Now you can eacily get height or width from node 
    const node = findDOMNode(props.item.component);
    console.log(node.clientWidth);
  }
...

๊ณต์ง€ ๋ฐฉ๋ฒ• findDOMNode ์—์žˆ๋Š” constructor , ๊ทธ๊ฒƒ์€์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ render ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ๋“œ๋ž˜๊ทธ ์†Œ์Šค๋Š” ์•„๋งˆ ์ •์  ํฌ๊ธฐ๊ฐ€ ์‹ค์ œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@MrBr , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ์—†์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰