reactjs - 反应组件中的问题
问题描述
我在以下组件中遇到问题,似乎该组件未呈现,并且我在控制台中收到以下错误:“无法读取属性 'operationalHours' of null”。我不明白为什么 operationHours 它是空的。也许有人可以帮助我为这个问题提供一个可能的解决方案。这是组件:
import React, { useState, useEffect } from 'react';
import Search from 'client/components/ui/Search';
import { performSearchById } from 'client/actions/api/search';
import { get } from 'lodash';
import {
SEARCH_STORE_NOT_CLOSED,
SEARCH_STORE_OPEN_TEXT,
SEARCH_STORE_CLOSED_TEXT
} from 'app/client/constants/values';
import DownArrow from 'components/UI/icons/DownArrow';
import styles from './styles.module.scss';
const StoreDetails = ({ storeInfo }) => {
const [expanded, setIsExpanded] = useState(false);
const [storeData, setStoreData] = useState(null);
useEffect(() => {
async function fetchData() {
const storeId = storeInfo.store_id;
const {
data: {
Location: {
contactDetails: { phone },
operationalHours
}
}
} = await performSearchById(storeId);
setStoreData({ phone, operationalHours });
}
fetchData();
}, [storeInfo.store_id]);
const infoText = expanded ? 'Hide details' : 'View details';
function parseHours(hours) {
const formattedHours = {};
hours.forEach(dayObj => {
const closed = get(dayObj, 'closed', '');
const day = get(dayObj, 'day', '');
if (closed === SEARCH_STORE_NOT_CLOSED) {
const openTime = get(dayObj, 'openTime', '');
const closeTime = get(dayObj, 'closeTime', '');
if (openTime === null || closeTime === null) {
formattedHours[day] = SEARCH_STORE_OPEN_TEXT;
} else {
formattedHours[day] = `${openTime}-${closeTime}`;
}
} else {
formattedHours[day] = SEARCH_STORE_CLOSED_TEXT;
}
});
return formattedHours;
}
const storeHours = storeData.operationalHours
? parseStoreHours(storeData.operationalHours)
: '';
return (
<div className={styles.viewStoreDetails}>
<span
className={expanded ? styles.expanded : undefined}
onClick={() => setIsExpanded(!expanded)}
>
<DownArrow />
</span>
<div>
<span className={styles.viewStoreDetailsLabel}>{infoText}</span>
<div>
{expanded && (
<Search
phoneNumber={storeData.phone}
storeHours={storeHours}
/>
)}
</div>
</div>
</div>
);
};
export default StoreDetails;
解决方案
这是因为您正在设置storeData
组件第一次渲染之后的值。storeData
您的默认值为null
.
它在这里中断:storeData.operationalHours
因为null
不是一个对象,因此不能拥有可以访问它的属性。
您可能应该将初始状态设置为更能代表您的实际状态:
const [storeData, setStoreData] = useState({}); // Or even add keys to the object.
还可以在这里阅读有关useEffect
钩子及其运行时间的信息。似乎根本问题是对何时填充数据的误解。
推荐阅读
- python - Matplotlib,限制图表中的条数
- google-chrome - 如何确定 Chrome 中的 cookie 问题?
- c# - 当应用程序在后台 Xamarin.Android 中时,无法第二次获得意图额外的文本
- sql - 在 postgresql 中有一组指令的函数中,查询没有结果数据的目的地
- ios - 如何定义具有动态缓冲区声明的金属着色器?
- php - 当我在 foreach 循环中(使用 post 方法)时无法访问输入的值
- android - ArrayList 在初始化后立即为空
- python - groupby + apply 导致一系列同时出现在索引和列中 - 如何防止它?
- ansible - Ansible playbook 可在缺少时在 IOS 设备上添加本地帐户
- ios - CIImage在SWIFT中的矩形到正方形