简体   繁体   English

如何在 React 中处理 map JSON 数据?

[英]How to map JSON data in React?

I want to display a list of icons like this website .我想显示一个像这个网站这样的图标列表。

I have JSON data that stores the family and the name of the icons.我有存储family和图标name的 JSON 数据。 I want to map the JSON to pass the family value and the name value in my component CardItem .我想 map JSON 在我的组件CardItem中传递家族值和名称值。

However, I don't know how to map it correctly.但是,我不知道如何正确 map。 Thanks for your help!谢谢你的帮助!

import React from "react";
import { CardItem } from "./card";

export const List = () => {
  const data = [
    {
      family: "AntDesign",
      names: ["stepforward", "stepbackward", "forward", "banckward"]
    },
    {
      family: "Entypo",
      names: ["500px", "500px-with-circle", "add-to-list", "add-user"]
    }
  ];

  return (
    <>
      <ul>
        {data.map((data, index) => (
          <li key={index}>
            <CardItem
              family={data.family}
              name={data.names.map((name) => name)}
            />
          </li>
        ))}
      </ul>
    </>
  );
};

If you wanted to, you could try to reverse-engineer the DOM on that website.如果您愿意,您可以尝试对该网站上的 DOM 进行逆向工程。 Here is the general flow of the DOM on that site:这是该站点上 DOM 的一般流程:

Files:文件:

  • App.jsx应用程序.jsx
    • icon_data.json icon_data.json
    • ResultContainer.jsx结果容器.jsx
      • ResultRow.jsx结果行.jsx
        • ResultTitle.jsx结果标题.jsx
        • ResultList.jsx结果列表.jsx
          • ResultIcon.jsx结果图标.jsx

Here is a forkable snippet of the code below:这是以下代码的可分叉片段:

https://codesandbox.io/s/react-icon-mapping-qfsp5?file=/src/App.jsx https://codesandbox.io/s/react-icon-mapping-qfsp5?file=/src/App.jsx

icon_data.json icon_data.json

[
  {
    "family": "AntDesign",
    "names": ["stepforward", "stepbackward", "forward", "backward"]
  },
  {
    "family": "Entypo",
    "names": ["500px", "500px-with-circle", "add-to-list", "add-user"]
  }
]

App.jsx应用程序.jsx

import React, { useEffect, useState } from "react";
import iconData from "./icon_data.json";
import ResultContainer from "./ResultContainer";

const fetchIconData = () => Promise.resolve(() => iconData);

const App = () => {
  const [data, setData] = useState([]);

  useEffect(() => {
    fetchIconData().then((jsonData) => setData(jsonData));
  }, []);

  return <ResultContainer data={data} />;
};

export default App;

ResultContainer.jsx结果容器.jsx

import React from "react";
import PropTypes from "prop-types";
import ResultRow from "./ResultRow";

const ResultContainer = (props) => {
  const { data } = props;

  return (
    <>
      {data.map(({ family, names }) => {
        return <ResultRow title={family} icons={names} />;
      })}
    </>
  );
};

ResultContainer.propTypes = {
  data: PropTypes.array.isRequired
};

export default ResultContainer;

ResultRow.jsx结果行.jsx

import React from "react";
import PropTypes from "prop-types";
import ResultTitle from "./ResultTitle";
import ResultList from "./ResultList";

const ResultRow = (props) => {
  const { title, icons } = props;

  return (
    <div className="Result-Row">
      <ResultTitle title={title} />
      <ResultList icons={icons} />
    </div>
  );
};

ResultTitle.propTypes = {
  title: PropTypes.string.isRequired,
  icons: PropTypes.array.isRequired
};

export default ResultRow;

ResultTitle结果标题

import React from "react";
import PropTypes from "prop-types";

const style = {
  background: "#F66667",
  color: "#FFFFFF",
  padding: "1em",
  margin: "0"
};

const ResultTitle = (props) => {
  const { title } = props;

  return (
    <h2 className="Result-Title" style={style}>
      {title}
    </h2>
  );
};

ResultTitle.propTypes = {
  title: PropTypes.string.isRequired
};

export default ResultTitle;

ResultList.jsx结果列表.jsx

import React from "react";
import PropTypes from "prop-types";
import ResultIcon from "./ResultIcon";

const style = {
  display: "flex",
  flexDirection: "row"
};

const ResultList = (props) => {
  const { icons } = props;

  return (
    <div className="Result-List" style={style}>
      {icons.map((icon) => (
        <ResultIcon name={icon} />
      ))}
    </div>
  );
};

ResultList.propTypes = {
  icons: PropTypes.array.isRequired
};

export default ResultList;

ResultIcon.jsx结果图标.jsx

import React from "react";
import PropTypes from "prop-types";

const containerStyle = {
  display: "flex",
  flexDirection: "column",
  flex: 1,
  justifyContent: "center",
  padding: "0.5em",
  outline: "thin solid rgb(238, 238, 238)"
};

const iconStyle = {
  fontWeight: "normal",
  fontSize: "2em",
  textAlign: "center"
};

const titleStyle = {
  fontSize: "smaller",
  fontWeight: "normal",
  textAlign: "center",
  margin: "0"
};

const ResultIcon = (props) => {
  const { name } = props;

  return (
    <div className="Result-Icon-Container" style={containerStyle}>
      <span className="Result-Icon" style={iconStyle}>
        ☺
      </span>
      <h4 className="Result-Icon-Name" style={titleStyle}>
        {name}
      </h4>
    </div>
  );
};

ResultIcon.propTypes = {
  name: PropTypes.string.isRequired
};

export default ResultIcon;

You can do the following,您可以执行以下操作,

import React from "react";
import { CardItem } from "./card";

export const List = () => {
  const data = [
    {
      family: "AntDesign",
      names: ["stepforward", "stepbackward", "forward", "banckward"]
    },
    {
      family: "Entypo",
      names: ["500px", "500px-with-circle", "add-to-list", "add-user"]
    }
  ];

  return (
    <>
      <ul>
        {data.map((item, index) => (
          <li key={index}>
            {item.names.map((name) => {
               return <CardItem
                    family={item.family}
                    name={name}
            />

            })
            }
          </li>
        ))}
      </ul>
    </>
  );
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM