📍onclick="f()"
📍onClick={f}
function f(){
// 버튼이 클릭되면 실행시키고 싶은 함수
}
<button onclick="f();">버튼!</button>
👉👉 이름 없는 함수가 만들어짐.
이렇게 실행이 됨
()=>{
f();
}
// javascript 함수 자체를 알려줘야된다
<button onClick={f}>버튼!</button>
버튼을 눌러도 console.log에는 찍히는데, 숫자는 바뀌지가 않는다. 💁🏻♀️ WHY?
const StatePage = () => {
//함수
const normalClick = () => {
console.log('클릭이전',normalClick);
console.log('normalClick');
console.log('클릭이후',normalClick);
}
return (
<>
<h1>state component</h1>
<h2>0</h2>
<button onClick={normalClick}>기본버튼입니다!</button>
<br />
<button>-</button>
<button>+</button>
</>
);
}
export default StatePage;
✏️ 특정 변수 속에 있는 값이 달라진다면,
화면을 다시 그려줘(re-rendering
)라고 명령 ❗️
리액트의hook 함수
(use로 시작하는함수)useState함수
를 사용해야 한다.
const StatePage = () => {
let number = 0; //기본변수값설정
//함수
const normalClick = () => {
console.log('normalClick');
}
const plusClick = () => {
number++;
}
return (
<>
<h1>state component</h1>
<h2>{number}</h2>
<button onClick={normalClick}>기본버튼입니다!</button>
<br />
<button>-</button>
<button onClick={plusClick}>+</button>
</>
);
}
export default StatePage;
📍1.인자
값1개
,state변수의 초기값
📍2.동작
state변수
와setState함수
를 만들어준다
📍3.함수사용결과
2칸짜리 배열,[ state변수, setState함수 ]
값1개, state변수의 초기값
let [number, setNumber] = useState(0); //초기값은 0
컴포넌트안에 변수 안에 들어있는 값이 달라지면
다시 그 컴포넌트를그려줘야하는
경우에는 그 변수를state변수
로 만들어서
관리한다.
만들어진 state변수속의 값을 변경시켜주는 함수.
state 변수
속에 대입해야하는 값을 설정해주는 함수,
state변수
에 대입연산자를 사용하여 직접 변경하면원본이 훼손
되기때문에
절대로state변수
에 대입연산자 쓰면안되고,
👇++ -- += -= /= ....
setState함수
를 통해 변경해줘야 한다❗️setNumber(number++); //이렇게 쓰면 안되는 이유: 2번 출력 //원본이 훼손되면 안되기떄문에/ 비교가 불가능해짐 setNumber(number+1); //이렇게 사용해야함
//📍기본적으로 (state변수)
let [a,b] = [10,20];
// a=10, b=20
//📍여기서조금더 복잡하게 간다면?
function tmp(){
return [10, 20];
}
let [a.b] =tmp();
// a=10, b=20
//📍여기서 조금 더더 복잡하게 가면?
function tmp(){
function abc(){
return 500;
}
return [10,abc];
}
let [a,b] = tmp();
// a=10, b=abc함수
//📍b를 함수로 쓸수있는가?
b();
👉 YES! b는 함수로 쓸 수 있다.
// b()는 500이라는 값을 리턴한다.
let [a,b] = useState(); // a는 state변수, b는 setState함수
💁🏻♀️ 예시를 봐보자.
일단은, useState를 import
해야한다.
import { useState } from "react";
const StatePage = () => {
let [number, b] = useState(0);
//state변수 number 에 0
//b는 함수(setState함수)
//함수
const normalClick = () => {
console.log('normalClick');
}
const plusClick = () => {
// number++;
b(100); //number가 100이 대입되어야한다
}
return (
<>
<h1>state component</h1>
<h2>{number}</h2>
<button onClick={normalClick}>기본버튼입니다!</button>
<br />
<button>-</button>
<button onClick={plusClick}>+</button>
</>
);
}
export default StatePage;
👇 b 가 setNumber로 변경.
const StatePage = () => {
let [number, setNumber] = useState(0);
//state변수 number 에 0
const plusClick = () => {
// number++;
setNumber(100); //number가 100이 대입되어야한다
}
import { useState } from "react";
const StatePage = () => {
let [number, setNumber] = useState(0);
//state변수 number 에 0
//setNumber는 함수(setState함수)
//함수
const normalClick = () => {
console.log('normalClick');
}
const plusClick = () => {
setNumber(number + 1); //number가 +1 를 컴퓨터가 기억하고, setNumber 저장
//setNumber(number++);
//이렇게 쓰면 안되는 이유: 2번 출력
//원본이 훼손되면 안되기떄문에/ 비교가 불가능해짐
}
const minusClick = () => {
setNumber(number - 1);
}
return (
<>
<h1>state component</h1>
<h2>{number}</h2>
<button onClick={normalClick}>기본버튼입니다!</button>
<br />
<button onClick={minusClick}>-</button>
<button onClick={plusClick}>+</button>
</>
);
}
export default StatePage;
✏️ 변수속에 있는 값이 변하면 다시 그려져야할 경우에,
그 변수를state변수
로 만든다.
대신 state변수 속에 있는 값을 변경할 때는 대입연산자로 직접 변경하는 것이
아니라setState변수
를 통해서 값을 변경해준다
오류발생을 막히위해, 혹시나 number에 100을 넣으려고하면 warning으로 number is const라고 뜬다. 너이미 number있는데?하면서
let [number, setNumber] = useState(0);
👇
const [number, setNumber] = useState(0);
state변수
의 상태가 바뀌어서re-rendering
된다면,
자기 자신이 속해있는 컴포넌트가 다시re-rendering
된다
🎬 이벤트가 발생하면 실행되는
함수의 매개변수
에는 자동으로
발생한 이벤트에대한 정보(어떤이벤트인지? x좌표, .. ,어떤태그에서발생한이벤트인지)
들이
들어있는 이벤트객체가 인자로 전달이 된다
이벤트객체.target
에는 클릭이벤트가 발생한 html태그(요소)가 객체로 들어있다.ex)e.target
이벤트객체.target
에 발생한input태그객체
가 들어있고,
input태그에 입력한 값
은input태그
안에value
에 들어있다
👇👇
이벤트객체.target.value --> 사용자가 input태그에 입력한 값
eTargetValue.js
import styled from "@emotion/styled";
import { useState } from "react";
const AWrap = styled.div`
border: 3px solid red;
`;
const A = ()=>{
const [msg, setMsg] = useState('메시지');
// tmp 는 change 이벤트가 발생하면 실행되는 함수
const tmp = (e)=>{
console.log('change이벤트 발생함');
// 매개변수 e 에는 무엇이 들어있을까? //!보통 매개변수 e는 event 객체를 받아기 때문에 e라고 이름을 붙임
console.log(e);
// e.target에는 이벤트가 발생한 태그가 들어있음(input태그)
// 우리가 입력한 값은 input태그.value에 들어있음
console.log(e.target.value);
setMsg(e.target.value);
//입력값이 setMsg함수에 저장된다.
}
return (
<AWrap>
<h1>A컴포넌트영역입니다</h1>
<input onChange={tmp}/>
<p>{msg}</p>
</AWrap>
);
}
enterPress.js
import { useState } from "react";
// 엔터키가 눌릴떄마다 실행시킬 함수
const enterPressed = (e) => {
const [msg, setMsg] = useState('메시지');
console.log('onKeyDown이벤트 발생함');
// 엔터가 눌렸을 때
console.log(e);
//setMsg('메시지');
// e.keyCode 엔터는 13이 들어있음
if (e.keyCode === 13) {
setMsg('엔터클릭됨');
} else if (e.keyCode === 27) {
console.log('esc눌림');
e.target.blur();
//깜빡깜빡 거리지않게
}
}
return (
<AWrap>
<h1>A컴포넌트영역입니다</h1>
<input onChange={tmp} onKeyDown={enterPressed} />
<p>{msg}</p>
</AWrap>
);
}
엔터를 누른후, console.log로 출력해보면
key:"Enter", keyCode:13
오른쪽 화살표를 누른후, console.log 출력해보면
key: "Arrow right", keyCode:39
이렇게 출력된다.