์ ๋ ฌ ๊ฐ๋ฅํ ๋ชฉ๋ก๊ณผ ํด๋น ์ ๋ ฌ ๊ฐ๋ฅํ ๋ชฉ๋ก์ผ๋ก ํญ๋ชฉ์ ๋์ด์ค๋ ๋ ๋ค๋ฅธ ๋ชฉ๋ก์ ๊ตฌํํ์ต๋๋ค. ์ฑ์ด ์์๋๋ก ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฒ์์ ์ ๋ ฌ ๊ฐ๋ฅํ ๋ชฉ๋ก์ ์๋ ํญ๋ชฉ์ ์ด๋ํ๋ ค๊ณ ํ๋ฉด ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Uncaught Error: Invariant Violation: Expected to find a valid target
.n @ app.js:50803
t.canDropOnTarget @ app.js:50804
(anonymous function) @ app.js:50804
t.handleTopDragEnter @ app.js:50804
์ฝ๋๊ฐ ์์ ์ ์ผ๋ก ์๋ํ๊ณ ์ถ์๋ ๋ฒ์ dist/ReactDnD.min.js
๋ง ์๊ธฐ ๋๋ฌธ์ ์ด๋์๋ถํฐ ์์ํด์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด๋ค ํํธ๋ผ๋? ์ด ์ค๋ฅ๋ฅผ ์ผ์ผํค๋ ์ผ๋ฐ์ ์ธ ์์ธ์ ๋ฌด์์ ๋๊น?
์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น?
๋ค, ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์ด๋๊ฐ์ ์ฌ๋ ค์ฃผ์ธ์.
๋ํ ๋ง์ ์ฌ์ฉ์๊ฐ NPM์ ๋ฒ์ ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊ทธํ๊ธฐ๊ฐ ๋ ์ฌ์ธ ์ ์๋๋ก ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค.
์ฌ๋ฌ๋ถ์ ์ํด ์์ ๋ฅผ ์ค์ ํ๋ ๋์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. beginDrag
๋ฐํ๋ ๊ฐ์ฒด์ ID๊ฐ ํฌํจ๋์ด ์์ง ์์ต๋๋ค. ์๋ง๋ React์๋ ์ด์ ๋ํ ๋ฌธ์ ๊ฐ ์์๊ณ , ์ด๋ก ์ธํด React-Dnd์์ ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ์ ์์ต๋๋ค.
ํฅ๋ฏธ๋กญ๋ค์. ๊ฐ์ฌํฉ๋๋ค! beginDrag()
๊ฐ ์ผ๋ฐ ๊ฐ์ฒด์ธ ํ ๋ฐํ๋๋ ํญ๋ชฉ์ ๋ํด ์ค์ ๋ก ์ ํ์ ๋์ง ์์ผ๋ฏ๋ก ์ค๋ฅ ํ๋ฆ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค.
์ค๋๋ ์ค๋ ๋์ ์ถ๊ฐํด์ ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ด๊ฒ์ด ์ธํฐ๋ท ์ ์ฒด์์ ์ด ์ค๋ฅ์ ๋ํ ์ ์ผํ ์ฐธ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋๊ตฐ๊ฐ๊ฐ ๋ฏธ๋์ ๋ค์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋์ผํ ์ค๋ฅ๊ฐ ์์์ง๋ง ๋ฌธ์ ๋ _๋ ๋ค_ ๋๋๊ทธ ์ค ๋๋กญ ๋ํผ๋ก ์ฅ์๋ ๊ตฌ์ฑ ์์(์์ ์์ Card์ ์ ์ฌ)๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
simulateBeginDrag
์์๋์์ ๋ _drop target_(๋๋๊ทธ ์์ค ๋์ )์ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ก ๋ณด๋์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ์คํจํ์ต๋๋ค. ํด๊ฒฐ์ฑ
์ ํธ๋ค๋ฌ ID๋ฅผ ๊ฐ์ ธ์ฌ ๋ ํ ์์ค ๊น์ด( getDecoratedComponentInstance()
)์์ต๋๋ค.
@yannisbarlas ํ๋ฅญํ ๋ฐ๊ฒฌ. ๋๋ ๋๊ฐ์ ๋ฌธ์ ์ ๋ถ๋ช์ณค๋ค. ํ ์คํธ ๋ฌธ์ ์์ ์ด์ ๋ํ ์ธ๊ธ์ด ์์ ์ ์์ต๋๊น?
@yannisbarlas ์ฐพ์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋ง์ ์ข์ ์ ํฐ ๋์์ด ๋์์ต๋๋ค :)
๋๊ตฐ๊ฐ๊ฐ์ด ์ค๋ฅ์ ๋ฌธ์ ๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ ๋ ฌ ๊ฐ๋ฅํ ๋ชฉ๋ก์ ์์ฑํ ๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ์์๊ณ ๊ฐ ํญ๋ชฉ์๋ ํด๋น ID์ ๋ชฉ๋ก์ ์์ธ ์ฐ๊ฒฐ๋ก ๊ตฌ์ฑ๋ ํค๊ฐ ์์ต๋๋ค.
๋๋๊ทธ๋๋ ์์์ ๋ํด ์ ์ ํ(์ฆ, ์ผ๊ด๋) ํค๋ฅผ ์ค์ ํ๋ฉด ์์ ์ด ์๋ฃ๋์์ต๋๋ค.
@yannisbarlas ์๋ฃจ์ ์ ์ฝ๋ ์์ ๊ฐ ์์ต๋๊น?
@damiangreen ๋ต๋ณ์ด ๋ฆ์ด ์ฃ์กํฉ๋๋ค. ์๋ฆผ ์ด๋ฉ์ผ์ด ์ ๋ฅผ ์ง๋์ณ ๋ ์๊ฐ์ต๋๋ค.
์ฝ๋๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ง๋ง(์ค๋ ์๊ฐ์ด ์ง๋ฌ์) ์ฌ๊ธฐ์์ ํ์ธํ ์
๋๊ตฐ๊ฐ ์ด ๋ฌธ์ ์์ ๊ณ์ ์คํ๋๋ ๊ฒฝ์ฐ ๋งคํํ๋ ๋ชฉ๋ก์ ์์์ ์๊ตฌ ํค ์ํ์ด ์์ด์ผ ํฉ๋๋ค. ์ ๊ฒฝ์ฐ์๋ ๋ชฉ๋ก์ ํญ๋ชฉ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด Redux ์์ ์ ๋์คํจ์นํ ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ๋งคํ๋ ์์์ ํค๋ฅผ ์ ๊ณตํ์ต๋๋ค.
blocks.map((block, idx) => {
<React.Fragment key={`${block.name}_${idx}`}>
...
<React.Fragment />
})
idx
๊ฐ ์ฆ์์์ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ๋ถ๋ช
ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
@chulanovskyi ๊ฐ์ฌํฉ๋๋ค
๋๋ฅผ ์ํด ๊ทธ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์๋ค :
JSX
arr.map((item, idx) => (
<Item
item={item}
// key={`${idx}_${item.id}`} // this was busted because idx
key={item.key} // when adding this to the array elsewhere i use a count for uniqueness
index={idx}
>
</Item>
))
๋์๊ฒ ์ด ์ค๋ฅ๋ ๋์ ์ผ๋ก ์์ฑ๋ ๋๋กญ ์์ญ์ผ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. ๋ง์ง๋ง ํญ๋ชฉ์ด ๋๋กญ ์์ญ์์ ์ด๋ํ ๋ React๋ ํด๋น ์์ญ ์์ด ๋ค์ ๋ ๋๋ง๋๋ฉฐ ์ด๋ก ์ธํด ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์ ์์ดํ ์์ ํ์๋ ๊ทธ๋ฃน์ธ๋ฐ๋ ์์ดํ ์ ์ฎ๊ธฐ๊ธฐ ์ง์ ์ ์์ญ์ด ์ ๊ฑฐ๋๋ ๊ฒฝํฉ ์ํ์ธ๊ฐ ํ
๋์๊ฒ ์ด ์ค๋ฅ๋ ๋์ ์ผ๋ก ์์ฑ๋ ๋๋กญ ์์ญ์ผ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. ๋ง์ง๋ง ํญ๋ชฉ์ด ๋๋กญ ์์ญ์์ ์ด๋ํ ๋ React๋ ํด๋น ์์ญ ์์ด ๋ค์ ๋ ๋๋ง๋๋ฉฐ ์ด๋ก ์ธํด ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์ ์์ดํ ์์ ํ์๋ ๊ทธ๋ฃน์ธ๋ฐ๋ ์์ดํ ์ ์ฎ๊ธฐ๊ธฐ ์ง์ ์ ์์ญ์ด ์ ๊ฑฐ๋๋ ๊ฒฝํฉ ์ํ์ธ๊ฐ ํ
์๋
ํ์ธ์ @DominicTobias
๋ํ ๋๋กญ ์์ญ์ ๋์ ์ผ๋ก ์์ฑํ์ต๋๋ค.
์ด๋ป๊ฒ ๊ณ ์ณค์ต๋๊น?
@raymond-ong
๋ํ ๋๋กญ ์์ญ์ ๋์ ์ผ๋ก ์์ฑํ์ต๋๋ค.
์ด๋ป๊ฒ ๊ณ ์ณค์ต๋๊น?
์ฆ, ๋ฌธ์ ๋ ์์(์์) ๊ตฌ์ฑ ์์๋ฅผ ๋ค์ ์์ฑํ๋ค๋ ๊ฒ์
๋๋ค.
์ด ๊ฒฝ์ฐ react-dnd๋ id(์์ ์ ๋ด๋ถ id)๋ฅผ ์์ด๋ฒ๋ฆฌ๊ณ ์์
ํ๊ณ ์ค๋ฅ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์ ๊ฒฝ์ฐ์๋ ๋ฆฌ๋์์์ ์ํ๋ฅผ ์
๋ฐ์ดํธํ ๋ ์์ ์ํฐํฐ์ id
๋งค๊ฐ๋ณ์๋ฅผ ์
๋ฐ์ดํธํ์ต๋๋ค(ํ ๋ด์์ ์ด์ ์ด๋ํ๊ณ ์ด์ด ์์น๋ฅผ ๋ณ๊ฒฝํ ๋ ํ ID ์
๋ฐ์ดํธ). updating id functionality
์ ๊ฑฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ธฐ ์์ํฉ๋๋ค.
๋๋ ๋ํ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ๊ฒฝ์ฐ์๋ drop target์ด canDrop์์ false๋ฅผ ๋ฐํํ ๋๋ง ๋ฐ์ํฉ๋๋ค. ๋๊ตฌ๋ ์ง ์ด ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ ๊ฒ์ํ ์ ์์ต๋๊น? ์์ด๋ ๋๋ฝ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ๋๊ตฐ๊ฐ ๋ง์ํ์ จ๋๋ฐ ์์ด๋๋ฅผ ์ด๋์ ๋ฃ์ด์ผ ํ ์ง ๊ฐ์ด ์์ค๋ค์?
๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ๋ฌธ์์์ ์์ ๋ฅผ ์กฐ์ ํ ์ ์์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์์ ์ฃผ์๋ฅผ ๋๋๊ทธ/๋๋กญํ์ฌ ์ฌ๊ธฐ์์ ๋ณผ ์ ์์ต๋๋ค. https://codesandbox.io/s/broken-feather-qf0f2?file= /src/Container.jsx
๋๋ ๋ํ ๋ชจ๋ ์ธ๋ถ ์ฌํญ์ ๋ํ ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค(์๋ง ๋ด๊ฐ ์ฌ๊ธฐ์ ๋ฐฉ๊ธ ๊ฒ์ํ์ด์ผ ํ๋?)
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ต๋๋ค.
๋ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
const ParentOfCards = () => {
const [ cards, setCards ] = useState([ ... ])
const CardComponent = ({ card, index }) => {
return (/**/)
}
return (
<div>
{ cards.map( CardComponent ) }
</div>
)
}
์ด ๋ฃ์ ์ ์์ต๋๋ค ๋น์ ๋ฐํ CardComponent
๋ด๋ถ ParentOfCards
(๋๋-๋ ๋๋ง ๋ค์๋ ํจ๊ป ํ ์ ์๋ค๊ณ ์๊ฐ), ๋๋ ๊ทธ๊ฒ์ด ๋ถ๋ฆฌ ํด๊ฒฐ ๊ทธ๋์ CardComponent
๋ก๋ถํฐ ParentOfCards
๋ฒ์:
const ParentOfCards = () => {
const [ cards, setCards ] = useState([ ... ])
return (
<div>
{ cards.map( CardComponent ) }
</div>
)
}
const CardComponent = ({ card, index }) => {
return (/**/)
}
๊ทธ๋ฆฌ๊ณ ์ด์ (๋๋ฒ๊น ์ดํ ํ :c) ์๋ํฉ๋๋ค! ๐
@marcelomrtnz ์ ๋ง ๊ฐ์ฌํฉ๋๋ค
๋ชจ๋ฐ์ผ์์ ์ด ๋ฌธ์ ์ ๋ํด ๋ง์ ์๊ฐ์ ์ ์ฝํ์ต๋๋ค.
๋ฐ์ dnd lib๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ฐ์ผ์์ ๋๋๊ทธ ๋๋กญํ๋ ๋์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ์ง๋ง ๋ชฉ๋ก์์ ํ ์ด div๋ฅผ ์ ๊ฑฐํ๊ณ ์นด๋ ๋ชฉ๋ก๋ง ์ ์งํ ํ์๋ ์ด ์ค๋ฅ ์์ด ์๋ํ์ต๋๋ค. ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ์์ ์ ํจํ ๋์์ ์ป์์ต๋๋ค.
๋๋ ๋น์ ์ ๊ฒ์๋ฌผ์์์ด ์์ด๋์ด๋ฅผ ์ป์์ผ๋ฏ๋ก @marcelomrtnz ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. https://codesandbox.io/s/proud-wind-hklt6?file=/src/CreateForum.jsx
๋ค์์ ์๋๋ฐ์ค์
๋๋ค. ํญ๋ชฉ 1ba๋ฅผ ํญ๋ชฉ 1 ์๋ก ๋๋๊ทธํ ๋ค์ ํญ๋ชฉ 1ba๋ฅผ ๋ค์ ์๋๋ก ๋๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๊ตฐ๊ฐ๊ฐ์ด ์ค๋ฅ์ ๋ฌธ์ ๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ ๋ ฌ ๊ฐ๋ฅํ ๋ชฉ๋ก์ ์์ฑํ ๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ์์๊ณ ๊ฐ ํญ๋ชฉ์๋ ํด๋น ID์ ๋ชฉ๋ก์ ์์ธ ์ฐ๊ฒฐ๋ก ๊ตฌ์ฑ๋ ํค๊ฐ ์์ต๋๋ค.
๋๋๊ทธ๋๋ ์์์ ๋ํด ์ ์ ํ(์ฆ, ์ผ๊ด๋) ํค๋ฅผ ์ค์ ํ๋ฉด ์์ ์ด ์๋ฃ๋์์ต๋๋ค.