如何将 id 传递给 React Js 中表中的每个 <td>?

Posted

技术标签:

【中文标题】如何将 id 传递给 React Js 中表中的每个 <td>?【英文标题】:How pass id to each <td> in table in React Js? 【发布时间】:2021-04-28 19:20:23 【问题描述】:

每个人。我正在尝试将 id 传递给表中的每个 td 以获取通过 API 接收的数据,以便每个表数据单元格都有自己的 id。到目前为止,代码看起来像这样

CodeSandbox

const normalizeData = (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;
;

export default function App() 
  const data = 
    people: [
      
        id: "1",
        name: "John",
        last_name: "Doe",
        age: "25",
        Occupation: "driver"
      ,
      
        id: "2",
        name: "Jack",
        last_name: "Brown",
        age: "24",
        Occupation: "it"
      ,
      
        id: "3",
        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(normalizeData(data))</tbody>
      </table>
    </div>
  );


结果如下:

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

我需要将 API 数据中的 id 传递给所有具有相同 id 的 td-s,例如:

<td id="1">John </td>  
<td id="1">Doe </td>      
<td id="1">25    <td/>  
<td id="1">driver </td>
<td id="2">Jack </td>
<td id="2">Brown </td>
<td id="2">24 </td>
<td id="2">it </td>

我需要实现这一点,例如,当我选择 id 1 时,将包含所有 id:1 的 td 单元格。

我对 React 和 javascript 还很陌生,所以我找不到实现它的方法。非常感谢任何帮助和建议。谢谢。

【问题讨论】:

那是无效的 html,元素 ID 必须是唯一的。您拥有做出渲染决策所需的数据,无需将其编码到 HTML 中以对其进行过滤。而是在渲染时使用它,当过滤器发生变化时,React 会渲染不同的项目......这就是 React 背后的整体理念。 @dpwrussell,您好,感谢您的回复。我明白了,那么在这种情况下我该如何操作数据呢?例如,如果我需要选择 id:1 的所有数据?谢谢。 使用useState 存储您的数据。还存储您的过滤器是什么,在这种情况下是某种选择。然后使用选择只选择要渲染的有效项目并仅渲染这些项目。 React 负责其余的工作。 @dpwrussell,我理解这个想法,但我是新手,恐怕我自己无法创建这样的功能。如果不是很麻烦,你能分享一些例子吗? 【参考方案1】:

你的代码是这样设置的:

var values = Object.values(r)[0].map((v, **idx**) => (
    <td **className=idx**>v</td>
  ));

但我认为您应该在数据中包含索引,而不是依赖数组索引。

【讨论】:

@SSDMan,您好,感谢您的回复。我需要从 API 数据中传递 id,因此当我将更改应用于例如 id:1 时, 中具有相同 id 的所有数据都会更改。 【参考方案2】:
const [tableData, setTableData] = useState(data);

.....

// any logic that change data
...
setTableData(modifiedData);


....
renderData(normalizeData(tableData))



使用 react,只要有状态变化,它就会重新渲染,所以每当你修改数据后,setTableData 将设置新的状态和数据到tableData,它会再次调用renderData(normalizeData(tableData))

编辑:如果你真的想给所有td一个id,不要使用id,在html中使用data属性,比如data-id,你可以搜索更多关于data属性的信息

【讨论】:

嗨,我只需要将数据 Api 中的 id 传递给每个 单元格,因此当我在代码中的某处对 id 应用更改时,所有具有相同 id 的数据都会更改。我不需要单击行本身。

以上是关于如何将 id 传递给 React Js 中表中的每个 <td>?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React js 中的上下文将函数从 FUNCTIONAL 传递给 CLASS 组件并在渲染之外(没有 prop)访问它?

如何使用 React 中的 CSS 模块将多个类动态传递给子组件

如何将点击的卡片按钮 id 传递给 vue.js 中的后端 URL 路径?

如何在 React 中将不同的道具从父组件传递给多个子组件?

如何将点击卡片的 id 和卡片内容传递给 vue.js 中的另一个组件?

如何将状态传递给 firebaseConnect 中的 doc 属性