【问题标题】:How to display data to table in React Js?如何在 React Js 中将数据显示到表中?
【发布时间】:2021-04-27 12:33:20
【问题描述】:

我正在尝试将通过 API 接收到的一些数据显示到 React Js 中的表中,数据作为对象接收,因此我无法通过它进行映射。在这种情况下,最佳做法是什么?目前数据是硬编码的,但它需要是动态的。

我的代码在CodeSandbox

export default function App() {

  const data ={
    
    "people" :[
      {
        "name":"John",
        "last_name":"Doe",
        "age":"25",
        "Occupation":"driver",
      },
      {
        "name":"Jack",
        "last_name":"Brown",
        "age":"24",
        "Occupation":"it"
      },
      {
        "name":"Oliver",
        "last_name":"Black",

        "age":"30",
        "Occupation":"cto"
      },
    ],

    "format":{"last_name":"Last Name"}
  }
  
  return (
    <div className="App">
     <table>
       <tbody>
         <tr>
           <td>Name</td>
           <td>John</td>
           <td>Jack</td>
           <td>Oliver</td>
           
         </tr>
         <tr>
           <td>Last Name</td>
           <td>Doe</td>
           <td>Brown</td>
           <td>Black</td>
           
         </tr>
         <tr>
           <td>Age</td>
           <td>25</td>
           <td>24</td>
           <td>30</td>
           
         </tr>
         <tr>
           <td>Occupation</td>
           <td>driver</td>
           <td>it</td>
           <td>ceo</td>
         </tr>

         
       </tbody>
     </table>
    </div>
  );
}


需要显示为

Name         John     Jack      Oliver
Last Name    Doe      Brown     Black
Age          25       24        30
Occupation   driver   it        ceo

