일반적인 js와 같이 onclick
property로 작성해준다. 하지만 이는 JS가 아닌 JSX의 문법인것을 인지하여야 한다.
(근데 참 아이러니한게 앞서 배웠을 땐 Html property에 onclick을 하면 js코드가 할 일을 Html에 부여하는것과 같아서 mordern web에서는 지양한다고 배웠는데 react에서는 잘만 쓴다하핫;;)
그렇다면 왜 온 클릭에 괄호를 안 달아주고 함수 pointing만 할까?
만약 괄호를 추가했다면 이 코드 라인들이 분석되었을 때 JS는 이 함수을 실행했을 것이다.
그리고 JSX코드가 반환될 때 이 코드라인이 분석이 된다.
그러면 클릭했을 때 함수가 실행되는 것이 아니라 이 JSX코드가 평가될 때 실행된다.
그렇면 순서가 너무 빠르기 때문에 함수를 pointing만 한것이다.
function ExpenseItem(props) {
const clickHandler = () => {
let title="Changed!";
}
return (
<Card className={"expense-item"}>
<ExpenseDate data={props.expense.date}/>
<div className={"expense-item__description"}>
<h2>{title}</h2>
<div className={"expense-item__price"}>${props.expense.amount}</div>
</div>
<button onClick={clickHandler}>Change Title</button>
</Card>
);
}
즉, 리액트는 JSX코드를 evaluate할때마다 사용자 지정 컴포넌트 함수들을 호출할 것이다.
그리고 사용자 지정 컴포넌트 함수들을 모든 평가된 JSX코드를 평가할 JSX코드가 없을 때까지 계속 반환하는 것이다.
react.js를 정적 => 동적으로 바꿔주는 핵심 개념
State는 각 component마다 별도로 존재한다.
무슨말이냐 바로 이 별도로 존재하는 State를 이용하며 사용자가 클릭하는 해당 컴포넌트의 state만 최신화하여 web이 dynamic하게 바꿔준다는 뜻이다.
import React, {useState} from 'react';
use
라는 접두어가 붙는다.''
아니라면 props.어쩌구저쩌구
const[현재값변수 명, 새로운값을부여할함수 명] = useState(전값에들어갈변수);
const[title, setTitle] = useState(props.title);
이때 통상 새로운 값을 부여할 함수명은 전값명수 명 앞세 set
접두어를 붙이는게 통상적이다.
그럼 아래와같은 결과값을 얻을 수 있는데 특징이 console.log에 찍힌 값들은 전 값을 갖는다는 것이다. 왜?
state를 update하는 함수를 호출했을 때는 아직 전 값이기 때문에! 즉, 함수내에선 아직 새로운 값이 사용되지 않는다는 뜻이다.