48,400원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
코드샌드박스 바닐라 자바스크립트 템플릿 없음
안녕하세요. 4강 듣고있는데 코드샌드박스에서create a sandbox 해서 들어가도템플릿 목록에 vanila codesandbox가 없네요. react, html+css, react typescript, vanila typescript 이렇게 4가지만 보입니다. ㅠㅠ
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
react 개발하는데 nodejs가 사용되는 이유가 궁금해요!
react 할때마다 관성적으로 nodejs를 쓰다보니 갑자기 의문이 생겼어요. 왜 nodejs를 써서 개발해야하는지.react 개발 시 필요한 도구들을 설치하기 위해 npm을 사용하는 것이 좋다는 것은 인지하고 있습니다근데 왜 nodejs까지 쓰는지는 잘 모르겠습니다!
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
유데미 강의와 내용이 동일한가요??
유데미 강의와 동일한 버전인가요??
- 미해결[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
npx create-app reactexam1 에러
PS C:\reactexam1> npx create-react-app reactexam1npm ERR! code ENOENTnpm ERR! syscall lstatnpm ERR! path C:\Users\82108\AppData\Roaming\npmnpm ERR! errno -4058npm ERR! enoent ENOENT: no such file or directory, lstat 'C:\Users\82108\AppData\Roaming\npm'npm ERR! enoent This is related to npm not being able to find a file.npm ERR! enoentnpm ERR! A complete log of this run can be found in: C:\Users\82108\AppData\Local\npm-cache\_logs\2023-11-28T12_12_57_671Z-debug-0.log npx create-react-app reactexam1을 입력했을 때 계속 이런 에러가 뜹니다.폴더 위치를 c드라이브로 옮기는 것도 해보고 node.js를 다시 다운 받는 것도 해보았는데 계속해서 이런 에러가 발생합니다.
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
input 태그 사용 시 form 태그 사용 여부
안녕하세요😀 강의 수강하다 궁금증이 생겨서 질문드립니다.보통 로그인 폼이나, 회원가입 폼처럼 보통 <input> 사용할 때 <form> 안에 넣어서 사용했던걸로 알고 있었습니다. 근데 영상 내에서는 <form>를 사용하시지 않는 것 같더라구요! form을 사용하는게 사용자에게 데이터를 입력받아서 서버한테 전달하는 것으로 알고 있는데 영상 내에서는 간단한 input만 받으니까 서버의 전송이 필요없어서 그러신걸까요?<input> 사용할 때마다 궁금했던건데 .. 제가 투두프로젝트를 만들 때도 할일 목록 입력받는 input, 수정할 투두 입력받는 input 이렇게 2개만 필요하고, 로컬스토리지를 사용할거라 서버의 전송이 필요없는 경우라면 굳이 <form> 사용할 필요가 없는건지.. form 태그 사용 여부 기준을 잘 모르겠습니다 ㅠㅠ 사용할 input의 갯수가 1개 밖에 없어도 서버에 전송을 해야하는 경우면 form을 사용하고, 아니라면 form를 굳이 사용할 필요가 없는걸까요? 구글에 검색해봐도 개인마다 작성하는게 다르고.. 제가 원하는 답변을 얻을 수가 없어서 이렇게 질문드립니다. 감사합니다 !
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
diaryList.map in not function 오류
안녕하세요.데이터 추가 기능 구현 중 오류가 생겼는데, 여러번 들어봐도 어디서 놓쳤는지 알수 없어서 문의드립니다.저장 성공 얼럿이 뜬 후 diaryList.map is not a function 오류가 발생하는데 이유가 뭘까요ㅠㅠ? 올려주신 코드와 비교해봐도 잘못 작성된 부분을 찾지 못해서.. 확인 부탁드립니다!https://codesandbox.io/p/sandbox/dawn-silence-dtzj4w?file=%2Fsrc%2FApp.js%3A5%2C1 감사합니다.
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
페이지구현 - 일기수정(Edit) 수정 에러 질문(세부사항추가)
정환님 안녕하세요.지난번에 동일한 문제로 문의 드렸었는데, 아직 해결이 안되서 문제 재현에 대한 구체적인 정보 올립니다. (댓글문의는 알림이 안가서 확인이 늦어지는 것 같아서요) 문제)첫번째 일기를 쓰고, 이후 두번째 일기를 쓰고 나서 두번째 일기를 수정하면수정된 두번째 일기와 동일한 일기가 생성이 됩니다.이후 세번째, 네번째 일기를 쓰고 마찬가지로 수정을 하면 수정된 일기와 동일한 일기가 생성이 됩니다그럼 확인부탁드리겠습니다.🥲
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
터미널에서 node 설치오류가 계속 뜹니다
하단에 다른분이 글 남겨주신것 확인하고cmd 들어가서 node.js가 잘 설치되었는지도 확인했습니다그런데 터미널상에서 node index.js만 연결하려고하면 계속 오류가 뜹니다 ㅠㅠ다시 설치해도 오류는 같습니다...왜그럴까요?ㅠㅠ처음 터미널을 오픈하면 강의에 나오는window powershell ~ 새로운 크로스 플랫폼~이 문장이 나오지 않는데 이부분에서 무언가 누락된것이 있을까요?
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
codesandbox ui 패치에 따른 질문
ctrl+s 누를때마다 자바스크립트를 실행하도록 설정하고 싶은데 어떻게 해야할까요?
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
setData(() => [newItem, ...data]) 동작 순서 질문입니다.
안녕하세요~ 강의 잘 보고 있습니다.setData([newItem, ...data]) 대신에 setData(() => [newItem, ...data])를 사용하는 이유가 useCallback이 완료된 후에 setState에서 () => [newItem, ...data] 를 호출 후 사용돼서 최신 데이터도 업데이트가 되고, 메모이제이션도 가능하게 된건가요?감사합니다.
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
이 강의의 코드는 프로그래밍 패러다임 중 어떤 것이라 볼 수 있나요?
절차형, 객체지향, 함수형 셋 중 어떤 것이라 볼 수 있나요?
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
DataItem 컴포넌트 질문 있습니다.
안녕하세요, 강의 잘 보고 있습니다.DataItem 컴포넌트를 생성하고 이용하는 방법에 질문 두가지가 있습니다. (질문 1) DataItem을 자바스크립트 객체로 생성하는 방법과 jsx 컴포넌트로 생성하는 방법의 차이가 궁금합니다. jsx 컴포넌트를 이용할 때는 key값을 줄 수 있는것은 아는데요, 그 외의 차이점은 없는 것 같습니다. jsx 대신 DataItem 객체를 생성해서 사용해도 되나요?a. map에서 자바스크립트 객체로 생성하는 방법<div>{diaryList.map(i => DiaryItem(i)}<div> b. jsx의 컴포넌트로 생성하는 방법<div>{diaryList.map(i => <DiaryItem {...i}/>}<div> (질문 2) DataItem에 props를 넘겨주는 방법에 대한 질문입니다. props에 {...i} 처럼 전개연산자를 이용하여 한번에 여러 값을 전달해주고 있는데요, 그냥 i를 전달해주어도 되지 않나요? 전개연산자를 이용하여 넘겨주는 이유가 리액트 문법 때문인지, 새 객체로 복사해서 넘겨주고 싶기 때문인건지, 혹은 다른 이유때문인지 질문 드립니다.<div>{diaryList.map(i => <DiaryItem {...i} />}</div>
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
setStatus, 콜백함수, 변수 스코프에 대해 질문드립니다.
강사님 안녕하세요항상 상세한 답변을 주시는 점 감사드립니다.아래의 코드를 보고 질문을 받아주시면 감사하겠습니다.import './App.css'; import Counter from './Counter'; import Container from './Container'; import {useEffect, useState} from "react"; import MyHeader from './MyHeader.js' export default function App() { const [state, setState] = useState({ a: 0, b: 0 }); const onClick = () => { const c=10; setState(c=>({ a: c + 1 })); }; return ( <div className="App"> <div>a : {state.a}</div> <button onClick={onClick}>증가</button> </div> ); }1번째 경우원래는 아래의 코드처럼 setState의 콜백함수의 인자에 state를 넣는 게 맞습니다.const c=10; setState(state=>({ a: c + 1 // 이 줄의 c는 1번째 줄의 c를 가리키므로 a: 10 + 1 과 같습니다. }));이때는 a:c+1에서의 c가 함수 밖에 선언된 맨위의 const c= 10의 c를 가리킵니다. 2번째 경우 일부러 setState의 콜백함수의 인자를 state가 아닌 c로 적어봤습니다.const c=10; setState(c=>({ //이 부분 변경 state 를 지우고 c로 a: c + 1 // 이 줄에서의 c는 1번째 줄의 c를 가리키지 않습니다. }));그러자 a: c + 1 에서의 c는 1번째 줄의 c가 아닌, 콜백함수 인자로 들어간 2번째 줄의 c를 가리킵니다.그래서 변수의 스코프를 공부하고 싶어서 조언을 구하고 싶습니다. 1번째 질문을 드립니다.변수가 const, let, var 인지에 따라서 스코프가 다른 것으로 아는데콜백함수의 인자로 들어간 변수는 const인지 let인지, var 인지 질문드리고 싶습니다. 2번째 질문을 드립니다.이 부분에 대해 학습하면 좋을 자료 링크를 추천해주시면 감사하겠습니다.저도 현재 변수 스코프에 대해 다시 공부하는 중입니다.3번째 질문을 드립니다.const c=10; setState(c=>({ //이 부분 변경 state 를 지우고 c로 a: c + 1 // 이 줄에서의 c는 1번째 줄의 c를 가리키지 않습니다. })); 에서2번째 줄의 콜백함수 인자의 c는 1번째 줄의 c를 가리키지 못하는 이유에 대해 질문드리고 싶습니다.4번째 질문을 드립니다.const c=10; setState(state=>({ //이 부분 변경 state 를 지우고 c로 a: c + 1 // 이 줄에서의 c는 1번째 줄의 c를 가리키지 않습니다. }));3번째 줄의 c는 1번째 줄의 c를 가리킬 수 있는 이유에 대해 질문드리고 싶습니다감사합니다.
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
페이지구현 - 일기수정(Edit) 수정 에러 질문
정환님 안녕하세요.질문이 있습니다.DiaryEditor 컴포넌트로 onCreate, onEdit 함수를 전달하여일기를 생성, 수정 하는데요.이때, 일기 생성 후, 일기를 수정 하면 수정된 일기 + 수정된 일기가 1개 더 추가 생성이 되는 에러가 발생하여서요.어떤 부분이 문제인지 짐작이 안갑니다. ㅠㅠ아래 코드 캡쳐본 첨부드립니다.답변주시면 감사하겠습니다.그리고 강의 잘 듣고있습니다. 좋은 강의 감사합니다 :) App 컴포넌트Edit 컴포넌트DiaryEditor 컴포넌트
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
무한 루프 에러 질문드립니다.!
import React, { useState, useEffect, useContext, useRef } from "react"; import { useNavigate } from "react-router-dom"; import axios from "axios"; import { BbsSettingContext } from "../common/Board"; import ToastEditor from "../component/ToastEditor"; import MyButton from "../common/ComButton"; const BoardView = ({ postId }) => { const titleInputRef = useRef(); const contentsAreaRef = useRef(); const toastEditorRef = useRef(); // ToastEditor의 ref const [post, setPost] = useState({ nttSj: "", nttCn: "", regDate: "", }); const [boardSetting, setBoardSetting] = useState(null); const boardSetData = useContext(BbsSettingContext); const Navigate = useNavigate(); const formatDate = (timestamp) => { const date = new Date(timestamp); const options = { year: "numeric", month: "long", day: "numeric" }; return date.toLocaleDateString("ko-KR", options); }; useEffect(() => { if (boardSetData) { setBoardSetting(boardSetData); axios .get(`http://localhost:8080/board/${boardSetData.bbsId}/post/${postId}`) .then((response) => { setPost({ nttSj: response.data.post.nttSj, nttCn: response.data.post.nttCn, regDate: response.data.post.regDate, }); }) .catch((error) => console.log(error)); } }, [post]); return ( <div className="BoardView"> <div className="upInfoArea"> <div type="text" name="boardTitle" className="titleDiv"> {post.nttCn} </div> <div type="text" name="regId" className="regIdDIv"> {formatDate(post.regDate)} </div> </div> <div className="contentArea"> <div className="contentsText">{post.nttCn}</div> </div> <section> <div className="btnArea"> <MyButton text={"리스트이동"} onClick={() => Navigate(-1)} /> <MyButton text={"수정하기"} type="positive" /> </div> </section> </div> ); }; export default BoardView; 질문이 있는데 useEffect에서 [post]로 하면 무한 루프가 돌고 저런식으로 [boardSetData,post.postId,post.nttSj,post.nttCn] 으로 놓으면 무한루프가 돌지 않는데 이유를 알수 있을까요 ...postId는 글번호 nttSj 제목 , nttCn 제목이며 const boardSetData = useContext(BbsSettingContext);여기서 boardSetData는 게시판 셋팅 데이터 입니다 .왜 무한 루프가 도는지 알수있을까요 .게시판 셋팅 , 글제목, 글번호 글내용이 바뀌면 useEffect의 axios가 전송 되어야 하게 할려고 합니다 근데 무한 루프가 도네요 ...
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
USESTATE, 렌더링의 비동기 시점에 대해 질문드립니다.
강사님 안녕하세요아래의 코드를 보고 질문을 받아주시면 감사하겠습니다.type testDataType = { testNumber1:number; testNumber2:number; } const Test = () => { const [testData, setTestData] = useState<TestDataType>({ testNumber1:0, testNumber2:0 }); useEffect(()=>{ AxiosPromise로 Api를 호출하는 메서드 1({}) .then((res)=>{ const responseData = res.data; console.log("responseData"+ responseData);//8출력 setTestData({ ...testData, testNumber1: responseData }) AxiosPromise로 Api를 호출하는 메서드 2({}) .then((res)=>{ const responseData = res.data; console.log("responseData"+ responseData);//8출력 setTestData({ ...testData, testNumber2: responseData }) }, []) return (<>{`${testData.testNumber1} / ${testData.testNumber2}`}</>); }일 때, testData.testNumber1 에는 비동기로 가져온 데이터가 반영되는데testData.testNumber2 에는 비동기로 가져온 데이터가 반영이 되지 않습니다.제가 생각한 리액트 코드 순서는 이렇습니다.순서1.맨 처음 마운트 시점에 Test ()가 실행됩니다.그리고 useEffect() 가 실행됩니다.2.아직 마운트 시점입니다.useEffect() 가 AxiosPromise로 Api를 호출하는 메서드 1({})과AxiosPromise로 Api를 호출하는 메서드 2({})를 비동기로 실행합니다.이때 각각의 Axios Promise들은 각각 8이라는 데이터를 읽고useState의 setTestData() 를 실행하여testData.testNumber1에는 8testData.testNumber2에도 8이 들어갑니다. 그 다음에return (<>{`${testData.testNumber1} / ${testData.testNumber2}`}</>);가 실행됩니다.그렇게 웹페이지 UI에는8/8이 보이게 됩니다.그러나 막상 실행해보면0/88/0이 나옵니다. 그리고 그 원인이 2개의 AxiosPromise 메서드에서setTestData({...testData,testNumber1: responseData})setTestData({...testData,testNumber2: responseData})를 실행하기 때문 같습니다.그런데 조금 궁금한 게 있습니다.아무리 AxiosPromise와 UseState의 setter가 비동기 메서드라도 자바스크립트의 메모리 구조에서는태스크큐라는 줄을 서게 됩니다.그리고 호출스택이 비워지면 차례대로 호출스택으로 이동하면서 차례대로 동기적으로 실행된다고 생각합니다.즉, 저 2개의 setTestData() 도 동시에 일어나지 않고 실행 순서가 있다고 생각했습니다. 그래서 2개의 비동기 메서드가 동일한 setTestData를 호출해도 문제가 없다고 생각했습니다.제 생각의 틀린 점을 지적해주시면 감사하겠습니다.
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
게시판만들다가 질문드립니다
import "./App.css"; import { BrowserRouter, Route, Routes } from "react-router-dom"; import MainPage from "./pages/MainPage"; import Board from "./pages/Board"; import { useEffect } from "react"; function App() { useEffect(() => console.log("app is loading"), []); return ( <BrowserRouter> <Routes> <Route path="/" element={<MainPage />}></Route> <Route path="/board/:bbsId" element={<Board />}></Route> <Route path="/board/:bbsId/new" element={<Board />}></Route> </Routes> </BrowserRouter> ); } export default App; import React, { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; // useParams를 import import BoardList from "../pagesComponent/BoardList"; import BoardEdit from "../pagesComponent/BoardEdit"; import BoardView from "../pagesComponent/BoardView"; import Layout from "../layout/Layout"; import axios from "axios"; export const BbsSettingContext = React.createContext(); const Board = () => { const { bbsId } = useParams(); // const [currentUrl, setCurrentUrl] = useState(null); const [boardSettData, setBoardSettingData] = useState(null); useEffect(() => { let mode = window.location.pathname.split("/")[3] == null ? "list" : window.location.pathname.split("/")[3]; console.log(`mode::::::::::::::${mode}`); setCurrentUrl(mode); axios .get("http://localhost:8080/board/" + bbsId) .then((response) => { const boardSettData = response.data.bbsEntity; console.log(boardSettData); setBoardSettingData(boardSettData); }) .catch((error) => console.log(error)); }, [currentUrl]); return ( <BbsSettingContext.Provider value={boardSettData}> {currentUrl == "list" ? ( <Layout> <BoardList /> </Layout> ) : currentUrl == "new" ? ( <Layout> <BoardEdit /> </Layout> ) : currentUrl == "edit" ? ( <Layout> <BoardEdit /> </Layout> ) : currentUrl == "view" ? ( <Layout> <BoardView /> </Layout> ) : ( <BoardList /> )} </BbsSettingContext.Provider> ); }; export default Board; import React from "react"; import { useContext, useHistory } from "react"; import { BbsSettingContext } from "../pages/Board"; import PageNationPage from "./PageNationPage"; import { useNavigate } from "react-router-dom"; const BoardList = () => { const boardSetData = useContext(BbsSettingContext); console.log(boardSetData); const Navigate = useNavigate(); const handleBoardEdit = () => { // 원하는 동작을 수행할 코드를 여기에 추가 console.log("쓰기로 이동"); Navigate("/board/1/new"); }; return ( <div className="BoardList"> <table className="bbsTable"> <colgroup> <col style={{ width: "10%" }} /> <col style={{ width: "40%" }} /> <col style={{ width: "10%" }} /> <col style={{ width: "20%" }} /> <col style={{ width: "10%" }} /> </colgroup> <thead> <tr> <th scope="col">번호</th> <th scope="col">제목</th> <th scope="col">작성자</th> <th scope="col">등록일</th> <th scope="col"> 조회</th> </tr> </thead> </table> <PageNationPage /> <button onClick={handleBoardEdit}>쓰기</button> </div> ); }; export default BoardList; import React from "react"; import { useState, useEffect, useContext } from "react"; import { BbsSettingContext } from "../pages/Board"; const BoardEdit = () => { const boardSetData = useContext(BbsSettingContext); console.log(boardSetData); return <div>BoardEdit</div>; }; export default BoardEdit; 안녕하세요 다름이 아니라 일기장 보고 게시판을 응용해서 만들던 도중에 안되는게 있어서 질문드립니다.http://localhost:3000/board/1이 리스트로 나오는데요 ...거기서 쓰기를 누르면 http://localhost:3000/board/1/new으로 위에 url은 바뀌는데밑에 ui는 전혀 바뀌질 않습니다 .그리고 Board.js에 useEffect쪽에 콘솔로 찍어봐도 들어오지가 않는데 이유를 좀 알수있을까요 ????? 근데 쓰기 버튼말고 그냥 직접 url을 입력하고 enter를 입력하면 이동합니다 .
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
React에서 배열 사용하기 4 - 데이터 수정하기 18분 50초 질문드립니다.
🚨 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 🚨질문 하시기 전에 꼭 확인해주세요- 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다)- 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다)- 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 😢)질문 하실때 꼭 확인하세요- 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X)- 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지)- 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우)- 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요- 강의의 몇 분 몇 초 관련 질문인지 알려주세요!- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.강사님 안녕하세요 18분 50초에서 DiaryItem.js에서 이 코드 부분 질문드립니다.스크린샷을 봐주시면 제가 임의로 {console.log("진입1")} {console.log("진입2")}를 넣었습니다.이번에는 {console.log("진입1")}을 <> </> 밖으로 뺐습니다.그러자 오류가 생겼습니다.제가 이해하기로는, JSX 표현식인 { } 은 하나의 태그로 묶어줘야 합니다.그런데 저 위치로 console.log("진입1")을 옮겨줘도<div className="content"></div>가 감싸줘서<div className="content">console.log("진입1")</div>인 것과 같아서 JSX 표현식을 태그가 감싸준 것이므로 오류가 안생겨야 할 것 같은데, 생기는 이유에 대해 질문드리고 싶습니다.
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
React에서 배열 사용하기 2 - 데이터 추가하기 10분 27초 질문드립니다.
🚨 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 🚨질문 하시기 전에 꼭 확인해주세요- 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다)- 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다)- 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 😢)질문 하실때 꼭 확인하세요- 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X)- 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지)- 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우)- 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요- 강의의 몇 분 몇 초 관련 질문인지 알려주세요!- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.강사님 안녕하세요React에서 배열 사용하기 2 - 데이터 추가하기 10분 27초 코드에 대해 질문드립니다.33라인에서const dataId = useRef(0); 을 주셨는데아래 코드처럼 useRef( ) 를 안쓰고const dataId = 0; 로 썼을 때보다 장점이 있는지 질문드리고 싶습니다.
- 해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
[input 속성 및 state 관리] 사용자 입력 처리하기
안녕하세요.사용자 입력 처리하기 강의 관련 질문입니다. input 태그를 통해 사용자 입력을 받고, 상태 관리하면, 상태에 사용자의 입력이 반영되는 게 한 단계씩 늦는 것 같습니다. (그 이유가 useState가 비동기적으로 처리된다고 들은적이 있는 것 같은데, 정확히 이해가 가지 않아서 질문드립니다.) 아래 코드의 handleOnChange함수에서,Q1) e.target.name, e.target.value은 제깍제깍 실시간으로 반영이 되는데, input state는 한 단계 늦게 반영이 됩니다. 이런 현상이 발생하는 이유는 무엇이고, 이건 개발하는데 문제가 되지 않는 이유는 뭔지? 가 궁금합니다! import { useState } from 'react'; const DiaryEditor = () => { const [input, setInput] = useState({ author: '', content: '', emotion: 1, }); const handleOnChange = (e) => { console.log(e.target.name); console.log(e.target.value); setInput({ ...input, [e.target.name]: e.target.value }); console.log(input); }; const handleSubmit = () => { console.log(input); alert('오늘의 일기가 저장되었습니다!'); }; return ( <div className='DiaryEditor'> <h2>오늘의 일기</h2> <div> <input name='author' value={input.author} onChange={handleOnChange} /> <p>{input.author}</p> </div> <div> <textarea value={input.content} name='content' onChange={handleOnChange} /> <p>{input.content}</p> </div> <div> <span>감정 지수 : </span> <select onChange={handleOnChange} name='emotion' value={input.emotion} > <option value={1}>1</option> <option>2</option> <option>3</option> <option>4</option> <option value={5}>5</option> </select> </div> <div> <button onClick={handleSubmit}>저장하기</button> </div> </div> ); }; export default DiaryEditor; Q2) 위처럼 input이란 state는 한단계씩 늦게 반영이 되는데, select태그의 value 속성을 주는 목적은 무엇인가요??인풋의 value 속성은 실시간으로 인풋의 값과 상태를 동기화해주는 목적으로 사용한다고 생각했는데,state가 곧바로 변하지 않는거면, 이 인풋의 value 속성은 무용지물인 것 아닌가라는 생각이 들어 질문드립니다. <select onChange={handleOnChange} name='emotion' value={input.emotion} >Q3) useState의 초기값은 반드시 빈문자열등으로 인자를 전달하는 게 나은가요? 아무 인자도 전달하지 않으면 어떤 잠재적인 에러 발생 가능성이 있는건가요?