【问题标题】:Return everything instead of just the first key item using .map in React JSX在 React JSX 中使用 .map 返回所有内容,而不仅仅是第一个关键项
【发布时间】:2023-03-07 17:39:01
【问题描述】:
const table_body = [
  {
    id: "1",
    first_name: "Test",
    last_name: "Again",
    email: "test@gmail.com",
  },
  {
    id: "2",
    first_name: "Joe",
    last_name: "Bidal",
    email: "jb@gmail.com",
  }
]          

这是我的对象数组。

<tbody className="lh-copy">
    <tr className="stripe-dark">
      {Object.values(this.props.table_body).map((item, i) => {
      for (const item of Object.values(item)) {
        return (
            console.log(item)
            // <td key={i} className="pa3">{item}</td>

        }
      })}
    </tr>
</tbody>

我有一个表格组件,我正在根据对象数组动态返回表格的值。我想用动态数据制作一个动态表。

我不想使用多个 &lt;td&gt; 标签,因为我希望用户能够添加更多输入,并且对象的内容不仅仅是 id、first_name、last_name 和 email,它可能更多{item .id}....... 不适用于我的情况。

当我阅读返回的 console.log 时,它只显示 1 和 2,这是 id 号。如果我删除 return(),它将显示 id、first_name、last_name、email。

问题是如何在 console.log 或 td 标签中返回所有内容?我尝试在 return() 中使用 for 循环,但它显然不起作用。

更新:这是我的工作代码部分,感谢@kind_user

    {table_body.map((item, i) => {
      return (
        <tr key={i} className="stripe-dark">
          {Object.keys(item).map((element, j) => {
            return(
              <td key={j} className="pa3">{element}</td>
            )
          })}
        </tr>
      )
    })}

【问题讨论】:

    标签: reactjs jsx


    【解决方案1】:
    • return 关键字在第一个循环后中断循环,这就是为什么你只得到第一个元素。

    • table_body 是一个数组。 Object.values 函数是多余的。

    • 你把&lt;tr /&gt;放错地方了。

    建议的方法:

    {table_body.map((item, i) => (
       <tr className="stripe-dark" key={i}>
          {Object.values(item).map((elem) => <td className="pa3">{elem}</td>)}
       </tr>
    )}
    

    【讨论】:

    • 但是Object.values() 可能是迭代值的不好方法,因为顺序是随机的,并且可以针对每一行进行更改。此外,您还需要另一个 key 用于 &lt;td&gt;
    • 非常感谢@kind 用户,我在帖子中发布了我的工作代码部分。
    • @Sulthan 说得好,请考虑将您的 Object.values 更改为 Object.keys 函数。
    • 我可能会遍历键的固定顺序,例如['id', 'first_name', 'last_name', 'email']
    • @Sulthan,这是一个很好的观点。在开发我的应用程序时,我会牢记这一点。我组成对象数组只是为了测试如果我有这种数据结构,React 可以做什么。
    【解决方案2】:

    通过数组映射将分别为您提供每个对象。

      <tbody className="lh-copy">
        {table_body.map((item, index) => (
          <tr className="stripe-dark" key={index}>
            <td className="pa3">{item.id}</td>
            <td className="pa3">{item.email}</td>
          </tr>
        ))}
      </tbody>
    

    沙盒:https://codesandbox.io/s/kor9lwvn87

    【讨论】:

    • 这种方式不是动态的。不应仅将其固定为 {item.id}、{item.first_name}、{item.last_name}、{item.email}
    • 这会将所有内容都放在一个单元格中
    • 这只是一个示例,您可以在返回中返回任意数量的 td,而不仅仅是一个,而且@kind 用户的 Object.values 是更通用的方法。
    • 感谢您的努力,我在自己的帖子中发布了我的工作代码部分
    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 2016-03-26
    • 2011-02-18
    • 2017-11-26
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多