在地图循环中生成多个参考

乔伊·编码

如果我使用useRef([]);正确的方法作为itemsRef返回值我仍然会感到困惑Object {current: Array[0]}在这里起作用:https : //codesandbox.io/s/zealous-platform-95qim?file=/src/ App.js: 0-1157

import React, { useRef } from "react";
import "./styles.css";

export default function App() {
  const items = [
    {
      id: "asdf2",
      city: "Berlin",
      condition: [
        {
          id: "AF8Qgpj",
          weather: "Sun",
          activity: "Outside"
        }
      ]
    },
    {
      id: "zfsfj",
      city: "London",
      condition: [
        {
          id: "zR8Qgpj",
          weather: "Rain",
          activity: "Inside"
        }
      ]
    }
  ];

  const itemsRef = useRef([]);

  // Object {current: Array[0]}
  // Why? Isn't it supposed to be filled with my refs (condition.id)
  console.log(itemsRef);

  return (
    <>
      {items.map(cities => (
        <div key={cities.id}>
          <b>{cities.city}</b>
          <br />
          {cities.condition.map(condition => (
            <div
              key={condition.id}
              ref={el => (itemsRef.current[condition.id] = el)}
            >
              Weather: {condition.weather}
              <br />
              Activity: {condition.activity}
            </div>
          ))}
          <br />
          <br />
        </div>
      ))}
    </>
  );
}

在原始示例中,// Object {current: Array[3]}我收到消息时,我收到console.log(itemsRef);的区别是,我在我的版本itemsRef.current[condition.id]中将其用作嵌套映射循环,因此i不起作用。

import React, { useRef } from "react";
import "./styles.css";

export default function App() {
  const items = ["sun", "flower", "house"];
  const itemsRef = useRef([]);

  // Object {current: Array[3]}
  console.log(itemsRef);

  return items.map((item, i) => (
    <div key={i} ref={el => (itemsRef.current[i] = el)}>
      {item}
    </div>
  ));
}
TJ人群

在添加refs到时itemRefs您使用的是非数字字符串键,这意味着它们最终将成为数组对象的属性,而不是数组元素的属性,因此其长度保持不变0根据您的控制台,它可能会或可能不会在数组对象上显示非元素属性。

您可以通过使用indexfrom来使它们成为数组元素map(但请继续阅读!):

{cities.condition.map((condition, index) => (
    <div
        key={condition.id}
        ref={el => (itemsRef.current[index] = el)}
    >
        Weather: {condition.weather}
        <br />
        Activity: {condition.activity}
    </div>
))}

但是根据您对这些引用的处理方式,我会避免这样做,而是建议将每个引用都制作成condition自己的组件:

const Condition = ({weather, activity}) => {
    const itemRef = useRef(null);
  
    return (
        <div
            ref={itemRef}
        >
            Weather: {weather}
            <br />
            Activity: {activity}
        </div>
    );
};

然后摆脱itemRefs并做:

{cities.condition.map(({id, weather, activity}) => (
    <Condition key={id} weather={weather} activity={activity} />
))}

即使我们使用数组元素,当前方式的一个问题是,itemRefs即使它们曾经引用的DOM元素消失了(它们也会拥有null),它仍将继续包含三个元素,因为Reactref使用nullwhen调用回调元素被删除,您的代码只是将其存储null在数组中。

或者,您可以使用一个对象:

const itemRefs = useRef({});
// ...
{cities.condition.map(condition => (
    <div
        key={condition.id}
        ref={el => {
            if (el) {
                itemsRef.current[condition.id] = el;
            } else {
                delete itemsRef.current[condition.id];
            }
        }}
    >
        Weather: {condition.weather}
        <br />
        Activity: {condition.activity}
    </div>
))}

或者也许是Map

const itemRefs = useRef(new Map());
// ...
{cities.condition.map(condition => (
    <div
        key={condition.id}
        ref={el => {
            if (el) {
                itemsRef.current.set(condition.id, el);
            } else {
                itemsRef.current.delete(condition.id);
            }
        }}
    >
        Weather: {condition.weather}
        <br />
        Activity: {condition.activity}
    </div>
))}

但是,我还是倾向于制作一个Condition管理自己的引用组件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在R软件的for循环中生成随机数

来自分类Dev

合并循环中生成的多个RDD

来自分类Dev

在for循环中生成goroutine时出现死锁

来自分类Dev

使用R在for循环中生成可再现的结果

来自分类Dev

SQL在WHILE或FOR NEXT循环中生成列名

来自分类Dev

如何访问循环中生成的tk输入字段的内容?

来自分类Dev

在SCSS的for循环中生成线性渐变

来自分类Dev

如何在循环中生成异步方法?

来自分类Dev

传递标签列表以在for循环中生成图形

来自分类Dev

如何编辑在for循环中生成的小部件标签的文本?

来自分类Dev

如何在for循环中生成函数并将其用于多个输入

来自分类Dev

访问名称是在while循环中生成的函数。(蟒蛇)

来自分类Dev

在fork循环中生成随机数

来自分类Dev

如何在Java内部循环中生成LinearLayout的副本

来自分类Dev

JSON-在python循环中生成json

来自分类Dev

Java在for循环中生成随机数

来自分类Dev

在循环中生成具有可变扩展的命令

来自分类Dev

在foreach循环中生成PHP多维数组

来自分类Dev

Stata:使用元组局部宏在循环中生成变量

来自分类Dev

for循环中生成的警报过多

来自分类Dev

R绘制循环中生成的x,y点

来自分类Dev

跟踪在for循环中生成的JButton

来自分类Dev

如何绑定在R中的循环中生成的列

来自分类Dev

在for循环中生成Ajax数据字符串

来自分类Dev

Python在pythonic for循环中生成更多元素

来自分类Dev

如何从循环中生成唯一的ID

来自分类Dev

根据在 Javascript 中的 for 循环中生成的值过滤对象

来自分类Dev

OpenMP - 在 for 循环中生成和终止线程时的开销

来自分类Dev

在循环中生成相同的随机数序列

Related 相关文章

热门标签

归档