์ง๋ ๋ฒ์ ์ด ํ๋ก์ ํธ๋ฅผ ํต์งธ๋ก ํ์ ์คํฌ๋ฆฝํธ + next.js๋ก ์ฎ๊ธฐ๋ ์์ ์ ํ๋ค. ( + tailwind)
๊ทธ ์ค์ ํ๋์ ํด๊ฒฐ์ด ์๋๋ ์ค๋ฅ๊ฐ ์์๋๋ฐ...
Property 'map' does not exist on type 'never'
์ง์ง ๋๋ฅผ ํ๋์ ํผ๊ณคํ๊ฒ ๋ง๋ค์์.
์ธํฐ๋ท์ ๋์์๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ด ๋์ํ์ผ๋ ์ด๊ณณ์ด ํด๊ฒฐ์ด ์๋๋ฉด ์ ๊ณณ์ด ๋นต๊ตฌ๊ฐ ๋๊ณ .... ๊ทธ๋ฌ๋๋ฐ
๊ฒฐ๊ตญ ์กฐ๊ธ~~์ ํ๋ฌดํ ํด๊ฒฐ์ด์๋ค. ๊ทธ๋๋ ์ง์ง ๋๋ฌด ์์์
์ผ๋จ ์ฝ๋๋ฅผ ๋ณด๋ฉด,
export default function VillagerList() {
const [data, setData] = useState(null);
const [error, setError] = useState(null);
const URL = "https://api.nookipedia.com/villagers";
const VillagersData = async () => {
try {
setData(null);
setError(null);
const response = await axios.get(URL, {
headers: {
"X-API-KEY": process.env.NEXT_PUBLIC_APP_API_KEY,
"Accept-Version": "1.1.0",
},
});
setData(response.data);
} catch (e: any) {
setError(e);
}
};
useEffect(() => {
VillagersData();
}, []);
return (
<>
<AnimalHeader />
<Box>
{data.map((item, idx) => (
.....
)
}
์ด ์ฝ๋์๊ณ , ์ return ๋ถ๋ถ map์์ ๊ณ์ ์ค๋ฅ๊ฐ ๋๋ ๊ฒ์ด์ด๋ฐ..
์์ธ ๐คท๐ปโ๏ธ
map ํจ์๊ฐ never ํ์ ์ ์กด์ฌํ์ง ์๋๋ค๋ ์๋ฏธ
never ํ์ ์ ๋ณดํต ํ์ ์ถ๋ก ์ด ์คํจํ์ ๋ ๋ฐ์ํ๋ ํ์ ์ธ๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ์ด๊ธฐ ์ํ๋ก ์ธํด ๋ฐ์ํ๋ค.
์ฒ์ ์คํ์์ data ์ํ๊ฐ null๋ก ์ด๊ธฐํ๋๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ setData๋ก ์ ๋ฐ์ดํธํ๊ธฐ ์ ๊น์ง๋ data๊ฐ null์ด๋ฏ๋ก map ํจ์๋ฅผ ํธ์ถํ ์ ์๋ ๊ฒ์ด๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ ๐๐ปโ๏ธ
data๊ฐ null์ธ ๊ฒฝ์ฐ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ๋ก๋ฉ ์ค์ด๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์์ ๋ ํน์ ๋ฉ์์ง๋ฅผ ํ์ํ๊ฑฐ๋, data๊ฐ ์ ํจํ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋ ๋๊น์ง ๋๊ธฐํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
์ฒซ๋ฒ์งธ๋ก ์ด์ฉํ๋ ๋ฐฉ๋ฒ์,
if (data === null) {
return <div>Loading...</div>;
}
๋ฅผ ์ถ๊ฐํด, data๊ฐ null ์ธ ๊ฒฝ์ฐ ๋๊ธฐ๋ฅผ ๊ฑธ์ด๋๋ ์์ ์ด์๋ค.
๊ทธ๋ผ์๋ ๊ณ์ ์ค๋ฅ๊ฐ ๋ฌ๋ค..
๊ทธ๋์ ๋๋ฒ์งธ๋ก๋,
data๊ฐ null ์ผ ๊ฒฝ์ฐ map์ด ๋์๊ฐ์ง ์๊ธฐ ๋๋ฌธ์, data๊ฐ ์์ ๋์ ์คํ๋๋๋ก ๋ค์ ์กฐ๊ฑด์ ๋ฌ์ ์ฃผ์๋ค.
{data && data.map((item: any) => {
return (
....
data && data.map์ ์ฌ์ฉํ์ฌ data๊ฐ ์ ํจํ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ง map ํจ์๋ฅผ ํธ์ถํ๋๋ก ํด์ฃผ์๋ค..
์ด๋ ๊ฒ ์์ ํ๋ฉด data๊ฐ null์ธ ๊ฒฝ์ฐ์๋ map ํจ์๋ฅผ ํธ์ถํ์ง ์์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์์ผ ํ๋๋ฐ.... ^^
์ธ๋ฒ์งธ๋ก, ํ์ ์ ๋ฐ๊ฟ์ฃผ์๋ค. ํ์ ๊ตฌ๊ธ๋ง..
const [data, setData] = useState<any[]>(null);
์ด๋ ๊ฒ ์ถ๊ฐํด์ฃผ์๋๋ map์๋ ์๋ฌ๊ฐ ์๋์ง๋ง ๋ ๋ค๋ฅธ ์๋ฌ๋ฅผ ๋ง์๋ค!
Argument of type 'null' is not assignable to parameter of type 'any[] | (() => any[])'.
ใ
_ใ
๋ํํ
์๊ทธ๋ฌ๋๊ฑฐ์
์์ธ ๐คท๐ปโ๏ธ
data ๋ณ์์ ์ด๊น๊ฐ์ผ๋ก null์ ํ ๋นํ๋ ค๊ณ ํ ๋ ๋ฐ์
useState ํ ์ ์ด๊น๊ฐ์ผ๋ก null ๋์ ๋น ๋ฐฐ์ด []์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ ๐๐ปโ๏ธ
ํ์ ์คํฌ๋ฆฝํธ์์ useState๋ฅผ ์ฌ์ฉํ ๋ ์ ๋ค๋ฆญ ํ์ ์ ๋ช ์ํ๋ฉด ์ด๊น๊ฐ์ ์ง์ ํ ์ ์๋๋ฐ,
์ด๋ฅผ ์ด์ฉํด์ data ์ ์ด๊น๊ฐ์ ๋น ๋ฐฐ์ด๋ก ์ง์ !
const [data, setData] = useState<any[]>([]); // ์ด๊ธฐ๊ฐ์ ๋น ๋ฐฐ์ด๋ก ์ค์
..
const VillagersData = async () => {
try {
setData([]); // ๋ฐ์ดํฐ ์์ฒญ ์ ์ ๋น ๋ฐฐ์ด๋ก ์ด๊ธฐํ
setError(null);
...
if (data.length === 0) { // ๋น ๋ฐฐ์ด๋ก ์ฒดํฌ
return <div>Loading...</div>;
}
data๊ฐ null ์ธ ๊ฒ ์ฒดํฌํ ๋๋, ๋ฐฐ์ด์ด๊ธฐ๋๋ฌธ์ length๋ก ์ฒดํฌ๊น์ง ํด์ฃผ๋ฉด,..
null~ ์ค๋ฅ๋ ํด๊ฒฐ์ด ๋๋ค ใ .ใ