fix:修复拖动重复copy

This commit is contained in:
tiantang 2023-06-27 00:27:02 +08:00
parent 20bf2eb35f
commit a3d4d3fbbe
3 changed files with 90 additions and 22 deletions

View File

@ -36,7 +36,8 @@ const dndList = [
originalIndex: index,
data: content,
children:TmpDndList.map(e=>{
e.id = e.id+String(index)+"5555"
e.id = String(new Date().getTime()+Math.random())+index
e.children = []
return e
})
}
@ -63,7 +64,7 @@ const Titlecom = ()=>{
<div></div>
<div>
{list2.map((item) => {
return <span style={{margin:"0 10px"}} key={item.index}>
return <span style={{}} key={item.index}>
<CustDrag data={item} key={item.index} />
</span>;
})}
@ -73,6 +74,9 @@ const Titlecom = ()=>{
}
const DndPage = ({data}) => {
const tagStore = getDropStoreId()
if(!Array.isArray(data)){
data = []
}
const [list, setList] = useState(data);
list.forEach((e)=>{
if(!e.tag){
@ -90,6 +94,7 @@ const DndPage = ({data}) => {
const insertCard = useCallback(
(atIndex: number, element:any) => {
element.list = list;
element.setList = setList
element.tag = tagStore.tag
setList(
@ -146,6 +151,28 @@ const DndPage = ({data}) => {
},
[findCard, list, setList],
)
const childrenCreate = useCallback((item:DropType,newItem:DropType) =>{
const Item = { ...newItem, id: String(new Date().getTime()) }
console.log(item.children)
if(!Array.isArray(item.children)){
item.children = [Item]
}else{
item.children.push(Item)
}
// item.setList(item.list)
// list.forEach(e=>{
// console.log(e.children)
// })
setList((listItem)=>{
return listItem.map(e=>{
e.children = [...e.children]
console.log(e.children)
return e
})
})
// setList(list)
console.log(item,newItem)
},[list])
// const [, drop] = useDrop(() => ({ accept: ItemTypes.CARD }))
// console.log(list)
return (
@ -153,8 +180,8 @@ const DndPage = ({data}) => {
<div style={{ border: "1px solid #000","minHeight":"10px","zIndex":(tagStore.id*10)+"px" }}>
{list&&list.map((item,index:number) => {
return <span style={{margin:"0 10px"}} key={item.id}>
<CardItem key={item.id} tag={tagStore.tag} len={list.length} data={item} deleteCard={deleteCard} insertCard={insertCard} moveCard={moveCard} findCard={findCard}>
<DndPage data={item.children||[]} />
<CardItem key={item.id} tag={tagStore.tag} childrenCreate={(newItem)=>childrenCreate(item,newItem)} len={list.length} data={item} deleteCard={deleteCard} insertCard={insertCard} moveCard={moveCard} findCard={findCard}>
<DndPage data={item.children} />
</CardItem>
</span>;
})}

View File

@ -23,6 +23,7 @@ interface CardItemProps {
findCard: (id: string,item:any) => { index: number }
insertCard: (atIndex: number,item:any) => void
deleteCard: (atIndex: number) => void
childrenCreate: (item: DropType) => void
children?:any
}
@ -32,7 +33,7 @@ interface Item {
originalIndex: number
}
const CardItem = memo((props:CardItemProps) => {
const { moveCard,findCard,data,len,children,insertCard,deleteCard,tag:Propstag } = props
const { moveCard,findCard,data,len,children,insertCard,deleteCard,tag:Propstag,childrenCreate } = props
const {id,index} = props.data
// if(!props.data.tag){
// props.data.tag = getDropStoreId()
@ -60,11 +61,11 @@ const CardItem = memo((props:CardItemProps) => {
}),
[id, originalIndex, moveCard],
)
const [{isOver,canDrop}, drop] = useDrop(
const [{isOver,canDrop,isOverCurrent}, drop] = useDrop(
() => ({
accept: ItemTypes.CARD,
hover(item: any,monitor) {
const { id: draggedId } = item;
const { id: draggedId,tag } = item;
// if (draggedId !== id) {
// const { index: overIndex } = findCard(id,item)
// moveCard(draggedId, overIndex,item)
@ -85,8 +86,9 @@ const CardItem = memo((props:CardItemProps) => {
}
return
}
// console.log(tag,data.tag)
// 存在idid不同时移动
if (draggedId !== id) {
if (tag===data.tag&&draggedId !== id) {
const { index: overIndex } = findCard(id,item)
moveCard(draggedId, overIndex,item)
}
@ -94,23 +96,29 @@ const CardItem = memo((props:CardItemProps) => {
collect:monitor => ({
isOver: monitor.isOver(),
canDrop: monitor.canDrop(),
isOverCurrent: monitor.isOver({ shallow: true }),
}),
drop:(item, monitor)=>{
console.log(item,monitor,data)
// const didDrop = monitor.didDrop()
// if(!didDrop){
// return
// }
const { id: currentId,tag } = item
if(currentId&&tag===Propstag) return
if(currentId&&data.tag===tag) return
if(Propstag!==tag&&Array.isArray(item.list)){
const itemList = item.list.filter((ele)=>ele.id!==currentId)
item.setList(itemList)
}
let { index: overIndex } = findCard(id,item)
console.log(overIndex,id,item,currentId,item.list)
if (overIndex!==undefined) {
const { index: overIndex } = findCard(id,item)
moveCard(currentId, overIndex,item)
positionRef.current = null
return;
}
console.log(overIndex,id,tag,Propstag,item,currentId,item.list)
// if (overIndex!==undefined) {
// const { index: overIndex } = findCard(id,item)
// moveCard(currentId, overIndex,item)
// positionRef.current = null
// return;
// }
if(positionRef.current === 'bottom') overIndex += 1
const newItem = { ...item, id: String(new Date().getTime()) }
insertCard(overIndex, newItem)
@ -123,24 +131,55 @@ const CardItem = memo((props:CardItemProps) => {
}),
[findCard, moveCard],
)
const [{childrenIsOver,childrenIsOverCurrent},childrenDrop] = useDrop(()=>({
accept: ItemTypes.CARD,
drop:(item, monitor)=>{
const isOver = monitor.isOver({ shallow: false })
if(isOver){
console.log(item,monitor,data.tag,data)
const newItem = { ...item, id: String(new Date().getTime()) }
childrenCreate(newItem)
return
}
// console.log(monitor.getDropResult())
// console.log(monitor.didDrop())
},
collect: (monitor) => ({
isOver: monitor.isOver(),
isOverCurrent: monitor.isOver({ shallow: true }),
}),
}),[data])
const chilDrenMouseEnter = (e) =>{
console.log(e)
}
let backgroundColor = 'rgba(0, 0, 0, .5)'
let childrenBackgroundColor = 'rgba(0, 0, 0, .2)'
if (isOverCurrent || isOver) {
backgroundColor = 'darkgreen'
}
if (childrenIsOver || childrenIsOverCurrent) {
childrenBackgroundColor = 'red'
}
const opacity = isDragging ? 0 : 1
// console.log(data)
return (
<div ref={(node) => drag(node)}>
<div ref={(node) => drag(drop(node))}>
<div >
<div ref={(node) => drag(drop(node))} style={{"backgroundColor":backgroundColor,margin:"0 10px"}}>
<div ref={nodeRef}>
{data?.data?.value}
{ (isOver && canDrop && positionRef.current === 'top') && <div >top</div> }
<span>{data?.data?.value}</span>
{ (isOver && canDrop && positionRef.current === 'bottom' && originalIndex !== len-1 ) && <div >bottom</div> }
{ (isDragging && canDrop && originalIndex === len-1 && positionRef.current !== 'top') && <div >len</div> }
</div>
</div>
<div ref={(node) => drop(node)} className={"children"} style={{"paddingLeft":"20px","minHeight":data.children?"50px":"0px"}}>
{ (isOver && canDrop && positionRef.current === 'top') && <div >top</div> }
<div ref={(node)=>childrenDrop(node)} className={"children"} style={{"paddingLeft":"20px","minHeight":"50px","backgroundColor":childrenBackgroundColor}}>
{props.children}
{ (isOver && canDrop && positionRef.current === 'bottom' && originalIndex !== len-1 ) && <div >bottom</div> }
{ (isDragging && canDrop && originalIndex === len-1 && positionRef.current !== 'top') && <div >len</div> }
</div>
</div>

View File

@ -25,6 +25,8 @@ const getDropStoreId = () =>{
export interface DropType {
tag:string
type:dropType
list:DropType[]
setList?:Function
id:string
index:number,
originalIndex: number