我不知道如何动态显示数据(以及从 format 部分添加数据。如果有任何建议和帮助,我将不胜感激,谢谢。

【问题讨论】:

    标签: javascript json reactjs object html-table


    【解决方案1】:

    我的方法有些非正统,但您可能仍然感兴趣。我实际上会首先像这样渲染您的数据:

    Name    Last Name   Age Occupation
    John    Doe         25  driver
    Jack    Brown       24  it
    Oliver  Black       30  cto
    

    他们只是使用 CSS 来转置它,这会给它你想要的外观:

    Name         John     Jack      Oliver
    Last Name    Doe      Brown     Black
    Age          25       24        30
    Occupation   driver   it        ceo
    

    所以,渲染部分超级简单:

        <tbody>
              <tr>
                <th>Name</th>
                <th>Last Name</th>
                <th>Age</th>
                <th>Occupation</th>
              </tr>
              {data.people.map((item, i) => (
                <tr key={i}>
                  <td>{item.name}</td>
                  <td>{item.last_name}</td>
                  <td>{item.age}</td>
                  <td>{item.Occupation}</td>
                </tr>
              ))}
        </tbody>
    

    CSS 部分也是如此:

    tr {
      display: block;
      float: left;
    }
    th,td {
      display: block;
      text-align: left;
      padding: 6px;
      border: 1px solid #ccc;
    }
    

    就是这样。哦,这里是sandbox

    【讨论】:

    • 就我个人而言,我不喜欢这样的"trick"。您应该首先对数据进行规范化。
    • @Phong 您已经发布了一种涉及规范化的方法。你宁愿我重新发布你的答案吗?只是想为这个问题提供不同的解决方案。
    • 好吧,这是有道理的,你的把戏是另一种选择。但我认为有很多方法可以规范化数据:D。
    【解决方案2】:

    根本问题是,将您的数据从flat data 标准化为dynamic/aggregated data,通过水平keyvalues 如下结构

    [
      {
        "Name": [
          "John",
          "Jack",
          "Oliver"
        ]
      },
      {
        "Last Name": [
          "Doe",
          "Brown",
          "Black"
        ]
      },
      {
        "Age": [
          "25",
          "24",
          "30"
        ]
      },
      {
        "Occupation": [
          "driver",
          "it",
          "cto"
        ]
      }
    ]
    

    const data ={
        "people" :[
          {
            "name":"John",
            "last_name":"Doe",
            "age":"25",
            "Occupation":"driver",
          },
          {
            "name":"Jack",
            "last_name":"Brown",
            "age":"24",
            "Occupation":"it"
          },
          {
            "name":"Oliver",
            "last_name":"Black",
    
            "age":"30",
            "Occupation":"cto"
          },
        ],
    
        "format":{"last_name":"Last Name"}
      };
    var items  = Object.values(data)[0];
    
    var createOrEdit = (acc, key, value) => {
        var findItem = acc.find(r => r[key] !== undefined);
        if(findItem == undefined)
          acc.push({[key]: [value]});
        else
          findItem[key].push(value);
        
        return acc;
    }
    
    var result = items.reduce((acc, curr) => {
        createOrEdit(acc, 'Name', curr.name);
        createOrEdit(acc, 'Last Name', curr.last_name);
        createOrEdit(acc, 'Age', curr.age);    
        createOrEdit(acc, 'Occupation', curr.Occupation);
        
        return acc;
    }, [])
    
    console.log(result);
      
    for(let item of result){
      console.log(Object.keys(item)[0]);
      console.log(Object.values(item)[0]);
    }

    之后,您可以轻松地基于标准化数据呈现数据,如下所示

    const nomorlizeData = (data) => {
      var items = Object.values(data)[0];
    
      var createOrEdit = (acc, key, value) => {
        var findItem = acc.find((r) => r[key] !== undefined);
        if (findItem === undefined) acc.push({ [key]: [value] });
        else findItem[key].push(value);
    
        return acc;
      };
    
      var result = items.reduce((acc, curr) => {
        createOrEdit(acc, "Name", curr.name);
        createOrEdit(acc, "Last Name", curr.last_name);
        createOrEdit(acc, "Age", curr.age);
        createOrEdit(acc, "Occupation", curr.Occupation);
    
        return acc;
      }, []);
    
      return result;
    };
    
    function App() {
      const data = {
        people: [
          {
            name: "John",
            last_name: "Doe",
            age: "25",
            Occupation: "driver"
          },
          {
            name: "Jack",
            last_name: "Brown",
            age: "24",
            Occupation: "it"
          },
          {
            name: "Oliver",
            last_name: "Black",
    
            age: "30",
            Occupation: "cto"
          }
        ],
    
        format: { last_name: "Last Name" }
      };
    
      var renderData = (items) =>
        items.map((r) => {
          var key = <td>{Object.keys(r)[0]}</td>;
          var values = Object.values(r)[0].map((v) => <td>{v}</td>);
          return (
            <tr>
              {key}
              {values}
            </tr>
          );
        });
      return (
        <div className="App">
          <table>
            <tbody>{renderData(nomorlizeData(data))}</tbody>
          </table>
        </div>
      );
    }
    
    
    
    ReactDOM.render(<App />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    
    <div id="root"></div>

    Codesanbox demo here

    【讨论】:

    • 嗨,很抱歉打扰,但我还有其他问题,您能帮我解决一下吗?基本上,我忘了给数据添加 id,现在我需要给每个 元素添加 id。我用 id 更新了 CodeSandbox。 codesandbox.io/s/compassionate-rain-7o2v2非常感谢您的帮助,谢谢。
    • 哦,我现在很忙。我会尽快回复你。兄弟。也许tmr早上^^!
    • 嗨@nika,您想显示什么新结构和预期数据/结果?
    • 如果您的预期结果是this,您只需将createOrEdit(acc, "id", curr.id); 添加到您的代码中。
    • 您好,感谢您的回复。不,我想将 id 添加到 单元格,例如 value 。我不知道这是否可能。
    【解决方案3】:

    看看这是否有效! https://stackblitz.com/edit/react-ie2rt6

    import React from "react";
    
    const Table = ({ headers, data }) => {
      return (
        <div>
          <table>
            <thead>
              <tr>
                {headers.map(head => (
                  <th>{head}</th>
                ))}
              </tr>
            </thead>
            <tbody>
              {data.map(row => (
                <tr>
                  {headers.map(head => (
                    <td>{row[head]}</td>
                  ))}
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      );
    };
    
    export default Table;
    

    【讨论】:

    • 您的解决方案太复杂了。必须使用太多的 3rd 库而不知道背后的意义 ==> 对你的逻辑思维来说太糟糕了。
    • 首先,您的数据和结构与 OP 无关。其次,您应该解释您的答案中涉及的一些部分。这让我很难理解:(
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签