ΠΠ΄ΡΠ°Π²ΡΡΠ²ΡΠΉ. Π― ΠΏΡΡΠ°Π»ΡΡ Π½Π°ΠΉΡΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΎΠ± ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠ΅, Π½ΠΎ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π±ΡΠ»ΠΎ Π½ΠΈ Π·Π΄Π΅ΡΡ, Π½ΠΈ Π² ΡΠ΅ΡΠΈ.
Π― Π½Π°ΡΠ°Π» ΠΏΡΠΎΠ΅ΠΊΡ, ΠΈ Ρ ΠΌΠ΅Π½Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°, ΠΈ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ°:
http://prntscr.com/jpfale
ΠΡΠΎ ΠΌΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ:
import React from 'react';
import PropTypes from 'prop-types';
import styled from 'styled-components';
import { DragSource } from 'react-dnd';
const Container = styled.span`
margin: 10px;
font-size: 4rem;
text-transform: uppercase;
cursor: pointer;
transition: 0.4s;
&.is-clicked {
color: ${({ theme }) => theme.colors.purple};
}
&.is-hidden {
opacity: 0;
}
`;
const spec = {
beginDrag(props) {
console.log('test');
return {};
},
};
const WordItem = ({
children,
item,
isHidden,
handleClick,
connectDragSource,
}) => {
return connectDragSource(
<span>
<Container
className={item.clicked ? 'is-clicked' : isHidden}
onClick={handleClick}
>
{children}
</Container>
</span>,
);
};
WordItem.propTypes = {
children: PropTypes.string.isRequired,
item: PropTypes.objectOf(PropTypes.any).isRequired,
isHidden: PropTypes.string.isRequired,
handleClick: PropTypes.func.isRequired,
};
export default DragSource('word', spec, (connect, monitor) => ({
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging(),
dropResult: monitor.getDropResult(),
canDrag: monitor.canDrag(),
}))(WordItem);
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ:
export default DragDropContext(HTML5Backend)(App);
Π― ΡΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π» ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ react-dnd, Π½ΠΎ Π²ΠΏΠ΅ΡΠ²ΡΠ΅ Π²ΠΈΠΆΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠΎΡ ΠΌΠΎΠΉ package.json, Π΅ΡΠ»ΠΈ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ²ΡΠ·Π°Π½Π° Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ:
{
"name": "",
"version": "1.0.0",
"description": "npm i -g prettier",
"main": "index.js",
"scripts": {
"clean": "rimraf dist",
"dev": "cross-env NODE_ENV=development node devServer.js",
"build": "npm run clean && cross-env NODE_ENV=production webpack --config=webpack.build.config.js -p && node productionServer.js",
"flow": "flow"
},
"author": "",
"license": "ISC",
"browserslist": [
"last 5 versions",
"not ie < 11"
],
"prettier": {
"singleQuote": true,
"trailingComma": "all"
},
"dependencies": {
"axios": "^0.18.0",
"babel-plugin-styled-components": "^1.5.1",
"es6-promise": "^4.2.4",
"prop-types": "^15.6.1",
"rc-slider": "^8.6.1",
"react": "^16.3.2",
"react-dnd": "^3.0.2",
"react-dnd-html5-backend": "^3.0.2",
"react-dom": "^16.3.2",
"react-motion": "^0.5.2",
"react-redux": "^5.0.7",
"react-router-dom": "^4.2.2",
"redux": "^4.0.0",
"redux-thunk": "^2.2.0",
"styled-components": "^3.2.6",
"svg-inline-loader": "^0.8.0",
"xml2js": "^0.4.19"
},
"devDependencies": {
"autoprefixer": "^8.3.0",
"babel-core": "^6.26.0",
"babel-eslint": "^8.2.3",
"babel-loader": "^7.1.4",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.6.1",
"babel-preset-flow": "^6.23.0",
"babel-preset-react": "^6.24.1",
"browserslist": "^3.2.4",
"compression-webpack-plugin": "^1.1.11",
"cross-env": "^5.1.4",
"css-loader": "^0.28.11",
"eslint": "^4.19.1",
"eslint-config-airbnb": "^16.1.0",
"eslint-config-prettier": "^2.9.0",
"eslint-plugin-import": "^2.11.0",
"eslint-plugin-jsx-a11y": "^6.0.3",
"eslint-plugin-prettier": "^2.6.0",
"eslint-plugin-react": "^7.7.0",
"express": "^4.16.3",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"file-loader": "^1.1.11",
"flow-bin": "^0.70.0",
"html-webpack-plugin": "^3.2.0",
"image-webpack-loader": "^4.2.0",
"node-sass": "^4.8.3",
"postcss-loader": "^2.1.4",
"prettier-eslint": "^8.8.1",
"react-hot-loader": "^4.0.0",
"rimraf": "^2.6.2",
"sass-loader": "^7.0.1",
"style-loader": "^0.20.3",
"url-loader": "^1.0.1",
"webpack": "^4.6.0",
"webpack-cli": "^2.1.2",
"webpack-dev-middleware": "^3.1.2",
"webpack-hot-middleware": "^2.22.1"
}
}
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠΎΠΌΠΎΠ³ΠΈΡΠ΅ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Π― ΡΠΎΠΆΠ΅ Π²ΠΈΠΆΡ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ. ΠΠΎΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ°Ρ ΠΏΠ΅ΡΠΎΡΠ½ΠΈΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
https://codesandbox.io/s/5wm42wv5ol
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π²Ρ ΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΈΡΡ ΠΊΠ°ΡΡΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΎΠΏΠΈΡΠ°Π½Π½Π°Ρ ΠΠ.
ΠΡΠΈΠ±ΠΊΠ° Π·Π΄Π΅ΡΡ, ΠΏΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ Π±ΡΠ» ΠΏΠΎΠ»ΡΡΠ΅Π½ Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΊΠΎΡΠΎΡΠΊΠΎΠ΅ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ Π±Π΅Π· Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ beginDrag () ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
@ andrew-farries, Π·Π΄Π΅ΡΡ Π΅ΡΡΡ Π΄Π²Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ: ΠΎΠ΄Π½Π° Π½Π° Π½Π°ΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ° Π΄Π°Π΅Ρ ΡΠ±ΠΎΠΉ ΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΈΡ ΠΈΠΌ ΡΠ±ΠΎΡΠΌ.
ΠΡΡΠ³Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π½Π° Π²Π°ΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅ - ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ref
ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° DOM Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ React SFC Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ DragSource, DropTarget ΠΈΠ»ΠΈ DragLayer - ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΊΠ»Π°ΡΡΡ, ΡΠ°ΡΡΠΈΡΡΡΡΠΈΠ΅ React.Component.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
@ andrew-farries, Π·Π΄Π΅ΡΡ Π΅ΡΡΡ Π΄Π²Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ: ΠΎΠ΄Π½Π° Π½Π° Π½Π°ΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ° Π΄Π°Π΅Ρ ΡΠ±ΠΎΠΉ ΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΈΡ ΠΈΠΌ ΡΠ±ΠΎΡΠΌ.
ΠΡΡΠ³Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° Π²Π°ΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅ - ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ
ref
ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° DOM Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ React SFC Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ DragSource, DropTarget ΠΈΠ»ΠΈ DragLayer - ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΊΠ»Π°ΡΡΡ, ΡΠ°ΡΡΠΈΡΡΡΡΠΈΠ΅ React.Component.