当前位置: 首页 > 面试题库 >

如何对带有钩子的元素数组使用多个引用?

微生信鸿
2023-03-14
问题内容

据我了解,我可以将refs用于单个元素,如下所示:

const { useRef, useState, useEffect } = React;



const App = () => {

  const elRef = useRef();

  const [elWidth, setElWidth] = useState();



  useEffect(() => {

    setElWidth(elRef.current.offsetWidth);

  }, []);



  return (

    <div>

      <div ref={elRef} style={{ width: "100px" }}>

        Width is: {elWidth}

      </div>

    </div>

  );

};



ReactDOM.render(

  <App />,

  document.getElementById("root")

);


<script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>

<script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>



<div id="root"></div>

如何为一系列元素实现此功能?显然不是这样:(即使我没有尝试,我也知道:)

const { useRef, useState, useEffect } = React;



const App = () => {

  const elRef = useRef();

  const [elWidth, setElWidth] = useState();



  useEffect(() => {

    setElWidth(elRef.current.offsetWidth);

  }, []);



  return (

    <div>

      {[1, 2, 3].map(el => (

        <div ref={elRef} style={{ width: `${el * 100}px` }}>

          Width is: {elWidth}

        </div>

      ))}

    </div>

  );

};



ReactDOM.render(

  <App />,

  document.getElementById("root")

);


<script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>

<script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>



<div id="root"></div>

我已经看到了这个,因此这个。但是,对于这种简单情况,我仍然感到困惑。


问题答案:

ref最初只是{ current: null }对象。useRef在组件渲染之间保留对此对象的引用。currentvalue主要用于组件引用,但可以容纳任何内容。

在某个时候应该有一组引用。如果渲染之间数组长度可能有所不同,则数组应相应缩放:

  const arrLength = arr.length;
  const [elRefs, setElRefs] = React.useState([]);

  React.useEffect(() => {
    // add or remove refs
    setElRefs(elRefs => (
      Array(arrLength).fill().map((_, i) => elRefs[i] || createRef())
    ));
  }, [arrLength]);

  return (
    <div>
      {arr.map((el, i) => (
        <div ref={elRefs[i]} style={...}>...</div>
      ))}
    </div>
  );

可以通过解包useEffect和替换来优化这段代码useStateuseRef但应注意,通常认为在render函数中产生副作用是一种不好的做法:

  const arrLength = arr.length;
  const elRefs = React.useRef([]);

  if (elRefs.current.length !== arrLength) {
    // add or remove refs
    elRefs.current = Array(arrLength).fill().map((_, i) => elRefs.current[i] || createRef())
    ));
  }

  return (
    <div>
      {arr.map((el, i) => (
        <div ref={elRefs.current[i]} style={...}>...</div>
      ))}
    </div>
  );


 类似资料:
  • 我正在尝试更新mongob文档中数组中包含的单个子元素。我想使用其数组索引引用该字段(数组中的元素没有任何我可以保证将是唯一标识符的字段)。似乎这应该很容易做到,但我无法弄清楚语法。 这是我想在伪json中做的事情。 之前: 之后: 似乎查询应该是这样的: 但这行不通。我花了很长时间搜索mongodb文档,并尝试了这种语法的不同变体(例如,使用,等等)。我找不到任何关于如何在MongoDB中完成这

  • 我已经创建了一个的数组: 我的问题是现在如何访问其中一个数组的元素。例如,我可以通过以下方式访问(或在示例打印中)整个数组元素: 但是如何访问所拥有的数组中的第一个元素呢?我尝试了所有方法,比如,但当数组是链接列表的元素时,我不知道如何访问数组中的元素。

  • 我正在使用以下xml结构: 只有当代码为“XXX”时,我才需要按ID和代码分组,并求和金额。最后,我的最终输出应该如下所示: 我知道如何通过多个元素进行分组,但我不知道如何通过元素值对分组进行条件化。我不太深入研究xsl,所以我的知识有点缺乏。我尝试过使用以下xsl(无论如何都是最新版本): 我遇到的另一个问题是,我没有完全正确的求和逻辑,但这可能是一个不同的帖子。 任何形式的帮助或指导将不胜感激

  • 问题内容: 如果我们有一个numpy数组,例如: 我们想要设置一个元素,另一个元素 我们该怎么做? 将数组的第一个维度的每个元素设置为5 问题答案: 使用as作为数据数组和索引数组,以便每一行对应于要在数据数组中设置的一个元素,您可以执行以下操作- 样品运行- 或者,我们可以使用计算线性索引,然后使用进行赋值,就像这样- 如果您要处理三维数组,我们可以对三维索引进行切片,然后分配具有另一种方法,如

  • 问题内容: 假设我有以下代码: 现在,我需要在上面,但是在jsFiddle中,您可以看到child元素呈现在before之前。 如果您删除 类 或 ,则一切正常。这是我需要的正确行为: http //jsfiddle.net/ZjXMR/1/ 如何在不删除页面的情况下执行此操作? 问题答案: 这是不可能的,因为子级的设置与父级的堆叠索引相同。 您已经通过从父级移除z-index来解决该问题,将其保

  • 问题内容: 我想找到一种方法来获取元素树的所有子元素,就像这样,因为自python 2.7版本以来已弃用,尽管现在我仍然可以使用它,但我不想再使用它了。 谢谢。 问题答案: 的所有子元素(后代): 一个更完整的示例: 排除根本身: