Превышена максимальная глубина обновления. Это может произойти, когда компонент неоднократно вызывает и исходит из react-xarrows

Я пытаюсь сделать проект реакции блок-схемы с нуля, поэтому для части стрелок я добавил библиотеку react-xarrows, изначально она работала, а теперь выдает мне эту ошибку

 Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.
    at checkForNestedUpdates (react-dom.development.js:27292:1)
    at scheduleUpdateOnFiber (react-dom.development.js:25475:1)
    at dispatchSetState (react-dom.development.js:17527:1)
    at index.js:754:1
    at commitHookEffectListMount (react-dom.development.js:23150:1)
    at commitLayoutEffectOnFiber (react-dom.development.js:23268:1)
    at commitLayoutMountEffects_complete (react-dom.development.js:24688:1)
    at commitLayoutEffects_begin (react-dom.development.js:24674:1)
    at commitLayoutEffects (react-dom.development.js:24612:1)
    at commitRootImpl (react-dom.development.js:26823:1)
import React, { useState } from "react";
import Draggable from "react-draggable";
import Xarrow ,{ Xwrapper,useXarrow } from "react-xarrows";
import { Card, Col, Row } from "reactstrap";
import ContextMenu from "./ContextMenu";
import BobUp from './BopUp'
import Base from "../Components/Base";
import { getTokenList, isLoggedIn } from "../Auth/Auth1";

