开发者问题收集

尝试使用数组映射函数时,React 属性未定义

2021-05-02
1399

我从 API 中收到一个对象,其中包含一些简单属性和一个字符串数组。我尝试使用 map 函数显示此数组,但当我尝试使用 map 函数时,我的应用程序会中断并抛出“TypeError:tags 未定义”。代码:

import React, { Component } from 'react';
import {useParams} from "react-router-dom";
import VideoPlayer from "../Video/VideoPlayer";
import { withRouter } from "react-router";

class VideoDetails extends Component {
constructor(props) {
    super(props);
    this.state = 
    {
        video: {}
    }
}

componentDidMount() {
    const url = "https://localhost:44362/api/Video/" + this.props.id;
    fetch(url)
    .then(resp => resp.json())
    .then(json => this.setState({ video: json }))
  }

render() {
    const {video} = this.state;
    const tags = video.tags;

    console.log(tags);
    console.log(video);

    return (
        <div>
            <h1>{video.title}</h1>
            <VideoPlayer />

            <h2>Video ID {video.id}</h2>
            <br></br>
            <h3>Description</h3>

            <p>{video.description}</p>

            <h3>Tags</h3>
            <ul>
                {
                    tags.map(
                        (tag) => 
                        (
                            <li>{tag}</li>
                        )
                    )
                }
            </ul>
        </div>
    );
}
}

export default VideoDetails;

我感觉它不知道 video.tags 是一个数组,但我不太确定如何解决这个问题。我可以删除 map 函数并直接打印出数组,但 map 不起作用。我不太清楚我在这里做错了什么,我遇到的很多示例似乎都是直接处理数组。

3个回答

我认为这是因为最初您的状态对象 - 视频为空。componentDidMount 将在客户端首次渲染后执行。因此,基本上,将首先调用 render 方法,然后调用 componentDidMount。因此,由于最初,您在视频状态对象中没有 tags 键 - 您的 const tags 变量未定义。

您应该在 render 方法中添加一个检查 - 检查渲染期间是否存在 tags 数组。

Shubham Jawandhiya
2021-05-02

问题: 此处的问题是您的组件试图在获取或设置为数组之前呈现“标签”。

解决方案:

  1. 将标签的默认值设为 0。

    this.state = { video: { tags:0}

2)更改地图部分

{
this.state.video.tags===0?'Loading':this.state.video.tags.map( (tag) => 
(
<li>{tag}</li>
)
)
}
restricted-beam
2021-05-02

这是因为,当组件首次呈现时,您尝试在 tags 属性上运行循环(该属性在初始页面加载时未定义)。请尝试以下条件来防止出现此问题

{tags && tags.map((tag) => <li>{tag}</li>) }
Nikhil
2021-05-02