질문드립니다.
import React from "react";
const Viewer = ({ count }) => {
return (
<div>
<div>현재카운트 : </div>
<h1>{count}</h1>
</div>
);
};
export default Viewer;
이걸 했을떄 ..
import React from "react";
const Viewer = ( count ) => {
return (
<div>
<div>현재카운트 : </div>
<h1>{count}</h1>
</div>
);
};
export default Viewer;두개 차이가 멀까요 계속 해깔리는데 이거.. 구조 분해형태인거 까진 알겠는데
부모에서
import logo from "./logo.svg";
import "./App.css";
import Viewer from "./component/Viewer";
import Controller from "./component/Controller";
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
const onClickButton = (value) => {
setCount(count + value);
};
return (
<div className="App">
<h1>Simple Counter</h1>
<section>
<Viewer count={count} />
</section>
<section>
<Controller onClickButton={onClickButton} />
</section>
</div>
);
}
export default App;
GPT 물어보니({ count }):
이 방식은 구조 분해 할당을 사용한 것입니다.
함수의 인자로 객체를 받고, 그 객체의
count라는 속성을 변수로 바로 할당합니다.예를 들어,
Viewer컴포넌트가{ count: 5 }라는 객체를 인자로 받으면,count변수는 바로 5가 됩니다.
(count):
이 방식은 구조 분해 할당을 사용하지 않은 것입니다.
함수의 인자로 객체를 받고, 그 객체를
count라는 이름의 변수로 할당합니다.따라서
count는 객체가 되며,count객체의 속성에 접근하려면count.count처럼 접근해야 합니다.
이렇게 하면 const [count, setCount] = useState(0); 에서 count는 객체가 아니라 그냥 변수 아닌가요 ???
<button onClick={() => { onClickButton(-1); }} >
<button onClick={ onClickButton(-1);} >
이거 2개의 차이가 멀까요
저는 onClick이 함수니까 함수를 전달해줘야 한다고 생각해서 { } 안에 바로 함수를 넣었거던요 ..후자 .
근데 보니까 ()=>{ } 여기다가 함수를 넣는건
onclick의 매개 함수의 리턴값으로 함수를 넣는건데 ..두개의 차이가 뭔지좀 궁금합니다.
답변 1
0
안녕하세요 이정환입니다.
두개의 질문을 주셨네요 순서대로 답변해드리자면
우선 Props는 컴포넌트에게 매개변수로 "객체" 형태로 전달됩니다.
따라서 다음과 같이 Parent 컴포넌트에서 Child 컴포넌트에게 Props를 제공했다면
function Parent() {
return <Child a={1} b={2} />;
}
function Child() {
return <div></div>;
}Child에게는 매개변수로 다음과 같은 객체 형태의 Props가 전달될겁니다.
{
a: 1,
b: 2
}그러므로 Child 컴포넌트에서는 다음과 같이 구조분해 할당을 이용해 객체 형태의 Props로 부터 특정 값을 꺼내어 활용할 수 있습니다.
function Child(props) {
const { a, b } = props;
return <div></div>;
}이때 참고로 구조분해할당은 다음과 같이 매개변수의 선언과 동시에 가능합니다. (이는 자바스크립트 섹션의 내용입니다)
function Child({ a, b }) {
return <div></div>;
}따라서 React에서는 보통 위와같은 방식으로 간결하게 매개변수로 전달받는 Props의 값들을
즉시 구조분해 할당하여 사용합니다.
두번째 질문의 답을 드리자면
<button onClick={() => { onClickButton(-1); }} > // 1번 형태
<button onClick={ onClickButton(-1);} > // 2번 형태1번과 2번 형태의 onClick 이벤트핸들러 설정의 차이를 질문하셨는데요
1번 형태는 버튼의 onClick 이벤트 핸들러로 화살표 함수를 전달합니다.
따라서 1번 버튼이 클릭되면 해당 화살표 함수가 호출이 되어 onClickButton(-1)을 호출하게 됩니다.
그러나 2번 형태는 버튼의 onClick 이벤트 핸들러로 onClickButton(-1)의 호출 결과를 전달합니다.
이것은 함수를 전달하는게 아닙니다. 함수를 전달하시려면 onClick={onClickButton} 처럼 전달하셔야 합니다. onClickButton(-1)은 onClickButton 함수를 호출하고 인수로 -1을 전달한 결과값을 의미합니다.
쉽게 말해 이벤트 핸들러 역할을 할 함수를 전달한게 아니라, 함수의 호출 결과 자체를 전달한거라고 이해하시면 됩니다. 따라서 2번 형태는 정상적으로 동작하지 않습니다.
Editor Component의 최적화 불가능 이슈
0
37
2
useCallback ⊂ useMemo
0
34
2
라이브러리 설치 질문
0
33
2
linter 질문
0
40
2
감정일기장 vercel 배포 후 새로 고침 시 404페이지가 뜨는 이유
0
40
2
Sort 메서드 관련 아티클
0
42
2
4.1) React.js를 소개합니다 강의를 듣고 궁금한 점이 생겼습니다.
0
44
2
html, body에 적용하는 css 스타일 질문입니다.
0
38
2
eslint.config.js 설정 질문입니다.
0
90
2
존재하지 않는 일기 url입력 시 alert이 두 번 떠요
0
66
1
교재(3쇄)와 강의 내용 문의
0
65
2
12.13) 하단 여백 스타일링 관련 질문 드립니다.
0
87
2
에러 질문드립니다
0
103
2
VSCode 설정 문의
0
137
2
PPT 코드 관련 질문
0
66
2
useEffect와 lifecycle문의
0
87
2
프론트엔드 학습 수준 문의
0
107
2
리액트 챕터별 코드에서 eslint 설정파일이 없어요
0
110
2
데이터 로딩중 화면만 계속 나와요!!
0
100
2
퍼블리셔일경우 어느정도 수준까지 강의를 들어야할까요
0
129
2
이후의 커리큘럼 문의
0
151
2
실슬환경 설정에서 save후 console.log 부분이 새로고침이 안되는현상입니다.
0
106
2
최적화 관련 질문있습니다 (useMemo 등)
0
126
3
프로바이더 컴포넌트의 위치는 어떤 기준인가요?
1
124
3





