ããã«ã¡ã¯ãã³ã
ã ãã§ç°¡åã«1 -ç§ãæã£ãŠããèªåèªèº«ã®ã³ã³ããŒãã³ãã䜿çšããããšããŠããreact-dnd
_itselfãuses_å¥ã®ã¢ããªã§äŸåé¢ä¿ãšããŠreact-dnd
äžèšã®ãšã©ãŒãäºæ³ãããããã«ã ãã®å Žåããããä¿®æ£ããããã®æè¯ã®æ¹æ³ã¯äœã§ããããïŒ
ä»ã®ã³ã³ããŒãã³ãã¯ç§èªèº«ã®ãã®ã§ãããããã³ã³ããŒãã³ãã®ãšã¯ã¹ããŒãäžã«ããDragDropContext
åŒã³åºããåé€ã§ããŸãããã³ã³ããŒãã³ãã®åå©çšæ§ãç ç²ã«ãªããŸãã ããªãã¯äœãã¢ããã€ã¹ããŸããïŒ
DragDropContextã®ãœãŒã¹ã確èªããŠãã ããã ããªãŒã®äžã®ã³ã³ããŒãã³ãã§æå®ãããŠããã°ãæ¢åã®ãããŒãžã£ãŒãåå©çšã§ããã¯ãã ãšæããŸãã ããããããã§ãé£ãã質åã§ããææ¡ããã解決çã¯ãããŸããïŒ
ããªãŒã®äžã®ã³ã³ããŒãã³ãã§æå®ãããŠããã°ãæ¢åã®ãããŒãžã£ãŒãåå©çšã§ããã¯ãã ãšæããŸãã
ãããå¯èœã§ãã£ãŠãããšã¯ã¹ããŒããããã³ã³ããŒãã³ãã¯ç¬ç«ããŠåäœã§ããå¿ èŠããããããã¯ãšã³ããïŒã³ã³ããŒãã³ãã䜿çšãããŠããã¢ããªå ã«ïŒååšããå Žåã¯ããã§ãŒã³ã®ã©ããã«åå©çšããå¿ èŠããããŸãã ãœãŒã¹ãèªãã§ããããå®è¡ã§ãããã©ããã確èªããŸãã
æ®å¿µãªãããç§ãä»èããããšãã§ããå¯äžã®è§£æ±ºçã¯ãæçµã³ã³ããŒãã³ãããã®ãŸãŸãšã¯ã¹ããŒããããŠãŒã¶ãŒãéžæããããã¯ãšã³ãã§DragDropContext
ãè¿œå ããããšãæåŸ
ããããšã§ãã ã©ãæããŸããïŒ
ãšã¯ã¹ããŒããããã³ã³ããŒãã³ããç¬ç«ããŠæ©èœã§ããå¿ èŠããããããã¯ãšã³ããïŒã³ã³ããŒãã³ãã䜿çšãããŠããã¢ããªå ã«ïŒååšããå Žåã¯ããã§ãŒã³ã®ã©ããã«åå©çšããå¿ èŠããããŸãã
ã¯ããããã¯DragDropContext
å®å
šã«äœ¿çšããã代ããã«ã³ã³ããã¹ãã§dragDropManager
ãæåã§äœ¿çšããããšã§å¯èœã§ãã ã³ã³ããŒãã³ãã¯ã³ã³ããã¹ãã調ã¹ãŠãæ¢åã®dragDropManager
ãã³ã³ããã¹ãã«æž¡ãããç¬èªã®ã³ã³ããŒãã³ããäœæããŸãã ããããããã¯ããå£ããããããã§ãã
æ®å¿µãªãããç§ãä»èããããšãã§ããå¯äžã®è§£æ±ºçã¯ãæçµã³ã³ããŒãã³ãããã®ãŸãŸãšã¯ã¹ããŒããããŠãŒã¶ãŒãéžæããããã¯ãšã³ãã§DragDropContextãè¿œå ããããšãæåŸ ããããšã§ãã ã©ãæããŸããïŒ
ãããæãæè»ãªãœãªã¥ãŒã·ã§ã³ã ãšæããŸãã ããã§æèŠãè¿°ã¹ãŠã <MyComponentContext>
ãé©çšããDragDropContext(HTML5Backend)
<MyComponentContext>
ããšã¯ã¹ããŒãããããšãã§ããŸãã
ãšã¯ã¹ããŒã
<MyComponentContext>
é©çšãããDragDropContext(HTML5Backend)
ç³ãèš³ãããŸããããããããããŸããã ãããããå°ãæ確ã«ã§ããŸããïŒ
export default function MyTagControlContext(DecoratedClass) {
return DragDropContext(HTML5Backend)(DecoratedClass);
}
ãŸãããŠãŒã¶ãŒã«ãæäžäœã®ã³ã³ããŒãã³ããMyTagControlContext
ã«ã©ããããããReact DnDã_ãã§ã«äœ¿çšããŠããå Žåã¯DragDropContext
çŽæ¥äœ¿çšããããã«æ瀺ã§ããŸãã
ããïŒ ããã¯ã©ãïŒ ããã¯éãèŠããŸããïŒ
// in main component file
module.exports = {
WithContext: DragDropContext(HTML5Backend)(ReactTags),
WithOutContext: ReactTags
};
䜿çšæ³ã¯æ¬¡ã®ããã«ãªããŸã
var ReactTags = require('react-tags').WithContext; // if your app doesn't use react-dnd
var ReactTags = require('react-tags').WithOutContext; // if your app already uses react-dnd.
å<ReactTags>
ã¯ããã¯ãšã³ãã®ç¬èªã®ã³ããŒãååŸãããããã®ããã¯ãšã³ãã¯åãã°ããŒãã«ãŠã£ã³ããŠã€ãã³ããåŠçãããããäžèšã§è²Œãä»ããäžå€ãšã©ãŒãçºçãããããããã¯æ©èœããªããšæããŸãã
ç§ãããŸããããšæãã®ã¯ãæåã§dragDropManager
äœæãïŒ DragDropContext
ãå
éšã§è¡ãã®ãšåãããã«ïŒããã¹ãŠã®ReactTag
ã€ã³ã¹ã¿ã³ã¹ã«åãã€ã³ã¹ã¿ã³ã¹ã䜿çšã§ããããšã§ãã context
å®çŸ©ããããããŒãžã£ãŒã
ç§ã¯ããªãã®ã©ã€ãã©ãªãããã®ãããªãã®ããšã¯ã¹ããŒãããããšãæå³ããŸãïŒ
let defaultManager;
function getDefaultManager() {
if (!defaultManager) {
defaultManager = new DragDropManager(HTML5Backend);
}
return defaultManager;
}
class ReactTagContext {
static contextTypes = {
dragDropManager: PropTypes.object.isRequired
};
static childContextTypes = {
dragDropManager: PropTypes.object.isRequired
};
getChildContext() {
return {
dragDropManager: this.context.dragDropManager || getDefaultManager()
};
}
render() {
return <ReactTag {...props} />
}
}
ã©ããããããšãããã³ïŒ ãããè©ŠããŠãæãè¿ããé£çµ¡ããŸãã ã³ãŒããå ±æããŠããã ãããããšãããããŸãïŒgrinningïŒ
åé¡ãããŸããããã®ããã«è¡ãå Žåã¯ã ReactTags
çŽæ¥ãšã¯ã¹ããŒãããã®ã§
ã ãããã³ïŒ ããã®äžäœã®ããã«ãç§ã¯äžèšã®è€æ°ã®ãšã¯ã¹ããŒããœãªã¥ãŒã·ã§ã³ãè©ŠããŠããŸãã-
// in main component file
module.exports = {
WithContext: DragDropContext(HTML5Backend)(ReactTags),
WithOutContext: ReactTags
};
ç§ã®ä»ã®ã¢ããªã§ã¯ãã³ã³ããã¹ããªãã§ã³ã³ããŒãã³ããã€ã³ããŒãããããšãéåžžã«å¬ããæããŸããæ£åžžã«åäœããŠããããã§ãã
ããã¯ããããŒãªè§£æ±ºçã ãšæããŸããïŒç§ã¯ããªããææ¡ããããšãé²ããå¿ èŠããããŸããããããšãããããã®ãŸãŸã«ããå¿ èŠããããŸããïŒ
@ prakhar1989ããã¯ãããŒãžäžã®è€æ°ã®<Tags />
ã§æ©èœããŸããïŒ
ããªãã¯ããã«ã¡ãã£ãšç§ãæã£ãŠããŸããïŒ ïŒstuck_out_tongueïŒ
ãããããããšã«ããã¯åäœããŸãïŒ
ããŒãããããªã倧äžå€«ãããããŸãã;-)ã ãã®ã¢ãããŒãã§åé¡ãçºçããå Žåã¯ãç¥ãããã ããã
ããŸãããïŒ ãã€ããäžè©±ã«ãªã£ãŠãããŸãã
PSïŒ WithContext
ãšWithoutContext
ããè¯ãåœåã®ã¢ã€ãã¢ã¯ãããŸããïŒ
@ prakhar1989ããããã WithContext
ããŒãžã§ã³ãçŽæ¥ãšã¯ã¹ããŒãããéçãã£ãŒã«ããšããŠNoContext
ãé
眮ããŸãã
ç§ã¯åæ§ã®åé¡ã«çŽé¢ããŠããŸãããåå©çšå¯èœãªã³ã³ããŒãã³ãã®äœæãéåžžã«å°é£ã«ãªã£ãŠããããããããããã®å¶éãååšããçç±ãããããç解ããããšæããŸãã çŸç¶ã§ã¯ãreact-dndã䜿çšããåã³ã³ããŒãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³ã«ååšããå¯èœæ§ã®ããããŸããŸãªã³ã³ããã¹ããèªèããããã«å¿ããŠåŠçããå¿ èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®æ®ãã®éšåã§ä»ã«äœãèµ·ãã£ãŠãããã«é¢ä¿ãªããåã³ã³ããŒãã³ããç¬èªã®ãã©ãã°åäœ/ã³ã³ããã¹ãã管çã§ããããšãæãŸããã§ãããã
ããšãã°ãããã€ãã®ãã¡ã€ã«ã¢ããããŒãã³ã³ããŒãã³ãã䞊ã¹æ¿ãå¯èœãªã¡ãã¥ãŒããã©ãã°å¯èœãªèŠçŽ ãåããã²ãŒã ãå«ãã¢ããªã±ãŒã·ã§ã³ç»é¢ãå¿ èŠãªå ŽåããããŸãã ãããã®ã³ã³ããŒãã³ãã¯ããããããã©ãã°ã€ãã³ããåŠçããæ¹æ³ã倧ããç°ãªããå®éã«ã¯ç¬èªã®ã³ã³ããã¹ããæ åœããå¿ èŠããããŸãã
ç§ã®æåã®è³ªåã¯ããªããããHTML5Backendã³ãŒãå ã§åçŽã«å®è¡ããªãã®ã§ããïŒ
setup() {
...
// Events already setup - do nothing
if (this.constuctor.isSetUp) return;
// Don't throw an error, just return above.
//invariant(!this.constructor.isSetUp, 'Cannot have two HTML5 backends at the same time.');
this.constructor.isSetUp = true;
...
}
HTML5Backendã³ãŒãå ã§ãããåçŽã«å®è¡ããªãã®ã¯ãªãã§ãã
ããã¯çŽ æŽããããã€ã³ãã§ãã ã³ã³ããŒãã³ããè€æ°ã®ããã¯ãšã³ããæ€åºã§ããå Žåãã¹ã³ãŒãå ã®æ¢åã®ããã¯ãšã³ãã«ãã©ãŒã«ããã¯ããããžãã¯ãçŽæ¥æã€ããšã¯ã§ããŸãããïŒ
ããã«ã¡ã¯@ gaearon-ç§ã®å Žåãé€ããŠãç§ããã®åé¡ã«DragDropContext
ã§ã©ããããŠããããããã®ãšã©ãŒãçºçããŸãã äžèšã®ã¹ã¬ããã«åŸã£ãŠã¿ãŸããããããŒãžäžã®ä»ã®ãã¹ãŠãReactã«å€æããã«ããããã®åå¥ã®Reactã³ã³ããŒãã³ããã³ã³ããã¹ããå
±æããããã«äœãã§ããããå®å
šã«ã¯ããããŸããïŒçæ³çã§ã¯ãããŸããïŒã ç§ã¯ES6æ§æã«å°ã粟éããŠããŸããããŸã ES5ã䜿çšããŠãããããžã§ã¯ãã«åãçµãã§ããŸãã äžããå
±æDragDropManager
æŠå¿µãé©çšããæ¹æ³ã¯ãããŸããïŒ ãããŸã§è©ŠããŸãããã dnd-core
ããã DragDropManager
ã¢ã¯ã»ã¹ã§ããªãããã§ãã
ããªãã®å©ããšãã®çŽ æŽãããã©ã€ãã©ãªã«æè¬ããŸãïŒ
PSãããéèŠãªå Žåãç§ã¯ngReactã䜿çšããŠããŸãã
@ prakhar1989 @globexdesigns @gaearon
è€æ°ã䜿çšãããŠããå ŽåããªãHTML5ããã¯ãšã³ããããã¯ãšã³ããåå©çšã§ããªãã®ãåãããšãçåã«æã£ãŠããŸããïŒ ä»¥åã®ã³ã¡ã³ãã«ãããšãè§åºŠã®ããããŒãžå ã«è€æ°ã®åå¿é åããããçžäºã«DnDã§ããå¿ èŠããããããã§å£ã«ã¶ã€ãã£ãŠãããããããã¯å®éã«react-dndã䜿çšã§ããªãããŠããŸãã
誰ããããã«å¯Ÿããç°¡åãªä¿®æ£ããããŸããïŒ ç§ã¯èªåã®éçºã§è¡ãè©°ãŸã£ãŠããŸãã
@abobwhiteãããç§ãããã_解決ãã_æ¹æ³ã§ãã ããã¯ééããªãçŽ æŽããã解決çã§ã¯ãããŸããããä»ã®ãšããããŸãããããã§ãã
ã圹ã«ç«ãŠãã°ã
ããããšãã @ prakhar1989 ïŒ ãããã1ã€ãã³ã³ããã¹ãã§ã©ããããããã1ã€ãåé¡ã解決ããªãè€æ°ã®ãšã¯ã¹ããŒãã®æ¹æ³ããã©ããŒããŠããŸããã ç§ã®åé¡ã¯ãreact-dndã䜿çšããŠå¥ã®ã¢ããªã±ãŒã·ã§ã³ã«åã蟌ãŸããå¯èœæ§ã¯ãªããdnd察å¿é åå
šäœïŒããã€ãã®reactããã³è§åºŠã³ã³ããŒãã³ã/ãã£ã¬ã¯ãã£ããå«ãïŒãreactã§ã©ããã§ããªããããã³ã³ããã¹ãããããã ãã«ã©ããããããšããŠããŸããDnDããµããŒãããç§ã®ããŒãžã®reactã³ã³ããŒãã³ã...äžãã@gaearonã®ã¢ãããŒããè©ŠããŠã¿ããã®ã§ãããæ°ãããã®ãäœæããããã«DragDropManager
ã«ã¢ã¯ã»ã¹ã§ããŸãã...
ç§ã¯ãŸã£ããåãåé¡ãæ±ããŠããŸãã ããã«ããã³ã³ããŒãã³ãã®åå©çšæ§ãäœäžãããšãã@abobwhiteã«åŒ·ãåæããŸãã
ãã®ã¹ã¬ããã¯ãããã¥ã¡ã³ããæšå¥šããããã«ãã³ã³ããŒãã³ãéå±€ã®äžäœã«HTML5Backend
ãšDragDropContext
移åããããšã§ãäžå€ã®åé¡ã解決ããããšã«ã€ãªãããŸããã
ããã¯å¥åŠãªåé¡ã§ãã ãã¹ãããã䞊ã¹æ¿ãå¯èœãªã³ã³ããŒãã³ãã«åãçµãã§ããã芪ã³ã³ããŒãã³ãå ã«DragDropContextããã¹ããããŠããŸãã ã¹ã¿ã³ãã¢ãã³ã§åäœããŠããããã§ãïŒãã ããDragDropContextã¯ãã¹ããããŠããŸãïŒã
ããããDragDropContextãéå±€ã®äžã§åæåãããŠããå¥ã®ãããžã§ã¯ãå ã§ãã®ã³ã³ããŒãã³ãã䜿çšãããšããã®ãšã©ãŒãçºçããŸãã
äœæ¥äžã®ã¢ããªã±ãŒã·ã§ã³ã§ãã®åé¡ãçºçããŸããã ç§ã¯ãã¹ãŠã®ã³ã³ããŒãã³ããå®å
šã«å¶åŸ¡ã§ããã®ã§ã @DragDropContext(HTMLBackend)
ã䜿çšãã代ããã«ããã®ã³ã¡ã³ãã®@gaearonã³ãŒãã«éåžžã«è¿ããã®ã䜿çšããŠãå
±æãã©ãã°ãæäŸããdecorator
ãäœæããããšã«ãªããŸãããããããã³ã³ããã¹ãã ããã¯æ¬åœã«ããŸããããŸãã
åãããšãèµ·ãã£ãã®ã§ãããåé¡ã¯ã @DragDropContext(HTMLBackend)
ã䜿çšããComponentAãšã @DragDropContext(HTMLBackend)
ã䜿çšããComponentBãããããš
ComponentBãComponentAã«ã€ã³ããŒããããããããšã©ãŒãçºçããŸããã ç§ãããªããã°ãªããªãã£ãã®ã¯ãComponentBããDragDropContextãåé€ããããšã ãã§ãããã¯æ©èœããŸããã
ã¢ããªã«DrapDropContext
ã2ã€ãããããããã芪åã§ã¯ãªãå Žåã¯ã©ããªããŸããïŒ
ç§ã®å ŽåïŒ
2çªç®ã®ã³ã³ããŒãã³ããæåã®dndã³ã³ããŒãã³ã/ã³ã³ããã¹ãã®åã§ã¯ãªããããchildContextã確èªã§ããŸãã
ç§ã®åé¡ã解決ããããã«ãç§ã¯ãã®ã³ãŒãã§ã·ã³ã°ã«ãã³ãå®è¡ããŸããïŒ
import { DragDropManager } from 'dnd-core';
import HTML5Backend from 'react-dnd-html5-backend';
let defaultManager;
/**
* This is singleton used to initialize only once dnd in our app.
* If you initialized dnd and then try to initialize another dnd
* context the app will break.
* Here is more info: https://github.com/gaearon/react-dnd/issues/186
*
* The solution is to call Dnd context from this singleton this way
* all dnd contexts in the app are the same.
*/
export default function getDndContext() {
if (defaultManager) return defaultManager;
defaultManager = new DragDropManager(HTML5Backend);
return defaultManager;
}
ãããŠã DragDropContext(HTML5Backend)
ãæã€åãæã€ãã¹ãŠã®ã³ã³ããŒãã³ãã§ããããã®åãããããåé€ãããã®èŠªã§ãããè¡ããŸãã
import getDndContext from 'lib/dnd-global-context';
const ParentComponent = React.createClass({
childContextTypes: {
dragDropManager: React.PropTypes.object.isRequired,
},
getChildContext() {
return {
dragDropManager: getDndContext(),
};
},
render() {
return (<ChildComponentWithDndContext />);
},
éèŠãªã®ã¯ã dnd
ã³ã³ããã¹ããäžåºŠã ãåæåããããšã ãšæããŸãã ã©ãæããŸããïŒ
@andresgutgonããããšãã ããã¯ç§ã«ãšã£ãŠãããŸããããŸã
@andresgutgonã®ãœãªã¥ãŒã·ã§ã³ã¯çŽ æŽãããã§ããã DrapDropContext
ãcomponentWillUnmount
DragDropManager
ãç Žå£ããªãã®ã¯å¥åŠã§ããã€ãŸãã2ã€ã®DrapDropContext
䜿çšããªãå Žåã§ããåæã«ããããããã2ã€ã®ç°ãªãããŒãžã§-ããªãã¯ãŸã ãããã䜿çšããããšã¯ã§ããŸããã ç§ã®å Žåã¯ããªãã®ããã¯ãè©ŠããŠã¿ãã€ããã§ããããã®ãããªäºçŽ°ãªç¶æ³ã§ããã¯ãããããšãã100ïŒ
å¥åŠã§ãã
ãŸããä»»æã®ã¢ã€ãã¢ã¯ããªã2æã€DragDropManager
ã§ããäœãæªã/ééã£ãreact-dnd
ïŒ
å°ãã¯ãªãŒã³ãªãã1ã€ã®ã¢ãããŒãã¯ãç¹å®ã®ããã¯ãšã³ãã®ãã³ã¬ãŒã¿ãçæããã¢ãžã¥ãŒã«ãäœæããå¿ èŠã«å¿ããŠãã³ã¬ãŒã¿ã䜿çšããããšã§ãã
import {DragDropContext} from 'react-dnd';
import HTML5Backend from 'react-dnd-html5-backend';
export default DragDropContext(HTML5Backend);
import { Component } from 'react';
import withDragDropContext from '../lib/withDnDContext';
class MyComponent extends Component {
render() {
return (
<div>
// other children
</div>
);
}
export default withDragDropContext(MyComponent);
ããã«ã¡ã¯ãDragDropContextã§ã©ãããããã³ã³ããŒãã³ããšãDragDropContextã䜿çšããå¥ã®ã³ã³ããŒãã³ããããå Žåã«è§£æ±ºããæ¹æ³ãç¥ã£ãŠãã人ã¯ããŸããïŒèŠªåã§ã¯ãªããé£ãåã£ãŠããŸã...ãã¡ããã芧ãã ããhttps://github.com/martinnov92/TSCalendar ïŒäœæ¥äžã§ã-å°ãé¢åã§ãïŒDïŒããããšãããããŸã
ç§ã¯ãreact-dndã䜿çšããŠããreact-mosaicã¿ã€ãªã³ã°ãŠã£ã³ããŠãããŒãžã£ãŒãšãreact-dndã䜿çšããŠããèªåã®ã³ã³ããŒãã³ãã䜿çšããŠããŸã£ããåãåé¡ããããšæããŸãã
ãããã£ãŠãããã¯react-dndã§çŽæ¥è§£æ±ºãããªããšæšæž¬ããŠããŸãããé©çšã§ããåé¿çãããã€ããããŸãã
ãã®åé¡ãä¿®æ£ããå®å šã«æ©èœããã³ãŒãã®äŸã¯ãããŸããïŒ
@gcorneã®ãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸã
ããã«ã¡ã¯ç§ã¯åãåé¡ãæ±ããŠããŸãããreact-data-gridã䜿çšããŠreact-big-calendarãè¿œå ããããšããŠããŸã
react-big-calendarãå«ãã³ã³ããŒãã³ããè¿œå ããåŸãããã£ãããããªããšã©ãŒïŒ2ã€ã®HTML5ããã¯ãšã³ããåæã«æã€ããšã¯ã§ããŸããããšãããšã©ãŒãçºçããŸãã
react-big-calendarã¯react-dndãšreact-dnd-html5-backendã䜿çšããŠãã®åé¡ã解決ããæ¹æ³ãæããŠãã ããã
ããã«ã¡ã¯@szopenkrkãããè©ŠããŸãããhttps://github.com/react-dnd/react-dnd/issues/186#issuecomment-232382782 ïŒ
ããããDndããã¯ãšã³ããåãå
¥ããã«ã¯react-big-calendarã«ãã«ãªã¯ãšã¹ããè¡ãå¿
èŠããããšæããŸã
ããããå°ãé ãããŸãããç§ã¯äŒŒãŠãããå°ãç°ãªã解決çãèãåºããŸããã é«æ¬¡ã®ã³ã³ããŒãã³ããå®è£ ããããããã¹ãŠã®DragDropContext察å¿ã³ã³ããŒãã³ãã§äœ¿çšããŸããã
ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãïŒTypeScriptïŒïŒ
import * as React from 'react';
import {DragDropContext} from 'react-dnd';
import HTML5Backend from 'react-dnd-html5-backend';
// context singleton
let context: Function;
export function withDragDropContext<P>(
Component: React.ComponentClass<P> | React.StatelessComponent<P>,
): React.ComponentClass<P> {
// ensure a singleton instance of the context exists
if (!context) {
context = DragDropContext<P>(HTML5Backend);
}
return context(Component);
}
ãããŠãã³ã³ããŒãã³ãã§æ¬¡ã®ããã«äœ¿çšããŸãã
import * as React from 'react';
import {withDragDropContext} from 'components/WithDragDropContext';
class MyClass extends React.Component<IMyClassProps, {}> {
// ...
}
export default withDragDropContext<IMyClassProps>(MyClass);
NB
ç§ã¯ãŸã è©ŠããŠããŸãããã宣èšäžã«ã³ã³ããã¹ãå€æ°ãèšå®ã§ããã¯ãã§ãã
const context = DragDropContext(HTML5Backend);
次ã«ã if (!context) {...
éšåãã¹ãããããŸãã
@codeaidããããšãããããŸãïŒ
@andresgutgonãšåãç¶æ³ã«
ãªã@ guang2013ã§ããã®è§£æ±ºçã®ã©ããæ©èœããªãã£ãã®ã§ããïŒ
ãããããŸã 解決çã¯ãããŸãããã«ãŒããbigCalendarã«ãã©ãã°ããããšããŸãããã«ãŒããdragSourceãšããŠãcardsListãDragAndDropContextãšããŠãã«ã¬ã³ããŒãå¥ã®DragAndDropContextãšããŠäœæããŸããããã®åŸã2ã€ã®html5backendãšã©ãŒãã¹ããŒãããŸãããããã§æäŸãããŠããæ¹æ³ã䜿çšããŸããã誰ãç§ã®åé¡ã解決ã§ããŸããã @andresgutgon ããªã³ã©ã€ã³ã®ãšãã¯ãããã«ã€ããŠçŽæ¥è©±ããŠãããã§ããïŒ å€§å€æè¬ããããŸãã
@ guang2013 react-dndã®DragDropContextã«äŸåããã©ã€ãã©ãªã䜿çšããŠããå Žåãã©ã€ãã©ãªã¯çµ±åãããdndContextã䜿çšããªãããããã®ææ³ã¯æ©èœããŸããã react-sortable-treeã®ãããªäžéšã®ã©ã€ãã©ãªã§ã¯ãã³ã³ããã¹ããªãã§ã³ã³ããŒãã³ãã䜿çšã§ãããããèªåã§ã©ããããããšãã§ããŸãã
@gcorneã®ãœãªã¥ãŒã·ã§ã³ã¯ãreact-hot-loaderãåããã¢ããªã§react-dndã䜿çšã§ããããã«ããããã«æ©èœããŸããã ããã§ããç®±ããåºããŠããã«æ©èœããªãã£ãã®ã«ã¯å°ãé©ããŠããŸãã
å€ãåé¡ã§ãããä»ã®èª°ããGoogleããããã«ãã©ãçããå ŽåïŒ
ç§ã®ããŒãžã«ã¯DNDãããã€ããŒã1ã€ãããªããDNDãæã€ä»ã®ã©ã€ãã©ãªãçµ±åããŠããŸããã§ããããããã§ããã®ãšã©ãŒãçºçããŸããã
ç§ã®åé¡ã¯ãDragDropContextProviderãReactRouterã®BrowserRouterèŠçŽ å ã«ããããšã§ãããããã«ããããã¹ãŠã®ããã²ãŒã·ã§ã³ã§HTML5Backendãåæ§ç¯ãããå€ãããŒãžïŒããã²ãŒããããããŒãžïŒãšæ°ããããŒãžïŒããã²ãŒããããããŒãžïŒã®äž¡æ¹ã«DNDèŠçŽ ãå«ãŸããŠããŸãããäžèšã®ãšã©ãŒãçºçããŸãã
解決çã¯ãDragDropContextProviderãBrowserRouterãã移åããããšã§ããã
ããã¯ãReactDnDãåããŠè©Šãããã¥ãŒããªã¢ã«ã«åŸã£ãŠã64å¹³æ¹ã®ãã§ã¹ç€ã«ãªã£ãŠããŸã£ã人éã®ããã®ãã®ã§ãã
奜ããªããã«éšå£«ãåŒãããåãããšãã§ããŸããã
åé¡ã¯ã BoardSquare
ããããã«ããããããããšãããšãã«ã2HTML5ããã¯ãšã³ãã®åé¡ã§ã¹ããŒãããããš
ä»ã®äººã以åã«ã³ã¡ã³ãã§è¿°ã¹ãããã«ã DragDropContextProvider
ã¬ã³ããªã³ã°ãã¢ããªã®åã¬ã³ããªã³ã°ãµã€ã¯ã«ã®å€ã«ç§»åããŸãã
ã®ããã«ã observe
é¢æ°ãžã®ã³ãŒã«ããã¯ãšããŠReactDOM.render
ãçŽæ¥å®è¡ããªãã§ãã ããã
代ããã«ãããè¡ããŸãïŒ
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { DragDropContextProvider } from 'react-dnd';
import HTML5Backend from 'react-dnd-html5-backend';
import './index.css';
import App from './App';
ReactDOM.render(
<DragDropContextProvider backend={HTML5Backend}>
<App />
</DragDropContextProvider>,
document.getElementById('root')
)
App.js
import React, { Component } from 'react';
import Board from './Board';
import { observe } from './Game';
class App extends Component {
state = {
knightPosition: [0, 0]
}
componentDidMount = () => {
observe(knightPosition => {
this.setState(prevState => ({
...prevState,
knightPosition
}));
});
}
render() {
return (
<div className="App">
<Board knightPosition={this.state.knightPosition} />
</div>
);
}
}
export default App;
ããã¯ãã®åé¡ã«é¢é£ããŠãããšæããŸã
https://github.com/prakhar1989/react-tags/issues/497
@gaearonããã¯å€ãããšã¯ç¥ã£ãŠããŸãããäŸã§å®éã«DragDropManager
ãååŸããã«ã¯ã©ãããã°ããã§ããïŒ ã©ãã«ããšã¯ã¹ããŒããããŸããã
defaultManager = new DragDropManager(HTML5Backend);
ç§ã®åé¡ã¯ããµãŒãããŒãã£ã®APIãä»ããŠããŒãžã«ããã€ãã®ãŠã£ãžã§ãããã¬ã³ããªã³ã°ããŠããŠãå®éã®ãŠã£ãžã§ãããããDragDropContextProvider
移åã§ããªãããšã§ãã
å€ããã«ããåé€ããããšã§ãã®åé¡ã解決ããŸããã
distãã©ã«ããŒãåé€ããããindex.htmlãç·šéããã ãã§ãã æ£ç¢ºãªåé¡ã¯ããããŸããããããã§ããŸããããŸãã
幞ãã @ gcorne ïŒhttps://github.com/react-dnd/react-dnd/issues/186#issuecomment-282789420ïŒã®ïŒé ãããïŒçããèŠã€ããããšãã§ããŸããã ããªãããŒã ãšæãããŠããç§ã®åé¡ãç¬æã«è§£æ±ºããŸããã
@ prakhar1989ããã¯æ¬åœã®ããŒãã£ãŒã®çãã§ãããã©ãããããã匷調衚瀺ããå¿
èŠããããšæããŠããã®ã§ããã°ã®èª¬æã«ãªã³ã¯ããŠãã ããã
ç§ãç解ãã解決çã¯ãç§ã«ãšã£ãŠã¯ããŸããããHTML5ãŸãã¯Touchããã¯ãšã³ãã®ããããã䜿çšã§ããããã«ãããã®ã§ãã
ã·ã³ã°ã«ãã³HOCã³ã³ããŒãã³ããäœæããŸãã
import {DragDropContext} from "react-dnd";
import HTML5Backend from "react-dnd-html5-backend";
import TouchBackend from "react-dnd-touch-backend";
const DragAndDropHOC = props => {
return <React.Fragment>
{props.children}
</React.Fragment>
};
export default {
HTML5: DragDropContext(HTML5Backend)(DragAndDropHOC),
Touch: DragDropContext(TouchBackend)(DragAndDropHOC),
}
次ã«ããããã€ããŒã³ã³ããŒãã³ãïŒ
const DragDrop = props => {
if (props.isTouch) {
return <DragDropContext.Touch>{props.children}</DragDropContext.Touch>
} else {
return <DragDropContext.HTML5>{props.children}</DragDropContext.HTML5>
}
};
ãããŠãå¿
èŠãªå Žæã§<DragDrop isTouch={props.isTouch} />
䜿çšããŸãã
åãåé¡ã«ééããéçºè ã®ããã«ããã®HOCãœãªã¥ãŒã·ã§ã³ãèŠãããšãã§ããŸã
ç§ã¯ä»ãJestãã¹ãã§ãã®åé¡ã«çŽé¢ããŠããŸãã HTML5-ããã¯ãšã³ãã¯ãJestãã¹ãå šäœã§ã·ã³ã°ã«ãã³ã®ããã«æ±ãããŸãïŒãããåé¡ãçºçããŠããçç±ã§ã...ç§ã¯æããŸãïŒ
SOã®è©³çŽ°ãªåé¡ïŒ
ããã¯ã®äœ¿çš
import { createDndContext } from "react-dnd";
import HTML5Backend from "react-dnd-html5-backend";
const manager = useRef(createDndContext(HTML5Backend));
return (
<DndProvider manager={manager.current.dragDropManager}>
....
</DndProvider>
)
ããã¯ã䜿çšããããè¯ã解決çïŒ@jchondeã«æè¬ïŒïŒ
import { DndProvider, createDndContext } from "react-dnd";
import HTML5Backend from "react-dnd-html5-backend";
import React, { useRef } from "react";
const RNDContext = createDndContext(HTML5Backend);
function useDNDProviderElement(props) {
const manager = useRef(RNDContext);
if (!props.children) return null;
return <DndProvider manager={manager.current.dragDropManager}>{props.children}</DndProvider>;
}
export default function DragAndDrop(props) {
const DNDElement = useDNDProviderElement(props);
return <React.Fragment>{DNDElement}</React.Fragment>;
}
ãããã£ãŠãä»ã®å Žæã§äœ¿çšã§ããŸãã
import DragAndDrop from "../some/path/DragAndDrop";
export default function MyComp(props){
return <DragAndDrop>....<DragAndDrop/>
}
ç§ã®è§£æ±ºçïŒ
åã³ã³ããŒãã³ããreact-dnd
çŽæ¥ã€ã³ããŒãããªãããã«ããŸãã
DragDropContext
ãšHTML5Backend
ã芪ããåã³ã³ããŒãã³ãã«æž¡ããŸãã
DragDropContextProviderã¿ã°ã«äžæã®ããŒãè¿œå ãããšãåé¡<DragDropContextProvider backendïŒ{HTML5Backend} keyïŒ{Math. random()}></DragDropContextProvider>
ã¿ã€ãã¹ã¯ãªããã§ã¯ã以äžã®ã³ã³ããŒãã³ããäœæããŸããã ïŒ @jchonde @ttessaroloã«æè¬ããŸãïŒ
import { DndProvider, createDndContext } from 'react-dnd';
import HTML5Backend from 'react-dnd-html5-backend';
import React, { PropsWithChildren, useRef } from 'react';
const RNDContext = createDndContext(HTML5Backend);
function DragAndDrop({ children }: PropsWithChildren<{}>): JSX.Element {
const manager = useRef(RNDContext);
return <DndProvider manager={manager.current.dragDropManager}>{children}</DndProvider>;
}
export default DragAndDrop;
ãããŠããã®ãããªã³ã³ããŒãã³ãã䜿çšããŸãã
function SomeComponent(): JSX.Element {
return (
<DragAndDrop>
...
</DragAndDrop>
);
}
DragDropContextProviderã¿ã°ã«äžæã®ããŒãè¿œå ãããšãåé¡
<DragDropContextProvider backendïŒ{HTML5Backend} keyïŒ{Math. random()}></DragDropContextProvider>
ãããã£ãïŒ
æãåèã«ãªãã³ã¡ã³ã
å°ãã¯ãªãŒã³ãªãã1ã€ã®ã¢ãããŒãã¯ãç¹å®ã®ããã¯ãšã³ãã®ãã³ã¬ãŒã¿ãçæããã¢ãžã¥ãŒã«ãäœæããå¿ èŠã«å¿ããŠãã³ã¬ãŒã¿ã䜿çšããããšã§ãã
lib / withDragDropContext.js
components / MyComponent.js