This project is a React component compatible with React DnD that can be used to emulate a Drag'n'Drop "ghost" when a Backend system doesn't have one (e.g. react-dnd-touch-backend
).
See the migration section for instructions when switching from 4.x.x
or 6.x.x
.
npm install -S react-dnd-preview
Just include the Preview
component close to the top component of your application (it places itself absolutely).
It is usable in different ways: hook-based, function-based and context-based. All of them receive the same data formatted the same way, an object containing the following properties:
display
: only withusePreview
, boolean indicating if you should render your previewitemType
: the type of the item (monitor.getItemType()
)item
: the item (monitor.getItem()
)style
: an object representing the style (used for positioning), it should be passed to thestyle
property of your preview componentref
: a reference which can be passed to the final component that will usestyle
, it will allowPreview
to position the previewed component correctly (closer to what HTML5 DnD can do)monitor
: the actualDragLayerMonitor
fromreact-dnd
The function needs to return something that React can render (React component, null
, etc).
See also the examples for more information.
import { usePreview } from 'react-dnd-preview'
const MyPreview = () => {
const preview = usePreview({ placement: 'top', padding: {x: -20, y: 0 }})
if (!preview.display) {
return null
}
const {itemType, item, style, ref} = preview;
return <div className="item-list__item" ref={ref} style={style}>{itemType}</div>
}
const App = () => {
return (
<DndProvider backend={MyBackend}>
<ItemList />
<MyPreview />
</DndProvider>
)
}
import { Preview } from 'react-dnd-preview'
const generatePreview = ({itemType, item, style}) => {
return <div className="item-list__item" style={style}>{itemType}</div>
}
class App extends React.Component {
render() {
return (
<DndProvider backend={MyBackend}>
<ItemList />
<Preview generator={generatePreview} />
// or
<Preview>{generatePreview}</Preview>
</DndProvider>
)
}
}
import { Preview, Context } from 'react-dnd-preview'
const MyPreview = () => {
const {itemType, item, style} = useContext(Preview.Component)
return <div className="item-list__item" style={style}>{itemType}</div>
}
const App = () => {
return (
<DndProvider backend={MyBackend}>
<ItemList />
<Preview>
<MyPreview />
// or
<Context.Consumer>
{({itemType, item, style}) => <div className="item-list__item" style={style}>{itemType}</div>}
</Context.Consumer>
</Preview>
</DndProvider>
)
}
Starting with 7.0.0
, react-dnd-preview
doesn't have a default export anymore.
Previously:
import Preview from 'react-dnd-preview'
Now:
import { Preview } from 'react-dnd-preview'
Starting with 5.0.0
, react-dnd-preview
will start passing its arguments packed in one argument, an object {itemType, item, style}
, instead of 3 different arguments (itemType
, item
and style
). This means that will need to change your generator function to receive arguments correctly.
MIT, Copyright (c) 2016-2022 Louis Brunner