当前位置: 首页 > 知识库问答 >
问题:

react.js - 使用react+react-dnd通过循环渲染子组件怎样拿到每个子组件的位置?

岳彬炳
2023-11-13


使用react+react-dnd实现了类似上图的效果,不过目前的问题是,现在只能实现往后追加,不能实现从中间插入,如果要实现从中间插图需要获取右边每个子组件的位置
由于右边的效果是通过遍历实现的,所以通过ref的方法只能拿到最后一个元素的位置信息

 const elRef = useRef()import designComponents from './components'//。。。  const [{ canDrop }, drop] = useDrop({    accept: 'card',    canDrop: (_item, monitor) => {      const hoverBoundingRect = elRef.current?.getBoundingClientRect()        //这里每次输出拿到的都是最后一个子组件的位置**      console.log('��  DropSquare  hoverBoundingRect:', hoverBoundingRect)      return true    },    collect: (monitor) => ({      canDrop: !!monitor.canDrop(),    }),  })<div className='design-main' ref={drop}>      {dropLists.map((item, index) => {        const El = designComponents[item.element]        return (          // eslint-disable-next-line react/no-array-index-key          <div ref={elRef} key={`${item}-${index}`}>            <El />          </div>        )      })}    </div>

共有1个答案

汪高岑
2023-11-13
import React, { useRef, useMemo } from 'react';import { useDrop } from 'react-dnd';const MyComponent = ({ dropLists }) => {    const elRefs = useMemo(    () => Array.from({ length: dropLists.length }, () => React.createRef()),    [dropLists.length]  );  const [{ canDrop }, drop] = useDrop({    accept: 'card',    hover: (item, monitor) => {      const index = monitor.getItem().index;       const hoverBoundingRect = elRefs[index]?.current?.getBoundingClientRect();      console.log('Hovered Element Position:', hoverBoundingRect);    其他逻辑,比如插入位置的判断    },    collect: (monitor) => ({      canDrop: !!monitor.canDrop(),    }),  });  return (    <div className='design-main' ref={drop}>      {dropLists.map((item, index) => {        const El = designComponents[item.element];        return (          <div ref={elRefs[index]} key={`${item}-${index}`}>            <El />          </div>        );      })}    </div>  );};
 类似资料:
  • 本文向大家介绍react中怎样阻止组件渲染?相关面试题,主要包含被问及react中怎样阻止组件渲染?时的应答技巧和注意事项,需要的朋友参考一下 在极少数情况下,你可能希望能隐藏组件,即使它已经被其他组件渲染。若要完成此操作,你可以让  方法直接返回 ,而不进行任何渲染。

  • 问题内容: 在React JSX中,似乎无法执行以下操作: 我收到一个解析错误:意外令牌{。这不是React可以处理的吗? 我正在设计此组件,以便在内部隐藏的值将包含有效的HTML元素(h1,p等)。有什么办法可以使这项工作吗? 问题答案: 您不应该将组件子弹放在花括号中: 这是一个有效的小提琴:http : //jsfiddle.net/kb3gN/6668/ 此外,您还可以找到JSX编译器,有

  • 问题内容: 我有一个React组件,其中有许多子组件。我不希望立即渲染子组件,而是要经过一段时间的延迟(对于每个子组件而言,它们是统一的还是不同的)。 我想知道-有没有办法做到这一点? 问题答案: 我认为最直观的方法是给孩子一个“ wait” ,在从父代传递过来的持续时间内隐藏该组件。通过将默认状态设置为隐藏,React仍会立即渲染组件,但是直到状态更改后它才可见。然后,您可以设置为调用一个函数,

  • 问题内容: 我有一个要显示字符串数组的组件。代码看起来像这样。 运行正常。例如,如果 props.data = [‘tom’,’jason’,’chris’] 页面中呈现的结果将为 tomjasonchris 然后,我想使用逗号连接所有名称,因此我将代码更改为 但是,渲染的结果是 [Object],[Object],[Object]。 我不知道如何解释对象成为要渲染的反应组件。有什么建议吗? 问题

  • 问题内容: 我有一些称为站的数据,它是一个包含对象的数组。 我想为每个数组位置渲染一个ui组件。到目前为止,我可以写 然后渲染 问题是我要打印所有数据。相反,我只想显示一个像这样的键,但是什么也不打印。 如何遍历此数据并为数组的每个位置返回一个新的UI元素? 问题答案: 您可以将工作站列表映射到ReactElements。 使用React> = 16时,可以从同一组件返回多个元素,而无需额外的ht

  • 问题内容: 我想从自己的组件中递归添加一个react组件。我看到了一个树组件的示例,该组件通过子TreeNode进行映射并以相同方式添加子节点。不幸的是,这对我根本不起作用。这个想法是要有一个简单的注释组件,而答复将重用相同的组件。 我收到以下错误消息: 未捕获的TypeError:无法构造“注释”:请使用“ new”运算符,此DOM对象构造函数不能作为函数调用。 这是传递给组件的JSON数据的示