React-dnd: ์‚ฌ์šฉ์ž ์ง€์ • ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด HTML ์Šคํƒ€์ผ๊ณผ ์‚ฌ์šฉ์ž ์ง€์ • ๋ ˆ์ด์–ด๋ฅผ ๋ชจ๋‘ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 05์›” 16์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: react-dnd/react-dnd

์•ˆ๋…•ํ•˜์„ธ์š”, ์‚ฌ์šฉ์ž ์ •์˜ ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ HTML ์ •์˜ ์Šคํƒ€์ผ๋กœ ๋ Œ๋”๋ง๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— "์—…๋ฐ์ดํŠธ ์ „ํ™˜ ์ค‘์— setState๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import React from 'react';
import PropTypes from 'prop-types';
import { DragLayer } from 'react-dnd';

import ItemDragPreview from './ItemDragPreview';

const layerStyles = {
    position: 'fixed',
    pointerEvents: 'none',
    zIndex: 200000
};

function getItemStyles(props){
    const {initialOffset, currentOffset} = props;

     if (!initialOffset || !currentOffset) {
        return {
        display: 'none'
        };
    }

    let {x,y} = currentOffset;
    const transform = `translate(${x}px,${y}px)`;
    return{
        transform
    };
}

class CustomDragLayer extends React.Component{
    static propTypes = {
        item: PropTypes.object,
        itemType: PropTypes.string,
        initialOffset: PropTypes.shape({
            x: PropTypes.number.isRequired,
            y: PropTypes.number.isRequired
        }),
        currentOffset: PropTypes.shape({
            x: PropTypes.number.isRequired,
            y: PropTypes.number.isRequired
        }),
        isDragging: PropTypes.bool.isRequired,
    }

    renderItem(type,item){
        return (<ItemDragPreview ruleitem={item}/>);
    }

    render(){
        const {item,itemType,isDragging} = this.props;
        if(!isDragging){
            return null;
        }

        return (
            <div style={layerStyles}>
                <div style={getItemStyles(this.props)}>
                    {this.renderItem(itemType,item)}
                </div>
            </div>
        );
    }

}

let collect = monitor =>{
    return {
        item: monitor.getItem(),
        itemType: monitor.getItemType(),
        currentOffset: monitor.getSourceClientOffset(),
        initialOffset: monitor.getInitialSourceClientOffset(),
        isDragging: monitor.isDragging()
    };
}

export default DragLayer(collect)(CustomDragLayer);

๋‹ค์Œ์€ ๊ฒฝ๊ณ ์ž…๋‹ˆ๋‹ค.

๊ฒฝ๊ณ : setState(...): ๊ธฐ์กด ์ƒํƒœ ์ „ํ™˜ ์ค‘์—๋Š” ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ: render ๋˜๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ƒ์„ฑ์ž ๋‚ด์—์„œ). ๋ Œ๋” ๋ฉ”์†Œ๋“œ๋Š” props์™€ state์˜ ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ๋ถ€์ž‘์šฉ์€ ์•ˆํ‹ฐ ํŒจํ„ด์ด์ง€๋งŒ componentWillMount ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด ์ชฝ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ชฝ์˜ ์˜ค๋ฅ˜์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ํ•ด์š”!

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

ItemDragPreview์˜ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ? DragSource ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ItemDragPreview๊ฐ€ DragSource๋„ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ItemDragPreview ๋‚ด์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•ญ๋ชฉ๋„ ๋น„ํ™œ์„ฑํ™”ํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์˜ html/jsx๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. ๊นจ๋—ํ•œ ์Šฌ๋ ˆ์ดํŠธ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ํ•˜๋‚˜์”ฉ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

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

ItemDragPreview์˜ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ? DragSource ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ItemDragPreview๊ฐ€ DragSource๋„ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ItemDragPreview ๋‚ด์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•ญ๋ชฉ๋„ ๋น„ํ™œ์„ฑํ™”ํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์˜ html/jsx๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. ๊นจ๋—ํ•œ ์Šฌ๋ ˆ์ดํŠธ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ํ•˜๋‚˜์”ฉ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

์ปค๋„ฅํ„ฐ์—์„œ ๋“œ๋ž˜๊ทธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋„ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋‘ ์ข‹์•„

๋‚˜๋„์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "์ปค๋„ฅํ„ฐ์—์„œ"๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

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