컨ν
μ€νΈ, μμ€ λ° λμμ΄ iframe λ΄λΆμμλ κ²½μ° DnDκ° μ΄λ ν΄μ μ μ€ν¨ν©λλ€. DnDμ ν¨κ» μ 곡λλ HTML5.js λ°±μλλ‘ λ€μ μΆμ νμ΅λλ€.
iframeμμ rerenderμ κ΄λ ¨μ΄ μλ€κ³ μκ°νμ§λ§. λ€μμ codepenμ λν μμ
λλ€. http://codepen.io/mattconde/pen/zGLXML?editors=101
μμ λ°μμ νλ μμ λλκ·Έ / λλ‘νλ κ²λ λμκ²λ ν¨κ³Όκ° μμμ΅λλ€. λλκ·Έ / λλ‘ μ΄λ²€νΈλ₯Ό κ° μΆκ° νλ μμ μ°½ κ°μ²΄μ μ μ©νλ©΄λλ κ² κ°μ΅λλ€. νμ¬ λ°μ μ±μ μ€νμ€μΈ μ°½ κ°μ²΄ λ§ κ°μ Έμ΅λλ€.
https://github.com/gaearon/react-dnd/blob/master/src/backends/HTML5.js#L130 -L139
μ΅κ·Ό νλ‘μ νΈμμ HTML5 λ°±μλλ₯Ό μμμ΄ ν¨μΉνμ¬ μλνλλ‘νμ΅λλ€ ( setup
λ° teardown
λ체 win
μ°½ κ°μ²΄ νμ©).
https://gist.github.com/rasmusfl0e/39db428399bd196ef706
λν νμν λ (νλ μ μ€μ μ) setup
λ° teardown
λ₯Ό μ€ννλ €λ©΄ λ°±μλ μΈμ€ν΄μ€κ° μ΄λ»κ² λ λ
ΈμΆλμ΄μΌν©λλ€ ( DragDropContext.js
μμ λ λ§μ monkey-patching ...). .
νμ§λ§ μΌλ¨ μλ£λλ©΄ 맀λ ₯μ²λΌ μλν©λλ€ : D
μ€ μμ° μ’μ λ°κ²¬, λ§μ μλ―Έκ° μμ΅λλ€. μ€λ λμ€μ μλν΄λ³Ό μμ μΈλ° DragDropContext.jsμ λ³κ²½μ νΌν μ μμ΅λκΉ? κ·Έλ κ²νλ©΄ λ¬Έμμμ μΈκΈ ν κ²μ²λΌ μλ‘μ΄ λ°±μλλ₯Ό λ§λ€ μ μμ΅λλ€.
μ΄λ₯Ό ν΄κ²°νλ νΉμ API λ° κ΅¬ν μ μμ κ³ λ €νκ²λμ΄ κΈ°μ©λλ€.
λΆννλ μ νν 무μμ΄ λ°λμκ³ μ λ°λ μλμ§ μμ μμ μννκΈ°κ° μ΄λ ΅μ΅λλ€.
μ§κΈμ iframeμ μ§μνμ§ μλλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€.
@gaearon λλκ·Έ μ€ λλ‘ νμ΄μ§ λΉλλ₯Ό ꡬμΆνλ €κ³ ν©λλ€. λ€λ₯Έ λͺ¨λ κ²μ μλνμ§λ§ νλμ€λ‘ μμ νλ κ²μ λμ°ν©λλ€. ν¬λ‘μ€ νλ μμμ μλνλλ‘ μ‘°μ ν΄μΌ ν λ¨μλ₯Ό μ€ μ μμ΅λκΉ?
@nadimtuhin μ λ λ¬Έμ λ₯Ό μ κΈ°νμ λ ν¬λ‘μ€ νλ μ νμ΄μ§ λΉλλ₯Ό μ§μ μμ νκ³ μμμΌλ©° μ΄λ² μ£Όμ λ€μ€ μ°½ μ루μ μ λ€μ μμν κ²μ λλ€. Reactλ‘ iframeμ κ΄λ¦¬νκ³ μμ΅λκΉ?
λμκ²λ iframe λ΄λΆμμ μμ νλ κ²μ΄ λ μ΄μ μ΅μ μ μ루μ μΈμ§ νμ€νμ§ μμ§λ§ νμ€ν μ’μ κ²μ λλ€. κ·Έλ¬λ μ¬λ¬ μ±μμ μλνλλ‘ react-dndλ₯Ό λͺ©νλ‘νλ κ²μ΄ λ λμ μ΅μ μΈ κ² κ°μ΅λλ€.
μ΄μ κ°λ¨ν μ΄ν΄ 보μκ³ html5 λ°±μλμ μΌλΆ νΈλ€μ λ‘κΉ νμ΅λλ€. 첫 λ²μ§Έ μλμ°μ μμ€λ λ λ²μ§Έ μλμ°μ νκ²μμ κ°μ§λ©λλ€. κ·Έλ¬λ κ·Έκ²μ λ΄κ° μ»μ νμ λλ€.
@gaearon λ΄ μ²« λ²μ§Έ μ€μ μ€ν μμ€
@mattconde no λ΄ λ°μ μ± λ΄μμ iframeμ κ΄λ¦¬νμ§ μμ΅λλ€. λ κ°μ λ€λ₯Έ νλ μμ λ κ°μ λ€λ₯Έ μ±μ μ¬μ©ν κ³νμ λλ€. λΆλͺ¨ μ°½μλ λ°μ΄ν° μ‘°μμμν λ Όλ¦¬μ νλ μ ν μ΄μ μμν μμ νλ μμ΄ μμ΅λλ€. μμμ λΆλͺ¨ νλμ€ μ μ₯μμμ μνμ κ°μ Έμ΅λλ€.
λΏ‘λΏ‘
"HTML5 λ°±μλμ λ‘κ·Έλ₯Ό λ£μ λ€μ μ‘°μ μ μμνμμμ€"μΈμ λ€λ₯Έ μ§μΉ¨μ μ 곡νκΈ°κ° μ΄λ ΅μ΅λλ€. κ°λ₯ν κ°μ₯ κ°λ¨ν μλ₯Ό λ€μ΄μ μ λλ‘ μλνλμ§ νμΈνμμμ€. λ°±μλλ μ°½ μ΄λ²€νΈ λ° λ Έλ μ΄λ²€νΈλ₯Ό ꡬλ νκ³ μ΄λ₯Ό μμ μΌλ‘ λ³ννλ ν κ°μ§ μμ λ§ μνν©λλ€. iframeμ μλ λ°©μμ λν΄ μΆ©λΆν λͺ¨λ¦ λλ€. μ°½μ ꡬλ νμ§ μκ³ νΉμ λ Έλμ μ΅μμ μ°½ (λλ iframe)μ ꡬλ νλλ‘ μ½λλ₯Ό λ³κ²½ν΄μΌ ν μλ μμ΅λλ€. κ·Έλ¬λ λλ μ¬κΈ°μ λ΄ κΉμ΄λ₯Ό λ²μ΄ λ¬μΌλ―λ‘ μ°λ κΈ°μ λν΄ μ΄μΌκΈ°νκ³ μμμ§λ λͺ¨λ₯Έλ€.
νΈμ λ΄μ κ°κΈ°
μ΅κ·Όμ κ°μ λ¬Έμ κ° λ°μνμ΅λλ€. μ€ν¨νλ μ΄μ λ HTML5Backendκ° μ°½μ μ΄λ²€νΈ 리μ€λλ₯Ό μ€μ νκΈ° λλ¬Έμ΄μ§λ§ iframe λ΄μμ μ¬μ©νλ €λ©΄ window.frames [0]κ³Ό κ°μ΄ μ€μ ν΄μΌν©λλ€.
@gaearon HTML5Backend.jsμ μ€μ / ν΄μ²΄ κΈ°λ₯μ 컨ν μ€νΈλ₯Ό μ λ¬νλ μ΅μ μ λν΄ μ΄λ»κ² μκ°νμλκΉ?
iframe λ΄μμ μλνλ ν₯μλ νΈμ§κΈ° (ν μ€νΈ, μ΄λ―Έμ§, ..)λ₯Ό ꡬμΆνμ¬ λμΌν λ¬Έμ λ₯Ό κ²ͺκ³ μμΌλ©° κ·Έ μμ μμ (ν μ€νΈ, img)λ₯Ό λλκ·Έ μ€ λλ‘ν΄μΌν©λλ€. κΈ°λ³Έμ μΌλ‘ μμλ₯Ό λλκ·Έ μ€ λλ‘νμ¬ μ£Όλ¬Έ.
https://github.com/gaearon/react-dnd/issues/435 λ¬Έμ λ₯Ό μ΄μκ³ iframe λλ¬Έμ΄λΌλ κ²μ μμμ΅λλ€. λλ "μ‘°μ "μ μλ ν κ²μ λλ€. κ·Έλ¬λ μ΄λ€ ν΄κ²° λ°©λ²μ΄ μλ€λ©΄ κΈ°λ»ν κ²μ λλ€! :)
iframeμμ μλνλλ‘ PRμ λ§λ€λ €κ³ ν©λλ€. νμ¬ μ§ν μ€μ΄μ§λ§ μμ§ μλνμ§ μμ΅λλ€. setup
λ° teardown
μ κ°κ° componentDidMount
λ° componentWillUnmount
μμ νΈμΆνλ λ°©λ²μ νμ
νλ λ° λ¬Έμ κ° μμ΅λλ€
@Vadorequest μ°λ¦¬ λ λ€ μ μ¬ν μ΅μ’
μ νμ λͺ©νλ‘νλ κ² κ°μ΅λλ€. λλ λΆλͺ¨μμ μμ μ°½μΌλ‘ react-dnd
μ ν¨κ» μλνλλ‘ λλ΄μ§ μμμ΅λλ€. μ κ° ν΄κ²° ν ν΄κ²° λ°©λ²μ μλν° (λΆλͺ¨) μ±κ³Ό 미리보기 (μμ) μ±μ΄μμ΅λλ€. 미리보기 μ±μ νΈμ§κΈ° redux μ€ν μ΄μ μ°κ²°ν μμμ λκΉμ§ λ λλ§λμ§ μμμ΅λλ€.
κ·Έλ° λ€μ redux μ€ν μ΄μ μ¬μ©μκ° νΈμ§κΈ°μμ λ©μ§ μ½ν μΈ νμ΄μ§λ‘ λλκ·Έ ν μμλ ν νλ¦Ώ λͺ©λ‘μ΄ μμ΅λλ€. κ·Έλμ λ΄ ν νλ¦Ώ λͺ©λ‘μ νΈμ§κΈ° μ°½μ μμμ§λ§ λ―Έλ¦¬λ³΄κΈ°λ‘ λλκ·Ένκ³ μΆμ΅λλ€.
λ€μ΄ν°λΈ μ νμ μ§μνλ react-dnd
λλΆμ μλν° μ°½μμ ν
μ€νΈ λλκ·Έλ₯Ό μ€μ νμ¬ λ λλ§ ν κ° ν
νλ¦Ώμ νμν μ 보λ₯Ό μ λ¬ν μμμμ΅λλ€. λ΄ μ½λ μ€ λν« ...
componentDidMount() {
this.refs.template.addEventListener('dragstart', this.handleDragStart, false);
},
componentWillUnmount() {
this.refs.template.removeEventListener('dragstart', this.handleDragStart, false);
},
handleDragStart(e) {
const { template } = this.props;
e.dataTransfer.setData('text/plain', JSON.stringify({
type: template.type,
name: template.name,
}));
return e;
},
κ·Έλ° λ€μ react-dnd
λ€λ₯Έ μͺ½ λμμ JSON λ¬Έμμ΄μ μ‘μ μ μμΌλ©° μ λ§ μ μλν©λλ€.
μ΄λ»κ² νλ μ§ μλ €μ£ΌμΈμ. λ€λ₯Έ λ°©λ²μ λν΄ λ£κ³ μΆμ΄μ.
@mattconde λλ λ κ°μ κ°λ³ λΆκΈ°, μΆμ
ν μμ κ³Ό μ΄μ λν μ€μ μμ μμ μμ
νκ³ μμ΅λλ€. μΆμ
ν μμ μ λ¨μν HTML5Backend.js
νμΌμ ν΄λΉ μ€μ λ³κ²½ν©λλ€. λ³κ²½ μ¬νμ https://github.com/Gutenberg-Technology/react-dnd-html5-backend/commit/8b3d6a44b2cdbfe8d5bac025fc263715968d8b6cμμ λ³Ό μ μμ΅λλ€.
_ (κΈ°λ³Έμ μΌλ‘ target
λ§€κ° λ³μλ₯Ό setup
λ° teardown
μΆκ°ν©λλ€.μ΄ λ§€κ° λ³μλ λ΄ iframeμ κΈ°λ³Έκ°μΌλ‘ μ¬μ©νκ³ window
ν©λλ€. iframeμ΄ λ°κ²¬λμ§ μμΌλ©΄ μ€μ λ‘ μ€ν¨ ν μ λλ‘ μΆμ
νμ§λ§ μ§κΈμ ν κ²μ
λλ€.) _
κ·Έλ¬λ iframeμ΄ λ κ° μ΄μμΈ κ²½μ° μΌλΆ μν©μμλ μ€ν¨ ν κ°λ₯μ±μ΄ μμΌλ―λ‘ λ§νλ κ²μ νΌνλ κ²μ
λλ€. λ λμ ν΄κ²°μ±
μ target
λ§€κ° λ³μλ₯Ό μ λ¬νμ¬ λ¦¬μ€λλ₯Ό λ°μΈλ© λ° λ°μΈλ© ν΄μ νμ¬ λ΄ μ½λ λ΄μμ setup
λ° teardown
λ₯Ό μλμΌλ‘ νΈμΆνλ κ²μ
λλ€.
ν΄κ²°μ± μ μ€λͺ ν΄ μ£Όμ μ κ°μ¬ν©λλ€. κ°κΉμ΄ μ₯λμ λ λμ ν΄κ²° λ°©λ²μ μ°ΎμΌλ©΄ PRμ νμ€ν κ°μ νκ² μ΅λλ€. :)
μλ νμΈμ, λ°©κΈμ΄ λ¬Έμ κ° λ°μνμ¬ μ°½μ iframeκ³Ό μ°κ²°νλ λ°©λ²μ μ μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ°½μ DragSourceλ₯Ό μΆκ°νκ³ iframeμ DropTargetμ λ§λ€κ³ μΆμ΅λλ€. HTML5Backendλ₯Ό μ‘°μ ν΄λ κ·Έλ κ² μλνμ§ μμ΅λλ€.
@mattconde 곡μ ν΄ μ£Όμ μ κ°μ¬ν©λλ€. λλ λΉμ·ν μ΅μ’ μ νμ λ§λ€κ³ μλ€κ³ μκ°ν©λλ€. λ λμ κ²μ Angular 2λ₯Ό μ¬μ©νκ³ μλ€λ κ²μ λλ€. λΆλΆμ μΌλ‘ React-dndλ₯Ό Angularλ‘ μ΄μνμ§λ§ λ§μ§λ§μΌλ‘ iframeμΌλ‘ λ²½μ λΆλͺ νμ΅λλ€. λΉμ μ λ°©λ²μ μλ ν κ²μ λλ€.
@gaearon μ¬κΈ°μ PR βοΈμ iframeμ μ§μνκΈ° μν΄ react-dndλ₯Ό νμ©ν©λλ€. μ°λ € μ¬νμ΄ μκ±°λ λ³κ²½μ΄ νμν κ²½μ° μλ €μ£Όμμμ€.
@kesne λΉμ μ μλ‘μ΄ κ΄λ¦¬μμ λκΉ? μ΄ PRμ κ²ν ν μ μμ΅λκΉ?
μλ
νμΈμ @darthtrevino
λ³κ²½ μ¬νμΌλ‘ νμ΄μ§μμ νλ μμΌλ‘ μμλ₯Ό λλκ·Έ ν μ μμ΅λκΉ?
νλ μ μνμΌλ‘ λλκ·Έ μ€ λλ‘ ν μ μμ΅λλ€.
μλ νμΈμ @crysislinux , μ λμ΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό Angular 2λ‘ ν¬ν νλ €κ³ ν©λλ€. μ¬λ¬λΆμ΄ 무μμ
μλ₯Ό λ€μ΄ iframe λ΄λΆμ iframe μΈλΆμμλ νλͺ©μ λλ‘νλ λ°©λ²μ΄ μμ΅λκΉ?
<DragDropContextProvider backend={HTML5Backend}>
<div>
<Item />
<Frame>
<div>
<Dustbin />
</div>
</Frame>
</div>
</DragDropContextProvider>
λ§μ μλ λμ λ€μκ³Ό κ°μ΄ iframe λ΄λΆμ μμλ₯Ό λμ μμμμ΅λλ€.
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import FrameComponent from 'react-frame-component';
class DragDropAwareIFrame extends Component {
static propTypes = {
innerRef: PropTypes.func,
};
static contextTypes = {
dragDropManager: PropTypes.object.isRequired,
}
constructor(props, context) {
super(props, context);
this.manager = this.context.dragDropManager;
}
componentDidMount() {
const iframe = ReactDOM.findDOMNode(this.iframe);
this.manager.getBackend().addEventListeners(iframe.contentWindow);
}
componentWillUnmount() {
const iframe = ReactDOM.findDOMNode(this.iframe);
this.manager.getBackend().removeEventListeners(iframe.contentWindow);
}
handleRef = (el) => {
this.iframe = el;
if (this.props.innerRef) this.props.innerRef(el);
}
render() {
const { innerRef, ...props } = this.props;
return <FrameComponent {...props} ref={this.handleRef} />;
}
}
<DragDropContextProvider backend={HTML5Backend}>
<div>
<Item />
<DragDropAwareIFrame>
<div>
<Dustbin />
</div>
</DragDropAwareIFrame>
</div>
</DragDropContextProvider>
μ΄κ²μ΄ μ¬λ°λ₯Έ λ°©λ² μΈ κ² κ°μ΅λκΉ?
@ethanve μμμ λ¬Έμ μμμ΄ μ€λ λλ₯Ό μ°μ°ν λ°κ²¬νμ΅λλ€. μ€λͺ νμ λλ‘ μμ±νμ΅λλ€. https://cormacrelf.github.io/angular-skyhook/
λν iframe λ΄μμ dndλ₯Ό μ¬μ©νλ λ° λ¬Έμ κ° μμ΅λλ€ (λΆλͺ¨ μνΈ μμ© μμ). λλκ·Έλ μ μλνμ§λ§ λλ‘ μ‘΄μ λ μ΄μ μλνμ§ μμ΅λλ€. λλ‘ μ‘΄μ΄ iframe λ΄μμ μλνλλ‘νλ μ루μ μ 무μμ λκΉ (νλͺ©μ iframe λ΄μμ μμ ν μ΄λ).
Touch λ°±μλμμλ μλνμ§λ§ HTML5 λ°±μλμμλ μλνμ§ μλλ€λ μ μ μ§μ νκ³ μΆμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
λ§μ μλ λμ λ€μκ³Ό κ°μ΄ iframe λ΄λΆμ μμλ₯Ό λμ μμμμ΅λλ€.
μ΄κ²μ΄ μ¬λ°λ₯Έ λ°©λ² μΈ κ² κ°μ΅λκΉ?