如何将 JSON 数组映射到 ReactJS 中的列表?

IT技术 javascript json ajax reactjs
2021-05-01 11:57:42

我正在从http://jsonplaceholder.typicode.com/users请求一个示例 JSON 数组,并在 ReactJS 项目中使用该数组的名称值创建一个项目列表。

该列表是一个Grommet列表,我使用该.map函数将 Web 服务数据映射到每个列表项。

但是当代码呈现时,而不是使用 Web 服务创建名称列表。它将只创建一个列表项,使得调用.maprows.push

问题:

如何在 ReactJS 中将 JSON 数组映射到列表?

在此处输入图片说明

这是我尝试过的,首先通过 AJAX GET 获取 Web 服务,然后调用 .map 将该数据映射到列表:

loadNameData() {
    $.ajax({
      url: 'http://jsonplaceholder.typicode.com/users',
      dataType: 'json',
      success: function(data) {
        this.setState({data: data});
      }.bind(this),
      error: function(xhr, status, err) {
        console.error('#GET Error', status, err.toString());
      }.bind(this)
    });
  }

  getInitialState(){
    return {
       data: {
          names: [] 
       }
    };
  }

  componentDidMount() {
    this.loadAssetData();
  }

  render() {
      let layerNode;
      var rows = [];

      layerNode = (
        <Layer flush={true} closer={true} onClose={() => this._onCloseLayer()} align='right'>
          <Box pad='medium' colorIndex='grey-3'>
            <Heading>Filter Options</Heading>
            <Label>Names</Label>
                this.props.data.names.map(function(name) {
                    rows.push(<ListItem justify="between">)
                    rows.push(<span>)
                    rows.push({name})
                    rows.push(</span>)
                    rows.push(</ListItem>)
                }
                <List selectable={true} selected={0}>       
                    {rows}
                </List>           
          </Box>
        </Layer>
      );  

    return (
      <Section pad="small" full="vertical" flex={true}>         
                {layerNode}             
      </Section>
    );
  }
1个回答

我在这里看到了一些问题,希望我能够解决所有问题。

1)我在评论中提到了这一点,但看起来你不明白.map()应该做什么。 这是一个参考

tl; dr:调用.map()可迭代对象并传递要在每个项目上执行的函数将返回该函数的返回值的集合。

例如,考虑一个有几个名称的数组['Michael', 'Brian', 'John']我可以调用.map()这个数组并使用它返回一个字符串数组,对列表中的每个人说“你好”:

var names = ['Michael', 'Brian', 'John'];
var sayHello = names.map(function (name) {
    return 'Hello, ' + name;
});
console.log(sayHello); // ['Hello, Michael', 'Hello, Brian', 'Hello, John'];

这可以在 React 中用于执行类似于“给定一些名称,返回一些表示这些名称的标记的 React 组件”的逻辑。

2) 您链接的 JSON 数据是一个对象数组,每个对象都有自己的name属性。看起来您正在使用 jQuery 来获取它并将结果保存在this.state.data. 这意味着这this.state.data 是一个数组因此,如果您尝试这样做this.state.data.names.map(),它将失败,因为this.state.data.names未定义。你会想做的this.state.data.map()

3) 在 JSX 内部,您可以执行 JavaScript 表达式/语句,只要它们在花括号内即可{}看起来你不是这样做的。

4) 你的电话.map()this.props.data,我想你想做this.state.data

这是我所看到的一切,在它开始按预期工作之前应该修复或改进。如果是我,我会将您的.map()呼叫保留<List />您要呈现的对象中:

<List selectable={true} selected={0}>       
    {
        this.state.data.map(function (person) {
            return (
                <ListItem justify="between">
                    <span>{person.name}</span>
                </ListItem>
            );
        })
    }
</List>

或者,一个更简洁的解决方案是将这个逻辑拉出到它自己的辅助函数中。但这并不是必须的。

编辑:这是一个演示