我正在创建一个列表,但它给了我相同的错误。.map函数不能在我的变量上工作,所以你们能帮我吗?
它是在Typescript React中创建的。我试着让这个工作了一个星期,仍然找不到问题我甚至尝试重写孔系统,但仍然没有工作,所以这是我最后的希望。
误差
react-dom.development.js?e444:25163 Uncaught TypeError: Cannot read property 'map' of undefined
at _default (CloudServersContainer.tsx?a799:46)
at renderWithHooks (react-dom.development.js?e444:16240)
at mountIndeterminateComponent (react-dom.development.js?e444:18774)
at beginWork$1 (react-dom.development.js?e444:20136)
at HTMLUnknownElement.callCallback (react-dom.development.js?e444:337)
at Object.invokeGuardedCallbackDev (react-dom.development.js?e444:386)
at invokeGuardedCallback (react-dom.development.js?e444:441)
at beginWork$$1 (react-dom.development.js?e444:25737)
at performUnitOfWork (react-dom.development.js?e444:24664)
at workLoopSync (react-dom.development.js?e444:24637)
执行eggs。data时得到的Json
链接到图片:https://i.stack.imgur.com/CKC0Y.png
代码:
import React, { componentDidMount, useEffect, useState } from 'react';
import PageContentBlock from '@/components/elements/PageContentBlock';
import Button from '@/components/elements/Button';
import Input from '@/components/elements/Input';
import InputSpinner from '@/components/elements/InputSpinner';
import tw from 'twin.macro';
import useSWR from 'swr';
import TitledGreyBox from '@/components/elements/TitledGreyBox';
import { Textarea } from '@/components/elements/Input';
export default () => {
const [loading, setLoading] = useState(false);
interface EggsPlace {
Egg: String;
run(arg: any): void;
}
const [Eggs, setEggs] = useState<EggsPlace>([]);
const getEggs = async () => {
const response = await fetch('/api/client/cloudservers/getoptions');
if (response.status !== 400) {
const content = await response.json();
const data = content;
setEggs({ data });
}
};
useEffect(() => {
getEggs();
}, []);
if (typeof Eggs.data !== 'undefined') {
console.log(Eggs.data[0]);
}
return (
<PageContentBlock title={'Options'} showFlashKey={'options'}>
<h1>Server Types:</h1>
<div css={tw`w-full grid grid-flow-col grid-rows-2 grid-cols-3 gap-4`}>
{
Eggs.data !== 'undefined' ?
Eggs.data.map(item => (
console.log(item)
))
:
<p>loading</p>
}
</div>
<TitledGreyBox title="Configuration" css={tw`flex-wrap md:flex-no-wrap`}>
<div css={tw`w-full grid grid-flow-col grid-rows-2 grid-cols-2 gap-4`}>
<div css={tw`w-full col-span-2`}>
<InputSpinner visible={loading}>
<Input
readOnly={false}
name={"Name"}
placeholder={"Name Server"}
/>
</InputSpinner>
</div>
<InputSpinner visible={loading}>
<Input
readOnly={false}
name={"Memory"}
placeholder={"Memory"}
/>
</InputSpinner>
<InputSpinner visible={loading}>
<Input
readOnly={false}
name={"Disk"}
placeholder={"Disk"}
/>
</InputSpinner>
</div>
<div css={tw`mt-4 w-full`}>
<Textarea
placeholder={'Description'}
/>
</div>
</TitledGreyBox>
<Button css={tw`mt-4`} color="primary">Create Server</Button>
</PageContentBlock>
);
};
我认为问题就在这里:
Eggs.data !== 'undefined'
这是与字符串'undefined'进行比较。
您想要的是Eggs.data !== undefined
或!Eggs.data
或typeof Eggs.data !== 'undefined'
另外,我认为你有一些TypeScript问题,
setEggs({ data });
然后你应该像这样初始化Eggs
const [Eggs, setEggs] = useState<{data: EggsPlace[]}>({data: []});
这也将确保您初始化的数据与一个空数组。虽然,如果setEggs({ data });
中的data
不是数组,它仍然会中断。
当你得到Eggs.data
尝试:
JSON.parse(JSON.stringify(Eggs.data))
对数组
进行深度复制。我发现为什么它不工作,它只是我使用'未定义'而不是未定义。谢谢大家!