Uncaught TypeError: Cannot read properties of undefined ๋น„๋™๊ธฐ๋ฅผ ์ด์šฉํ–ˆ์„๋•Œ ๋ Œ๋”๋ง ์ˆœ์„œ์ฐจ์ด์— ์˜ํ•ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜
ยท
๐Ÿ”ง Library/React JS
์ธ๊ธฐ์˜ํ™” ์ถ”์ฒœ ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค ๊ฐ„๋‹จํ•ด ๋ณด์ด์ง€๋งŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” movie๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๋Š”๋ฐ ๊ทธ๋Ÿด๋ฆฌ๊ฐ€ ์—†๋‹ค... ์˜ค๋ฅ˜ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž import { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; const Detail = () => { const [detail, setDetail] = useState({}); const { id } = useParams(); const getDetail = async () => { const json = await ( await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id..
React์—์„œ input ์ž…๋ ฅ์ด ์•ˆ๋˜๋Š” ๊ฒฐ์ •์ ์ธ ์ด์œ 
ยท
๐Ÿ”ง Library/React JS
1. ์•ˆ๋˜๋Š” ์ด์œ ์™€ , ChatGPT์˜ ๋‹ต๋ณ€ ChatGPT์˜ ๋‹ต๋ณ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. React์—์„œ input ํƒœ๊ทธ์˜ value ์†์„ฑ์— ์ƒํƒœ๊ฐ’์„ ๋„ฃ์œผ๋ฉด, ๊ทธ ๊ฐ’์€ ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ๊ฐ€ ๋˜์–ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , onChange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š” React์—์„œ๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ input ํƒœ๊ทธ์˜ value ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด React๋Š” ์ด๋ฅผ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์ธ์‹ํ•˜๊ณ , ์ด์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ value ๊ฐ’์ด ์ฝ๊ธฐ ์ „์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, onChange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ..
coin api ๋ถˆ๋Ÿฌ์˜ค๊ธฐ, useEffect()
ยท
๐Ÿ”ง Library/React JS
coin์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ, ๋ Œ๋”๋ง์‹œ ๋‹จ ํ•œ๋ฒˆ๋งŒ ๊ฐ€์ ธ์˜ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, useEffect๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์šฉํ•œ๋‹ค. useEffect(()=>{}, []) []์ธ์ž์— ์•„๋ฌด๊ฒƒ๋„ ์ ์ง€ ์•Š์œผ๋ฉด, ๋ Œ๋”๋ง ํ›„ ๋”ฑ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค. ์˜ˆ์‹œ ์ƒํƒœ๊ฐ’ coins์— api๋ฅผ ์ €์žฅํ•˜๊ณ , coins.map์„ ํ†ตํ•ด ๋‚ด๋ถ€์š”์†Œ๋ฅผ ๊ทธ๋ ค๋ณด๋Š” ์ฝ”๋“œ๋‹ค. https://api.coinpaprika.com/v1/tickers import React, { useEffect } from "react"; function App() { const [coins, setCoins] = React.useState([]); useEffect(() => { fetch("https://api.coinpaprika.com/v1/tickers") .then((res..
React.useState() ๋ Œ๋”๋ง
ยท
๐Ÿ”ง Library/React JS
useState๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. React.useState()๋Š” [state, modifier]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ดํ•ด๋ฅผ ์œ„ํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. const [๊ฐ’, ๊ฐ’ ์„ธํŒ… ํ•จ์ˆ˜] = React.useState(์ดˆ๊ธฐ๊ฐ’); ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ. import React, { useEffect } from "react"; function App() { const [counter, setCounter] = React.useState(0); const handleClick = () => { setCounter(counter + 1); }; return ( {counter} CLICK ); } export default App; ์ƒ์ˆ˜์ธconst๋กœ ์„ ์–ธ์„ ํ–ˆ๋Š”๋ฐ๋„ counter๋ฅผ ..
React์™€ JSX, ReactDOM.render์˜ ํŠน์ง•
ยท
๐Ÿ”ง Library/React JS
ํšจ์œจ์„ฑ JSX๋Š” JavaScript์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋‹ค. JSX๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ html๊ณผ js๋ฅผ js๊ณต๊ฐ„์—์„œ ์ž์œ ์ž์ œ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ฑธ ๋ณด๊ณ  ๋†€๋ผ์› ๋‹ค. ์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ JSX๋Š” JavaScript XML์˜ ์•ฝ์ž์˜€๋‹ค. ๋‹ค๋ฃฐ๋•Œ๋Š” ์š”๋Ÿฐ์‹์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค. const element = Hello, world; React์—์„œ JSX์‚ฌ์šฉ์ด ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๋Œ€๋ถ„์˜ ์‚ฌ๋žŒ์€ js์ฝ”๋“œ ์•ˆ์—์„œ UI๊ด€๋ จ ์ž‘์—…์„ ํ•  ๋•Œ ์‹œ๊ฐ์ ์œผ๋กœ ๋” ๋„์›€์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. React์—์„œ JSX๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์œ„์˜ element์™€ ๊ฐ™์€๊ฑธ ์„ ์–ธ ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค. const element = React.createElement("h1", {id: "greet"}, "Hello World"); ๋ณด๊ธฐ๋„ ๋ถˆํŽธํ•˜๊ณ , ์ •๋ง ๋”์ฐํ•˜๋‹ค...