React-dnd: redux connect ๋ฐ react-dnd ์‚ฌ์šฉ๋ฒ•

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

connect function ์‚ฌ์šฉํ•˜๋Š” ์•ฑ ์ƒํƒœ ํŠธ๋ฆฌ๋ฅผ ์ธ์‹ํ•ด์•ผ ํ•˜๊ณ  react-dnd๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค export default ; ๊ทธ๋Ÿฌ๋‚˜ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ redux์— ์—ฐ๊ฒฐํ•˜๊ณ  dragdropcontext๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

์˜ˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { connect } from "react-redux";
import HTML5Backend from "react-dnd-html5-backend";
import { DragDropContext } from "react-dnd";

class App extends Component {
  ...
}

App = DragDropContext(HTML5Backend)(App);
export default connect(mapStateToProps)(App);

๋‹ค์‹œ ์—ด์–ด์ฃผ์„ธ์š” :) .

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

์˜ˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { connect } from "react-redux";
import HTML5Backend from "react-dnd-html5-backend";
import { DragDropContext } from "react-dnd";

class App extends Component {
  ...
}

App = DragDropContext(HTML5Backend)(App);
export default connect(mapStateToProps)(App);

๋‹ค์‹œ ์—ด์–ด์ฃผ์„ธ์š” :) .

์•„ ์ €๋„ ๊ทธ๋ ‡๊ฒŒ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. flow ๊ฒƒ๋„ ํ—ˆ์šฉ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ?

import { DragDropContext } from 'react-dnd'
import HTML5Backend from 'react-dnd-html5-backend'
import flow from 'lodash/flow'

export default flow(
  connect(selector),
  DragDropContext(HTML5Backend)
)(ExperienceEditor);

๋„ค, ๊ทธ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!

ํ„ฐ์น˜ ๋ฐฑ ์—”๋“œ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...
๋‚˜๋Š” ์‹œ๋„ํ–ˆ๋‹ค
์•ฑ = DragDropContext(TouchBackend({ enableMouseEvents: true }))(์•ฑ);
๊ธฐ๋ณธ ์—ฐ๊ฒฐ ๋‚ด๋ณด๋‚ด๊ธฐ(mapStateToProps, mapDispatchToProps)(์•ฑ);
์ด ๋ฌธ์ œ๋ฅผ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@longmfe App ๋Š” ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ ์˜ค๋‚˜์š” ?

@jnrepo ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ ์ˆ˜์ž…ํ•ฉ๋‹ˆ๋‹ค
import App from ../../somepath/App.js
๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ญ”๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
BTW, ๋‚˜๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ์•ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
import {connect} from react-redux
import {bindActionsCreators} from redux
class App extends Component {
}
App = DragDropContext(TouchBackend({ enableMouseEvents: true }))(App);
export default connect(mapStateToProps, mapDispatchToProps)(App);
์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”.

DragDropContext๋กœ ๋ฃจํŠธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜์†”์—์„œ ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.
Invariant Violation: addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's ๋ Œ๋”๋ง method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner).

์ด ๋ฌธ์ œ์˜ ์›์ธ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๋‹จ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” React์˜ ์—ฌ๋Ÿฌ ์‚ฌ๋ณธ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ DragDropContext๋กœ ๋ฃจํŠธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ธฐ ์ „์— ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

๋‹ค์Œ๊ณผ ๊ฐ™์ด root.js๋ฅผ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
import { Component } from 'react';
import { DragDropContext } from 'react-dnd';
import HTML5Backend from 'react-dnd-html5-backend';

class Root extends Component {
render() {
return <div>
{React.cloneElement(this.props.children, this.props)}
</div>;
}
}

export default DragDropContext(HTML5Backend)(Root);

๊ทธ๋ฆฌ๊ณ  App.js๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import Root from './root';

function mapStateToProps(state) {
return {
...
}
}

function mapDispatchToProps(dispatch) {
return bindActionCreators({
...
}, dispatch)
}

const App = connect(mapStateToProps, mapDispatchToProps)(Root);

export default App;

React ์ฝ˜์†”์€ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค...
screen shot 2017-01-16 at 11 55 02 pm

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