【问题标题】:react js iterate over array in Component props反应js迭代组件道具中的数组
【发布时间】:2020-01-27 18:38:18
【问题描述】:

我有一个需要传递数据的组件,在数组中搜索。数组存储在变量中,数据需要转到 Component prop。考虑以下事项;

const users = [
   {"id": 1, "username": 'name1'},
   {"id": 2, "username": 'name2'},
   {"id": 3, "username": 'name3'},
   {"id": 4, "username": 'name4'},
   {"id": 5, "username": 'name5'}
]

const listItemData = [1,2,3];

<List
    size="small"
    bordered
    dataSource={listItemData}
    renderItem={item => <List.Item>{item}</List.Item>}//need name1, name2, name3 but get 1,2,3 here
/>

所以在这里我有一个用户数组,其中存储了有关所有用户的所有数据,以及我只有 id 的特定列表项数组。出于渲染目的,我需要渲染用户名而不是 id。据我所知,我可以遍历组件 renderItem 道具中的用户 ID,并显示与其 ID 匹配的用户 username 与来自 listItemData 的 ID。

欢迎任何想法如何做到这一点。谢谢你

【问题讨论】:

标签: javascript reactjs


【解决方案1】:
const users = [
  {"id": 1, "username": 'name1'},
  {"id": 2, "username": 'name2'},
  {"id": 3, "username": 'name3'},
  {"id": 4, "username": 'name4'},
  {"id": 5, "username": 'name5'}
];

const ids = [1,2,3];

const listItems = users.reduce((a, c) => {
  a[c.id] = c.username;
  return a;
}, {});

<List
  size="small"
  bordered
  dataSource={ids}
  renderItem={id => <List.Item>{listItems[id]}</List.Item>}
/>

【讨论】:

  • 对不起,如果数组不是串联的,你的逻辑就会出错,你的逻辑就会失败。 var users = [ {"id": 10, "username": 'name1'}, {"id": 9, "username": 'name2'}, {"id": 0, "username": 'name3' }, {"id": 4, "username": 'name4'}, {"id": 5, "username": 'name5'} ]; var ids = [1,2,3]; var listItems = users.reduce((a, c) => { a[c.id] = c.username; return a; }, {});//{0: "name3", 4: "name4", 5: "name5", 9: "name2", 10: "name1"} 这是错误的并产生错误的结果
  • 如果输入错误,我不认为显示空白项是个大问题。错误的输入,错误的结果。只要不坏就没事。
  • 这是一个测试用例,应该考虑。您的整个假设是基于问题中未提出的输入序列
  • OP 可以轻松考虑。例如,他可以在 renderItem 方法中添加|| N/A。这不是问题的重点。
【解决方案2】:
import React from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import './index.css';
import { List, Avatar } from 'antd';

const users = [
  {"id": 1, "username": 'name1'},
  {"id": 2, "username": 'name2'},
  {"id": 3, "username": 'name3'},
  {"id": 4, "username": 'name4'},
  {"id": 5, "username": 'name5'}
]

const listItemData = [1,2,3];


const data = users.filter((user)=>listItemData.includes(user.id))
ReactDOM.render(
  <List
    itemLayout="horizontal"
    dataSource={data}
    renderItem={item => (
      <List.Item>
        <List.Item.Meta          
          title={<a href="https://ant.design">{item.username}</a>}          
        />
      </List.Item>
    )}
  />,
  document.getElementById('container'),
);

您需要过滤掉这些值,然后将其设置为新数据源。顺便说一句,您在代码中采用了错误的数据源。首先过滤掉匹配的数据,然后它就像一个魅力!!!

【讨论】:

  • 是否可以在不更改数据源的情况下做同样的事情。我从状态中获取数据源,不幸的是我无法将其更改为对象数组,我只得到整数数组。谢谢
  • 组件会遍历数据源,如果不正确,那么您将如何获得正确的数据。您的数组将始终包含 [1,2,3]。您需要使来源正确。
  • 您可以简单地将这段代码复制并粘贴到codesandbox.io/s/3052nky8q 中,然后查看我想要告诉您的内容。
  • FWIW,includes 不适用于 IE。最好使用indexOf
  • 仅供参考,反应 js 代码已内置 babel 以执行此操作,无论浏览器如何
猜你喜欢
  • 2017-08-15
  • 2019-05-31
  • 2022-06-14
  • 1970-01-01
  • 2019-11-18
  • 2019-01-08
  • 2020-12-25
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多