尝试使用数组映射函数时,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
问题: 此处的问题是您的组件试图在获取或设置为数组之前呈现“标签”。
解决方案:
-
将标签的默认值设为 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