reactjs - 如何在 React TS 中为对象(Map 数据结构)中的每个项目渲染自定义元素?

标签 reactjs dictionary state react-tsx

我一直在使用此方法从数组中渲染多个自定义元素,但这是我第一次使用 map 数据结构来执行此操作。它编译得很好,但什么也不渲染。我已经设置了一个codesandbox here .

import "./styles.css";
import React from "react";
import ImageGrid from "./ImageGrid";

interface OnlineImage {
  id: string;
  url: string;
}

export default function App() {
  const [onlineImages, setOnlineImages] = React.useState<Map<string, OnlineImage[]>>();
  
  React.useEffect(() => {
    let onlineImageMap = new Map<string, OnlineImage[]>();

    // fake api call
    onlineImageMap.set("randomImageSet1", [
      { id: "1", url: "https://picsum.photos/200" },
      { id: "2", url: "https://picsum.photos/200" }
    ]);
    onlineImageMap.set("randomImageSet2", [
      { id: "1", url: "https://picsum.photos/200" },
      { id: "2", url: "https://picsum.photos/200" }
    ]);

    // set state
    setOnlineImages(onlineImageMap);
  }, []);

  return (
    <div className="App">
      <div>Below should render my custom ImageGrid for each item in map...</div>
      <>
        {onlineImages?.forEach((imageSet, category) => {
          return (
            <>
              <div>Image Category: {category}</div>
              <ImageGrid images={imageSet} />
            </>
          );
        })}
      </>
    </div>
  );
}

最佳答案

Hi Samuel:我认为您应该首先将映射转换为数组,然后使用 Array.prototype.map 方法,该方法实际上返回原始数组的副本,并应用了您的函数。

正如您可能已经发现 return 语句在 forEach 函数中不执行任何操作(更准确地说,它仅停止代码的执行,但不会返回任何进入外部上下文的内容)。

如果您确实想使用 forEach,则必须使用数组或对象来捕获它,然后使用 Object.entries/.map 对其进行迭代


const myMap = new Map(Object.entries({a: 1, b: 2}))
const myMapCaptureList = []
myMap.forEach((value, key) => {
myMapCaptureList.push([key, value])
}
// then you can use myMapCaptureList
myMapCaptureList.map(([key, value]) => <div>{key}: <span>{value}</span></div>);

但我建议使用非常有用的 Array.from 方法要容易得多,该方法可以帮助将 Map 转换为键/值对条目数组:[[key1 , val1], [key2, val2]]。它本质上相当于运行Object.entries(someObject)

{Array.from(onlineImages || []).map(([category, imageSet]) => {
          return (
            <>
              <div>Image Category: {category}</div>
              <ImageGrid images={imageSet} />
            </>
          );
        })}

关于reactjs - 如何在 React TS 中为对象(Map 数据结构)中的每个项目渲染自定义元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71591406/

相关文章:

javascript - 使用 setInterval 和 FileReader 定期记录文件的内容

python - 在 Python 字典中保留不同值的最小键

python - 为什么在 python map() 和 multiprocessing.Pool.map() 中得到不同的答案?

python - 查找字典中所有唯一的键对

reactjs - 如何从使用状态 Hook 的功能父组件传递 Prop ?

ios - 如何在 itunesconnect 上查看我的 ios 应用程序版本历史详细信息

reactjs - React Hooks,如何实现useHideOnScroll hook?

javascript - 如何通过 React 组件传递函数

javascript - React.js 中未定义的方法

javascript - 从 javascript/jquery 与 ReactJS 组件交互