TypeError:无法读取 React 未定义的属性“标题”
Posted
技术标签:
【中文标题】TypeError:无法读取 React 未定义的属性“标题”【英文标题】:TypeError: Cannot read property 'title' of undefined for React 【发布时间】:2020-12-05 08:41:59 【问题描述】:我试图从应用组件中的状态访问一个数组,但我不知道为什么它不起作用
import React from "react";
import "./App.css";
//import Category from "./components/Category";
class App extends React.Component
constructor()
super();
this.state =
categories: [],
;
componentDidMount()
//const addon = Math.floor(Math.random() * 1000);
fetch("http://jservice.io/api/categories?count=5")
.then((response) => response.json())
.then((data) =>
var arr = [];
for (var x in data)
console.log(arr.push(data[x]));
console.log(data[x]);
this.setState(
categories: arr,
);
);
render()
return <div>this.state.categories[0].title</div>;
export default App;
对于上下文,这是我从 API 获取的 JSON
["id":11531,"title":"mixed bag","clues_count":5,"id":11532,"title":"let's \"ch\"at","clues_count":5,"id":5412,"title":"prehistoric times","clues_count":10,"id":11496,"title":"acting families","clues_count":5,"id":11498,"title":"world city walk","clues_count":5]
似乎每个对象都应该有一个标题,但 js 另有说明
【问题讨论】:
【参考方案1】:当应用程序第一次加载时,它还没有来自 API 的内容,因此您试图访问一个空数组的第一个元素。因此,即使 API 调用很快,也总会出现这种categories
数组为空的状态。所以在render
方法中,你需要检查数组是否有一些值。
render()
if (this.state.categories.length === 0)
return <div>No categories</div>
return <div>this.state.categories[0].title</div>;
【讨论】:
componentDidMount() 在 render() 之前发生,不是吗?编辑:刚刚试了一下,它奏效了!非常感谢! 是的,但是 fetch 是异步的,总是会花费更多时间(考虑网络慢,甚至请求失败)【参考方案2】:class App extends React.Component
constructor()
super();
this.state =
categories: [],
;
componentDidMount()
//const addon = Math.floor(Math.random() * 1000);
fetch("http://jservice.io/api/categories?count=5")
.then((response) => response.json())
.then((data) =>
let arr = Object.assign([], this.state.categories);
arr = data;
//the `data` you are getting is in an array.
this.setState(
categories: arr,
);
);
render()
return <div>this.state.categories && this.state.categories[0] && this.state.categories[0].title</div>;
export default App;
组件渲染时,此时state中的categories数组为空。它试图在一个空数组中找到title
键。这就是它抛出错误的原因。
请务必检查条件
【讨论】:
【参考方案3】:当您在这里进行网络调用并获取数据时,这将是一个副作用(异步调用)。所以 React 生命周期从 componentDidMount() -> render() 开始,所以同时this.state.categories
的长度为 0,因为你用一个空数组初始化它。
为避免此类错误,最好进行条件渲染,例如如果数组不为空,则仅渲染所需的标题。
render()
return this.state.categories.length>0 ? <div>this.state.categories[0].title</div> : null;
【讨论】:
以上是关于TypeError:无法读取 React 未定义的属性“标题”的主要内容,如果未能解决你的问题,请参考以下文章
React - TypeError:无法读取未定义的属性“img”
TypeError:无法读取未定义的属性“长度”(React,heroku)
未处理的拒绝(TypeError):在 React 中使用 useRef 时无法读取未定义的属性(读取“值”)
React Native - TypeError:无法读取未定义的属性“干净”