import { useState } from "react";
function App() {
const [number, setNumber] = useState(0);
return (
<>
<div>Number State : {number}</div>
<button onClick={()=>{
// 입문주차에서 배웠던 기존 업데이트 방법
// 버튼을 누르면 숫자가 1씩 올라간다.
setNumber(number + 1);
// 함수형 업데이트를 적용한 방법
// 버튼을 누르면 숫자가 1씩 올라간다.
setNumber((currentNumber)=>{
return currentNumber + 1
});
}}>누르면 UP</button>
</>
);
}
export default App;
import { useState } from "react";
function App() {
const [number, setNumber] = useState(0);
return (
<>
<div>Number State : {number}</div>
<button onClick={()=>{
// 버튼을 누르면 숫자가 1씩 올라간다.
/* 배치성으로 처리 -> 배치 업데이트
리액트는 아래의 내용을 한꺼번에 가져와 처리를 하는데 내용이 중복되니 한번만 처리함 */
setNumber(number + 1);
setNumber(number + 1);
setNumber(number + 1);
// 버튼을 누르면 숫자가 3씩 올라간다.
/* currentNumber => 현재 상태의 State가 들어옴
마찬가지로 아래 내용을 한꺼번에 가져오지만 현재 상태의 State가 들어오기 때문에
각 함수마다 모두 다른 값을 받으므로 세번을 순차적으로 실행시킨다.*/
setNumber((currentNumber)=>currentNumber + 1);
setNumber((currentNumber)=>currentNumber + 1);
setNumber((currentNumber)=>currentNumber + 1);
}}>누르면 UP</button>
</>
);
}
export default App;
import { useEffect } from "react";
import { useState } from "react";
function App() {
const [value, setValue] = useState('')
useEffect(()=>{
console.log('hi')
});
return <div>
<input type="text" value={value}
onChange={(e)=>{
setValue(e.target.value);
}}/>
</div>;
}
export default App;
useEffect(()=>{console.log('hi')}, []);
useEffect(()=>{console.log(`${value}`)}, [value]);
useEffect(()=>{
console.log('hi');
// 이 아래쪽에 return문 작성
return () => {/* 이 부분에 반환하고 싶은 내용을 적어준다. */}
}, []);
import { useRef } from "react";
function App() {
// 객체 형태의 {current: "초기값"} 으로 콘솔에 찍힌다.
const ref = useRef('초기값');
console.log('ref1', ref);
// 이런식으로 ref로 설정해놓은 곳에 접근해서 값을 변경할 수도 있다.
ref.current = '변경값';
console.log('ref2', ref);
return <div></div>;
}
export default App;
이렇게 설정된 ref 값은 컴포넌트가 계속해서 렌더링 되어도 unmount 전까지 값을 유지한다.
import { useRef, useState } from "react";
const style = {
width: '300px',
border: '2px solid skyblue',
margin: '10px',
padding: '10px',
}
function App() {
const [count, setCount] = useState(0);
const countRef = useRef(0);
const plusState = () => {
setCount(count + 1);
}
const plusRef = () => {
countRef.current++;
console.log(countRef.current)
}
return (
<>
<div style={style}>
state 영역입니다. {count} <br />
<button onClick={plusState}>state 증가</button>
</div>
<div style={style}>
ref 영역입니다. {countRef.current} <br />
<button onClick={plusRef}>ref 증가</button>
</div>
</>
)
}
export default App;
// useEffect, useRef 모두 렌더링
import React, { useEffect, useRef } from 'react'
function App() {
// idRef로 변수를 지정
const idRef = useRef('');
// 화면이 렌더링 될 때마다 어떠한 작업을 하고 싶은 경우 -> useEffect 사용
useEffect(() => {
// 아이디 input을 연결시킨 idRef의 current에 focus를 두도록 작성
idRef.current.focus();
}, []);
return (
<>
<div>
/* 아이디의 input을 지정해줘야하므로 input에 대한 레퍼런스를 갖고 있어야한다.
ref={idRef}라는 속성을 넣어서 ref와 연결시켜준다.*/
아이디 : <input type='text' ref={idRef} />
</div>
<div>
비밀번호 : <input type='password' />
</div>
</>
)
}
export default App
// 아래 React Hooks을 사용할 때는 꼭 import 해줘야 동작한다.
import React, { useEffect, useRef, useState } from 'react'
function App() {
const idRef = useRef('');
const pwRef = useRef('');
// id input에 들어오는 값들을 tracking하기 위해 useState 사용
const [id, setId] = useState('');
// onChange 속성을 사용하여 입력 값 받아오기
const onChangeId = (e) => {
setId(e.target.value);
}
useEffect(() => {
idRef.current.focus();
}, []);
// useEffect 한번 더 사용
useEffect(() => {
// 아이디 input의 value값인 id의 길이가 10이상일 때
if(id.length >= 10) {
// 비밀번호 칸이 포커스 되도록
pwRef.current.focus();
}
// useEffect가 발동되려면 id 값이 변화해야하므로 의존성 배열에 id를 넣어준다.
}, [id])
return (
<div style={{margin: '30px'}}>
<div>
아이디 : <input type='text' ref={idRef} value={id} onChange={onChangeId} />
</div>
<div>
비밀번호 : <input type='password' ref={pwRef} />
</div>
</div>
)
}
export default App
오.. 아주 잘 작동한다.
import React, { useEffect, useRef, useState } from 'react'
function App() {
const idRef = useRef('');
const pwRef = useRef('');
const [id, setId] = useState('');
const onChangeId = (e) => {
setId(e.target.value);
// useEffect를 없애고 이 부분에 조건 추가!
if(id.length >= 10) {
pwRef.current.focus();
}
}
useEffect(() => {
idRef.current.focus();
}, []);
return (
<div style={{margin: '30px'}}>
<div>
아이디 : <input type='text' ref={idRef} value={id} onChange={onChangeId} />
</div>
<div>
비밀번호 : <input type='password' ref={pwRef} />
</div>
</div>
)
}
export default App
..?
11개를 입력해야만 포커스가 넘어간다.
이해가 되지 않아 뭔가 문제인지 고민하다가 문제 풀이영상을 보고 알게 되었다.
id의 console.log를 찍어보자.
const onChangeId = (e) => {
setId(e.target.value);
// 이 부분에 console.log 찍기
console.log('id', id);
if(id.length >= 10) {
pwRef.current.focus();
}
}
아직 React Hooks의 종류를 3가지 밖에 익히지 못했는데 아직 종류의 절반도 본게 아니라니.. 갈 길이 멀다😂