javascript - 在 React 中不使用条件渲染时无法读取属性“地图”
问题描述
我试图渲染这段代码,.map()
但日期时出现错误。(第 50 行):
无法读取未定义的属性“地图”
在我使用条件渲染后{dates && dates.map((item) => <DateItem item={item} />)}
,渲染成功。
我不明白的是为什么我应该使用日期。
当我只渲染 line47 和 line48 时,我不需要使用条件渲染。
是渲染速度的问题吗?
如果我使用条件渲染,日期状态何时生成?
import React, { useState, useEffect } from "react";
const DateItem = ({ item }) => {
return (
<div>
<div>{item.day}</div>
<div>{item.date}</div>
</div>
);
};
const Dates = () => {
const [date, setDate] = useState();
const [day, setDay] = useState();
const [dates, setDates] = useState();
const getDateArr = () => {
let arr = [];
var weekday = new Array(7);
weekday[0] = "sunday";
weekday[1] = "monday";
weekday[2] = "tuesday";
weekday[3] = "wednesday";
weekday[4] = "thursday";
weekday[5] = "friday";
weekday[6] = "saturday";
for (let i = 0; i < 31; i++) {
let d = new Date();
d.setDate(d.getDate() - i);
let date = d.getDate();
let day = weekday[d.getDay()];
arr.push({ day, date });
}
// console.log(arr);
return arr;
};
useEffect(() => {
setDate(new Date().getFullYear());
setDay(new Date().getMonth());
setDates(getDateArr());
}, []);
return (
<>
<div className="dateSection">
<div className="head">날짜</div>
<div className="year">{date}</div> // line47
<div className="month">{day}</div>
<div className="dates">
{dates.map((item) => ( // <=error line50
<DateItem item={item} />
))}
</div>
</div>
</>
);
};
export default Dates;
解决方案
问题是.map()
只能在数组上调用。也是异步setDates
发生的,这就是为什么您在组件中的第一次渲染中具有价值。您可以设置默认的空数组值。或者您可以测试它是否具有 then或with以外的值。undefined
dates
dates
useState([])
dates
null
undefined
&&
尝试以下操作:
const [dates, setDates] = useState([]);
或检查null
orundefined
值:
{dates && dates.map((item) => (
<DateItem item={item} />
))}
我希望这有帮助!
推荐阅读
- node.js - Docker 容器必须在提升的权限上运行
- android - 使用 Unity + Oculus Quest 的最终 apk 中不包含 Android 权限
- android - 如何在 Kotlin 中设置和使用属性?
- rust - 安装目录的编译时配置
- javascript - 使用 Nookies 获取令牌时出现 FirebaseAuthError。(NextJS)
- python - 无法导入拥抱脸转换器
- typescript - MobX-State-Tree 中的类型化通用动作
- python - Python3多线程?
- javascript - 简洁地包装跨度标签中的每个单词
- heroku - Heroku discord bot 不断重启