TypeError:绑定标签json数据(可能为null)时,无法读取null的属性“ map”

时间:2019-02-28 08:54:11

标签: javascript reactjs redux antd

我的数据库中有一些记录,但并非所有记录都有标签,有些记录可能为空,它们存储在CosmosDb上并作为Json数组返回。

我正在使用antd表和标签: https://ant.design/components/table/

示例:标签

我有以下代码:

import React, { Component } from 'react';
import {  Table, Tag} from 'antd';
import { adalApiFetch } from '../../adalConfig';
import Notification from '../../components/notification';

class ListPageTemplatesWithSelection extends Component {

    constructor(props) {
        super(props);
        this.state = {
            data: []
        };
    }

    fetchData = () => {
        adalApiFetch(fetch, "/PageTemplates", {})
          .then(response => response.json())
          .then(responseJson => {
            if (!this.isCancelled) {
                const results= responseJson.map(row => ({
                    key: row.Id,
                    Name: row.Name,
                    SiteType: row.SiteType,
                    Tags: row.Tags
                  }))
              this.setState({ data: results });
            }
          })
          .catch(error => {
            console.error(error);
          });
      };


    componentDidMount(){
        this.fetchData();
    }

    render(){
        const columns = [
                {
                    title: 'Id',
                    dataIndex: 'key',
                    key: 'key',
                }, 
                {
                    title: 'Name',
                    dataIndex: 'Name',
                    key: 'Name',
                }, 
                {
                    title: 'Site Type',
                    dataIndex: 'SiteType',
                    key: 'SiteTy[e',
                },{
                  title: 'Tags',
                  key: 'Tags',
                  dataIndex: 'Tags',
                  render: Tags => (
                    <span>
                      {Tags.map(tag => {
                        let color = tag.length > 5 ? 'geekblue' : 'green';
                        if (tag === 'loser') {
                          color = 'volcano';
                        }
                        return <Tag color={color} key={tag}>{tag.toUpperCase()}</Tag>;
                      })}
                    </span>
                  ),
                }
        ];

        const rowSelection = {
            selectedRowKeys: this.props.selectedRows,
            onChange: (selectedRowKeys) => {
              this.props.onRowSelect(selectedRowKeys);
            }
          };


        return (
            <Table rowSelection={rowSelection}  columns={columns} dataSource={this.state.data} />
        );
    }
}

export default ListPageTemplatesWithSelection;

但是我有这个错误:

 58 | dataIndex: 'Tags',
  59 | render: Tags => (
  60 |   <span>
> 61 |     {Tags.map(tag => {
  62 |       let color = tag.length > 5 ? 'geekblue' : 'green';
  63 |       if (tag === 'loser') {
  64 |         color = 'volcano';

我不确定此错误是否是因为某些行没有标签,还是由于其他原因而导致的错误,无论如何,我不确定应该怎么做才能避免这种情况。

2 个答案:

答案 0 :(得分:1)

如果“标记”可能为空,则必须添加一个检查,以免将其映射到渲染上

<span>
  {Tags && Tags.map(tag => {
    let color = tag.length > 5 ? 'geekblue' : 'green';
    if (tag === 'loser') {
      color = 'volcano';
    }
    return <Tag color={color} key={tag}>{tag.toUpperCase()}</Tag>;
  })}
</span>

答案 1 :(得分:1)

您可以在映射标签之前尝试检查标签是否存在

render: Tags => (
    <span>
      { Tags ? Tags.map(tag => {
        let color = tag.length > 5 ? 'geekblue' : 'green';
        if (tag === 'loser') {
          color = 'volcano';
        }
        return <Tag color={color} key={tag}>{tag.toUpperCase()}</Tag>;
      })
      : ''}
    </span>
)