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

2024-01-07

据我了解,我可以对单个元素使用 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>

我见过this https://github.com/facebook/react/issues/14072因此this https://github.com/facebook/react/issues/14490#issuecomment-454973512。但是,我仍然对如何针对这个简单的案例实施该建议感到困惑。


As you 不能在循环内使用钩子 https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level,这里有一个解决方案,以便使其在数组随时间变化时起作用。

我想数组来自 props :

const App = props => {
    const itemsRef = useRef([]);
    // you can access the elements with itemsRef.current[n]

    useEffect(() => {
       itemsRef.current = itemsRef.current.slice(0, props.items.length);
    }, [props.items]);

    return props.items.map((item, i) => (
      <div 
          key={i} 
          ref={el => itemsRef.current[i] = el} 
          style={{ width: `${(i + 1) * 100}px` }}>
        ...
      </div>
    ));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 正则表达式中的“g”标志是什么意思?

    的含义是什么g正则表达式中的标志 之间有什么区别 g and g用于全局搜索 这意味着它将匹配所有出现的情况 通常你还会看到i这意味着忽略大小写 参考 全局 JavaScript MDN https developer mozilla or
  • Vue.JS 2.5.1:未捕获的语法错误:意外的令牌导出

    我试图使用 VueJS 和 Bootstrap Vue 制作一个单选按钮 但是当我制作它时发生了这种情况 我预计这是语法错误 就像它所说的那样 但我似乎找不到任何线索 所以我尝试复制粘贴代码 这是 test radio php 的完整代码
  • 拖放区缩略图宽度图像大小

    如何更改上传图像的缩略图大小 我在我的javascript中尝试过thumbnailWidth 350 但是这不会增加缩略图大小 而缩略图只是看起来放大了 如何操作图像缩略图大小 HTML section section
  • 动态表中每个按钮的 Jquery-Ui 对话框表单

    我正在生成一个 HTML 表 每行都有一个按钮 必须打开 Jquery ui 对话框表单 The table table class table table reporting table condensed table striped t
  • 夜间值班。单击带有文本的元素

    我遇到问题 无法单击具有某些独特文本的网页元素 我有这样的结构 div class wg wagon type title Text div 我试试这个 click wg wagon type title contains Text 但我有
  • 卸载/销毁 Angular 延迟加载组件

    我的设置与此处找到的帖子类似http ify io lazy loading in angularjs http ify io lazy loading in angularjs 处理 Angular 中我的应用程序的各种组件的延迟加载 我
  • Nodemailer:从未收到问候语

    当尝试使用 Nodemailer 在 Node 内发送电子邮件时 https github com nodemailer nodemailer https github com nodemailer nodemailer 调用sendMai
  • 光滑的旋转木马不工作

    我一直在尝试简单地实现 Slick Carousel 的工作 我已按照 Git 页面上的说明进行操作 https github com kenwheeler slick https github com kenwheeler slick 这
  • Typescript:如何在自定义过滤器中使用角度 $filter

    如何在自定义过滤器中使用 Angular filter 如何注入 filter依赖 module Filters export class CustomFilter public static Factory return function
  • 离子旋转器未显示

    我用 http 请求填充 Ionic 集合重复列表 但我不想将所有内容直接加载到 DOM 中 因此 我只显示其中一些项目 并在您向下滚动时添加其余项目 为此我实现了无限滚动功能 当我到达页面底部时 它应该显示一个旋转器 但它没有 这些物品至
  • EJS在JS onload函数中访问express变量

    我知道你可以像这样获取 ejs 文件中变量的值 h1 h1 如果我要在同一个 ejs 页面的 onload javascript 函数中使用相同的标题变量 我将如何使用它 例如 这个函数产生一个控制台错误说 未捕获的语法错误 意外的标识符
  • React router.push 和 router.replace 之间的区别?

    有什么区别React 路由器推送 and 路由器 替换 路由器历史记录就像一个stack of routes 当您使用router replace 您将覆盖堆栈的顶部 当使用router push 它在顶部添加了一条新路线stack 路由器
  • 更改时触发跨度文本/html

    jQuery 或 JavaScript 中是否有任何事件在以下情况下触发span标签 text html 已更改 Code span class user location span user location change functio
  • 在 jQuery AJAX 成功中从 MySql 获取特定响应

    好吧 我有这个 ajax 代码 它将在 Success 块中返回 MySql 的结果 ajax type POST url index php success function data alert data My Query sql SE
  • 带时间戳的 Firestore 查询

    如果它是文本字段 我可以使用 where 条件获取数据 但是当我尝试对时间戳字段和日期执行相同操作时 事情不起作用 这是我的代码 home ts firebase firestore collection cities where time
  • 由于固定导航,增加了 FancyBox v2 的顶部和底部边距

    我目前正在开发一个网站 该网站将来将具有响应能力 该网站主要由图像组成 单击这些图像会加载到 FancyBox 中 FancyBox v2 现在具有响应能力 因此可以在屏幕尺寸发生变化时重新调整图像等的大小 作为我设计的一部分 我有两个固定
  • HTML 和 JavaScript - 将滚动操作从一个元素传递到另一个元素

    假设我有两个 div div div div A scrollable list div 我想让它当光标停在里面时 control并且鼠标滚轮滚动 view将会滚动 无论如何要实现这一目标 好的 快速修复对我有用 即使固定 div 不可滚动
  • PhantomJS 网页内存消耗?

    是否有一种编程方式 因为我想在运行时自动执行 方式来查看网页在通过 PhantomJs 运行时使用了多少内存 我也在使用 casperjs 如果这有帮助的话 我已经搜索了很多但没有找到任何方法 PhantomJs 使用 QtWebKit 因
  • `ie9` - contenteditable false 在父级可编辑时不起作用

    我正在尝试制作内容可编辑和不可编辑的容器 用户可以通过 3 种方式使用它 他们可以将内容与non editable 他们可以将内容与editable 他们可以在不选择其中之一的情况下放置内容 可编辑 我正在努力实现以下目标 content
  • Apollo 客户端延迟刷新

    In Apollo Client v3React 实现 我使用钩子来使用订阅 当我从订阅接收数据时 我想重新获取查询 但前提是查询之前已执行过并且位于缓存中 有办法实现这一点吗 我首先进行惰性查询 然后在收到订阅数据时手动检查缓存 然后尝试

随机推荐

  • 编辑摊牌:在句子末尾保留换行符

    编辑非所见即所得 LaTeX HTML 等 散文时 您可能希望在句子末尾添加换行符 这有几个优点 更容易重新排列句子 更容易注释句子 更容易发现连续 过长的句子 评论更方便on句子 例如 The following isn t strict
  • 是否可以在 Selenium 中捕获 POST 数据?

    我正在与Selenium http seleniumhq comWebDriver 工具 我想知道该工具是否提供了一种捕获提交表单时生成的 POST 数据的方法 我正在使用 django 测试框架来测试我的数据是否在后端正确处理 我想使用
  • 这是什么 ANT 版本?

    我是 java Eclipse 的新手 我安装了 eclipse 并使用它作为 IDE 来处理 JAVA 1 4 文件 我更改了代码并保存了它并想要运行 cntr F11 或调试 F11 每次我得到 select what to run A
  • WTForms:FormField 的 FieldList 无法加载嵌套数据

    我在 FieldList 内的 FormField 内有一个自定义字段 地点 class LocationForm Form id HiddenField id title StringField l Title Required loca
  • 加载特定 MIME 类型的本机客户端 Chrome 扩展

    我为 Google Chrome Web 浏览器创建了一个本机客户端应用程序 用于播放特殊类型的音频文件 伟大的 此时该部分效果很好 我已准备好进入下一阶段 与世界分享这个应用程序 我需要这部分的帮助 根据我的理解 分发此应用程序的最佳方法
  • 如何预加载 angular2 视图,以便在首次加载时不会闪烁白页?

    我正在用纯 JS 构建一个 Angular 2 应用程序 我的问题是 当我从一个页面更改到另一个页面时 它会闪烁白色页面 直到呈现新视图 仅当我第一次访问所有组件时 才会发生这种情况 如果我第二次转到相同的路线 则页面加载时不会出现白页 我
  • 如何调整分面 tmap 图中的分面行标签高度?

    我正在使用带有行和列的 tmap 包绘制多面地图 我无法调整行的分面标签的高度 这会导致分面标签在大于特定大小或旋转时被裁剪 我已经尝试调整所有tm layout 小组的论据包括panel label height panel label
  • Ansible 循环相关问题

    我有一个剧本 其中有多个角色和串行设置 因此它首先在一台机器上运行 然后在其余机器上运行 在其中一个角色中 我有以下任务 name getting dbnodes IP addresses local action shell echo f
  • WPF 组合框样式

    下面是我的 ComboBox 样式代码 想法是在 ComboBox 周围放置边框并重用该样式
  • 我无法运行 hello.py 并获取 SyntaxError: invalid syntax

    我对 Python 和整个编程都很陌生 很抱歉问了一个看似重复的问题 但是 我无法使用以下格式运行我自己的代码 C Users Archangel gt python hello py 这是 hello py 包含的内容 Define a
  • 递归或循环[重复]

    这个问题在这里已经有答案了 我有这个方法可以计算一些统计数据 public void calculateAverage int hour if hour 20 int data 0 int times 0 for CallQueue cq
  • “+”(加号)CSS 选择器是什么意思?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 例如 p p Some declarations 我不知道是什么 方法 这和仅仅定义样式
  • HTTPS 从根域(即 apex 或“naked”)重定向到“www”子域,而浏览器不会抛出异常?

    DNS A 记录要求将 IP 地址硬编码到应用程序的 DNS 配置中 哪个Heroku 建议避免 https devcenter heroku com articles apex domains Heroku 建议两种解决方法 使用在顶端支
  • 定期刷新 golang 中的通道

    我需要定期刷新频道的内容 我用 len 做到了这一点 我想知道是否有更好的方法来做到这一点 http play golang org p YzaI 2c F http play golang org p YzaI 2c F package
  • iOS 上的波形

    我正在寻找如何绘制声音幅度 I found http supermegaultragroovy com 2009 10 06 drawing waveforms http supermegaultragroovy com 2009 10 0
  • Preon 的 Java 或 C++ 等效项?

    Preon https github com preon preon是一个用于创建二进制编解码器的 Java 库 您只需在类的数据成员中放置关于它们与位字段的对应关系的注释 例如用于特定字段的位数 并且基于此类 该库构建一个 Codec 对
  • 如何在渲染后动态更改 ExtJS GridPanel viewconfig 上的 getRowClass 函数

    我有一个Ext grid Panel使用返回自定义类的函数 该自定义类用于通过重写 getRowClass 函数对网格中的行进行颜色编码 这很好用 但我想为用户提供更改网格着色标准的选项 在下面的示例中 我按 严重性 属性进行着色 但我想将
  • 如何使用 ruby​​ 日期常量 GREGORIAN、JULIAN、ENGLAND 甚至 ITALY

    因为大写 它们是常量 我很高兴学习 ruby 的日期助手 1 9 3p125 057 gt Date ABBR MONTHNAMES gt nil Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov De
  • 从 R 数据框中清理“Inf”值

    在 R 中 我有一个操作可以创建一些Inf当我转换数据框时的值 我想把这些Inf值转化为NA价值观 我的代码对于大数据来说很慢 有没有更快的方法 假设我有以下数据框 dat lt data frame a c 1 Inf b c Inf 3
  • 如何对带有钩子的元素数组使用多个引用?

    据我了解 我可以对单个元素使用 refs 如下所示 const useRef useState useEffect React const App gt const elRef useRef const elWidth setElWidth