const BaseDragDrop2 = () => {
  const tk= getTokenList();
const [contextVisible,setContextVisible]=useState(false)
const [selectedDiv, setselectedDiv] = useState({
        start: '',
        end: ''
    })
    
    const [conPoint, setConPoint] = useState({
        top: null,
        left: null,
        subLeft:null,
        subTop:null
    })
    const [con, setCon] = useState({
        connections:[]
    })
   
    const [initial, setInitial] = useState({
        task: [
            { name: 'N', color: 'yellow', category: 'compA', x: '', y: '',id:'1'},
            { name: 'A', color: 'green', category: 'compA', x: '', y: '',id:'2'},
            { name: 'V', color: 'black', category: 'compA', x: '', y: '',id:'3'},
            { name: 'R', color: 'red', category: 'compA', x: '', y: '',id:'4'}
        ]
    })
const onDragStart = (e, item, index) => {
  
        e.dataTransfer.setData('item', JSON.stringify(item))
        e.dataTransfer.setData('index', index)
}
const onDragOver = (e) => {
    e.preventDefault()
}
const [visible, setVisible] = useState(false)

const onDrop = (e, cat) => {
    e.preventDefault()
    const item = JSON.parse(e.dataTransfer.getData('item'))
    const index = e.dataTransfer.getData('index')
    var updatedTask;
    if (item.category === cat && index != null) {
      updatedTask = tasks.compB.filter((t, index2) => {
            if (index == index2) {
                t.x = e.clientX
                t.y = e.clientY
            }
            return t
        })
        setInitial({ ...initial, updatedTask })
    } else {
        item.x = e.clientX
        item.y = e.clientY
        item.category = cat
        item.id=item.id*Math.random()
        updatedTask = [...initial.task, item]
        setInitial({ ...initial, task: updatedTask })
    }}


let tasks = {
        compA: [],
        compB: []
    }
// Double click handler
const doubleClickHandler=(e)=>{
    if (selectedDiv.start.length!==0 && selectedDiv.start!==e.target.id){
        setselectedDiv({...selectedDiv,end:e.target.id})
        e.target.classList.add('active1')
        setConPoint({...conPoint,left:e.pageX,top:e.pageY,subLeft:235,subTop:9})
        if (selectedDiv.start!==0 && selectedDiv.end!==0){
            setVisible(true)
            setContextVisible(false)
        }else{
            setVisible(false)
        }
          
    }else{
        setselectedDiv({...selectedDiv,start:e.target.id})
        e.target.classList.add('active1')
       
    }
}

const clickHandler=(e)=>{
    console.info("id is ",e.target.id)
    console.info(Date.now())
    if (selectedDiv.start!==0 && selectedDiv.end!==0){
//    console.info('inside click handlker')
    if (selectedDiv.start===e.target.id){
        setselectedDiv({...selectedDiv,start:''})
        setVisible(false)
    }else if (selectedDiv.end===e.target.id){
        setselectedDiv({...selectedDiv,end:''})
        setVisible(false)
    }
}
}

const close = (e, item) => {
        const newConnection = con.connections
        const index = newConnection.findIndex((items) => items === item)
        console.info('items ',item)
//        console.info(index ," index of connection")
        newConnection.splice(index, 1)
        setCon({...con,connections:newConnection})
        document.getElementById(item.start).classList.remove('active1')
        document.getElementById(item.end).classList.remove('active1')
    }

const contextMenu=(e,t,index)=>{
        e.preventDefault()
        localStorage.setItem('t',JSON.stringify({t,index}))
        
        setVisible(false)
        setConPoint({...conPoint,left:null,top:e.null,subLeft:null,subTop:null})
        setConPoint({...conPoint,left:e.pageX,top:e.pageY,subLeft:232,subTop:9})
        setContextVisible(true)
     }
     
 
const contextHandler=(e)=>{
       const value=e.target.id
 let t5=null;
  
 
   const t2= JSON.parse(localStorage.getItem('t'))
   const id=     t2.t.id
   console.info(id," id ")
 const con2=con.connections

   const newTask = initial.task
   if (value==='delete'){
    con2.forEach((t)=>{
        console.info(t.start," start "," end ",t.end)
        console.info("id ",id)
        if (t.start===`${id}div` | t.end===`${id}div`){
            t5=t
            console.info(t5," if inside del")
        }
    })
    console.info(t5," t5")
    if (t5!==null){
    let index=con2.findIndex((t)=>t===t5)
    con2.splice(index,1)
    const upConnnect=[...con.connections,con2]
    setCon({...con,connections : con2})
    console.info(con2)
    }
    newTask.splice(t2.index+4,1)
    console.info("new task ",newTask)
    setInitial({...initial,task:newTask})
    setContextVisible(false)
     }else if (value==='duplicate')
     {
       const t3= t2.t
       t3.x=t3.x+100
       t3.id=t3.id* Math.random()
      const updatedTask = [...initial.task, t3]
       setInitial({ ...initial, task: updatedTask })
       setContextVisible(false)
       }
    }



    const selectHandler = (e) => {
      //  console.info(e)
      if (e.target.value === 'success') {
        const connect = {
            start:selectedDiv.start,
            end:selectedDiv.end
        }
        const upConnnect=[...con.connections,connect]
        setCon({...con,connections : upConnnect})
      //      console.info('selected div ',selectedDiv)
          const id=  document.getElementById(selectedDiv.start)
   //       console.info("document gte by id ",id)
            document.getElementById(selectedDiv.start).classList.remove('active1')
            document.getElementById(selectedDiv.end).classList.remove('active1')
            setselectedDiv({ ...selectedDiv, start:'', end:'' })
            setVisible(false)
  //          setConPoint({...conPoint,top:null,left:null,subLeft:null,subTop:null})

        } else if (e.target.value === 'error') {
            const connect = {
                start:selectedDiv.start,
                end:selectedDiv.end
            }
            const upConnnect=[...con.connections,connect]
            setCon({...con,connections : upConnnect})
            document.getElementById(selectedDiv.start).classList.remove('active1')
            document.getElementById(selectedDiv.end).classList.remove('active1')
            setselectedDiv({ ...selectedDiv, start: '', end:'' })
            setVisible(false)
    //        setConPoint({...conPoint,top:null,left:null,subLeft:null,subTop:null})

        } else if (e.target.value === 'close') {
            setselectedDiv({ ...selectedDiv, start: '', end: '' })
            document.getElementById(selectedDiv.start).classList.remove('active1')
            document.getElementById(selectedDiv.end).classList.remove('active1')
            setVisible(false)
    //        setConPoint({...conPoint,top:null,left:null,subLeft:null,subTop:null})

        }
    }

    initial.task.forEach((t) =>
        tasks[t.category].push(t)
    )
    const updatedArrow = useXarrow();

    return (
        <React.Fragment  >
          <Base>
                <Row >

                    <Col md = {3} >
                        <div>Component A
                            {tasks.compA.map((t, index) => {
                                return (
                                    <div key = {`${index}` || 1}
                                            draggable
                                            style = {{ backgroundColor: t.color }}
                                            onDragStart = {((e) => onDragStart(e, t))}
                                        ><label key = {index}></label></div>
                                   )
                            })}
                        </div>
                    </Col>
                    <Col md = {5}>
                       
                        <Card
                            className = "my-2"

                            onDrop = {((e) => onDrop(e, 'compB'))}
                           onDragOver = {((e) => onDragOver(e))}
                            style = {{
                                width: '45rem',
                                height: '30rem',
                                backgroundColor: '#F0F0F0'
                            }}>
                            <div>
                                Component B
                                {tasks.compB.map((t, index) => {
                                    return (
                                        <>
                                            <Draggable onDrag = {updatedArrow} onStop = {updatedArrow} >
                                                <div key = {`${index}` || 1}
                                                    id = {`${t.id}div`}
                                                    className='onhover'
                                                    onDoubleClick = {(e)=>doubleClickHandler(e)}
                                                    onClick = {(e)=>clickHandler(e)}
                                                    onContextMenu = {(e)=>contextMenu(e,t,index)}
                                                    style = {{
                                                        width: '5rem',
                                                        height: '5rem',
                                                        position: 'absolute',
                                                        outlineStyle: 'dotted',
                                                        outlineColor: t.color,
                                                        left: `${t.x - 338}px` || 0,
                                                        top: `${t.y - 45}px` || 0

                                                    }}

                                                >{t.name}</div>
                                            </Draggable>
                                            {visible && <ContextMenu points = {conPoint}>
                                                <ul style = {{ padding: 0,listStyleType:'none' }}>
                                                    <li>{selectedDiv.start.substring(0,8)}</li>
                                                    <li>
                                                        <select name = "select" id = "select"
                                                            onChange = {(e) => { selectHandler(e) }} >
                                                            <option key='' value='null'>Select an option</option>
                                                            <option key='success' value='success' >success</option>
                                                            <option key='error' value='error'>Error</option>
                                                            <option key='close' value='close' >close</option>
                                                        </select>
                                                    </li>
                                                    <li>{selectedDiv.end.substring(0,8)}</li>

                                            </ul></ContextMenu>}
                                            {contextVisible &&
                                        <ContextMenu points = {conPoint}>
                                            <ul style = {{ padding: 0,listStyleType:'none' }} onClick = {(e)=>{contextHandler(e)}}>
                                                <li id='duplicate' >Duplicate</li>
                                                <li id='delete'>Delete</li>
                                            </ul>
                                        </ContextMenu>}
                                                </>
                                                )
                                })}
                            </div>
                        </Card>
                    </Col>
                  

                </Row>
                {con.connections && con.connections.map((t, index) => {
                    return (<>
                       
                    <Xwrapper>    <Xarrow start = {t.start} end = {t.end} key = {index}
                    labels = {<i onClick = {(e) => close(e, t)} style = {{ cursor: "pointer" }} >x</i>}   />
                      </Xwrapper>
                      </>
                    )
                }
                     )}
                <button type = {'submit'} onClick = {() => { console.info(selectedDiv) }}  >submit</button>
                <button type = {'button'} onClick = {()=>{console.info(visible)}} >Visible</button>
                <button type = {'button'} onClick = {()=>{console.info(con.connections)}} >Connections</button>
                <button type = {'button'} onClick = {()=>{console.info(initial)}} >State</button>
                </Base>
        </React.Fragment >
    );
}
export default BaseDragDrop2

и дело в том, что код работает правильно в браузере Microsoft Edge, но не работает в Google

Таким образом, ответ на решение этой ошибки будет полезен, или предоставление другой библиотеки, которая подойдет по мере необходимости, будет отличной.

Можете ли вы добавить свой код

Farbod Shabani 23.11.2022 07:37

Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.

Priyen Mehta 23.11.2022 13:48

@PriyenMehta Я столкнулся с превышением максимальной глубины обновления в Chrome, и он работает в браузере Microsoft Edge, так в чем может быть причина?

Satya Thevar 24.11.2022 04:46

@FarbodShabani я обновил код, и это весь мой код, я не знаю, где что-то пошло не так, поэтому я опубликовал весь код

Satya Thevar 24.11.2022 04:50

почему вы называете свои функции так onDrop = {((e) => onDrop(e, 'compB'))} и onDragOver = {((e) => onDragOver(e))} должны были использовать это onDrop = {(e) => onDrop(e, 'compB')} и onDragOver = {(e) => onDragOver(e)} способом? 🤔 или даже вот этот ` onDragStart = {((e) => onDragStart(e, t))}`. посмотрите, проблема в том, что в одной из ваших функций вы вспоминаете состояние использования больше, чем должны, я думаю, что это должна быть одна из этих функций, на которые я указываю. Если это не так, вы можете зарегистрировать свою функцию и посмотреть, где вы вспоминаете useState для много. обнови меня, когда сможешь

Farbod Shabani 24.11.2022 06:23

почему вы называете свои функции так onDrop = {((e) => onDrop(e, 'compB'))} и onDragOver = {((e) => onDragOver(e))} должны ли вы использовать их таким образом onDrop = {(e) => onDrop(e, 'compB')} и onDragOver = {(e) => onDragOver(e)}?🤔

Farbod Shabani 24.11.2022 06:23

я пробовал но не помогло

Satya Thevar 24.11.2022 12:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
7
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, здесь я отвечаю на свой вопрос, я исправил его самостоятельно. Таким образом, причиной вышеупомянутой проблемы является сторонняя библиотека. , когда я обновил react-xarrows, который является сторонней библиотекой, код заработал.

Другие вопросы по теме