props를 활용한 컴포넌트 만들기
Info
태그를 사용할 때 지정한 이름을 props.지정한이름
으로 받아주면 된다.//App.js
import Info from "./Info";
import "./App.css";
function App() {
return (
<div className="App">
<Info memberName="박시은" />
</div>
);
}
export default App;
//Info.js
import React from "react";
function Info(props) {
const memberName = props.memberName;
return <h1>멤버 이름은 {memberName}입니다.</h1>;
}
export default Info;
객체 props 받고 연산하기
.
을 통해 object의 속성에 접근하여 값을 불러올 수 있음.//Member.js
import React from "react";
function Member({ member }) {
let isAdult = member.age >= 20 ? "성인" : "미성년자";
return (
<>
<p>
멤버의 이름은 {member.name}이고 현재 {isAdult} 입니다.멤버의 이름은 {member.name}이고 포지션은 {member.role}이며, 현재{" "}
{isAdult} 입니다.
</p>
</>
);
}
export default Member;
//App.js
import Info from "./Info";
import "./App.css";
import Member from "./Member";
function App() {
const member1 = {
name: "박시은",
age: "21",
role: "메인 보컬",
};
const member2 = {
name: "김채영",
age: "20",
role: "리드 보컬",
};
const member3 = {
name: "장재이",
age: "17",
role: "서브 보컬",
};
return (
<div className="App">
{/* <Info memberName="박시은" /> */}
<Member member={member1} />
<Member member={member2} />
<Member member={member3} />
</div>
);
}
export default App;
setState
를 이용하여 변경합니다.⇒ 현재 값을 기반으로 state를 변경할 때는 함수로 변경하는 것이 권장된다고합니다.
//App.js
import Info from "./Info";
import "./App.css";
import Member from "./Member";
import { FcLike } from "react-icons/fc";
import React, { useState } from "react";
function App() {
const [member, setMember] = useState({
name: "박시은",
age: "21",
role: "메인 보컬",
like: 0,
});
return (
<div className="App">
<Member member={member} />
<button
onClick={() => {
setMember((current) => {
const newMember = { ...current };
newMember.like = current.like + 1;
return newMember;
});
}}
>
<FcLike />
</button>
</div>
);
}
export default App;
//Member.js
import React, { useState } from "react";
import { FcLike } from "react-icons/fc";
function Member({ member }) {
let isAdult = member.age >= 20 ? "성인" : "미성년자";
return (
<>
<p>
멤버의 이름은 {member.name}이고 포지션은 {member.role}이며, 현재
{isAdult} 입니다.
<br />
하트 수 <FcLike /> {member.like}
</p>
</>
);
}
export default Member;
input
태그의 onChange
속성에 이벤트를 매개변수로 받는 익명함수를 선언setMessage
를 통하여 값을 바꾸게 함!onChange
함수는 변화가 있을 때마다 할당된 일을 수행함//App.js
import React, { useState } from "react";
function App() {
const [message, setMessage] = useState();
return (
<div className="App">
<h3>{message}</h3>
<input
value={message}
onChange={(ev) => {
setMessage(ev.target.value);
}}
></input>
</div>
);
}
export default App;
onClick
onChange
onKeyDown
,onKeyUp
,onKeyPress
: 키보드 입력이 일어났을때onDoubleClick
onFocus
onBlur
:element가 포커스를 잃었을때onSubmit
: Form 에서 submit 했을 때핸들링 함수를 선언하여 이벤트 처리하기
isImgOn
과 같은 bool
타입 변수를 바꿔줄때도 setState
를 이용하여 변화를 줘야함!isImgOn
을 let
으로 선언해서 값 변경을 해도 리액트는 변화를 감지하지 못함!import Info from "./Info";
import "./App.css";
import Member from "./Member";
import { FcLike } from "react-icons/fc";
import React, { useState } from "react";
function App() {
const [isImgOn, setImgOn] = useState(false);
const handleImg = () => {
setImgOn(!isImgOn);
};
const sImg =
"http://www.stardailynews.co.kr/news/photo/202109/308471_354191_1158.jpg";
return (
<div className="App">
<button onClick={handleImg}>사진</button>
<div>{isImgOn ? <img alt="시은" src={sImg} /> : ""}</div>
</div>
);
}
export default App;
current
를 이용하여 복사하는 것을name
에 객체 속성 값을 넣어줘서 값을 변경함value
에는 기본 값이 들어있다.
import React, { useState } from "react";
function App() {
const [fan, setFan] = useState({
name: "김릴리",
song: "Slow Down",
});
const handleChange = (ev) => {
const { name, value } = ev.target;
setFan((current) => {
const newFan = { ...current };
newFan[name] = value;
return newFan;
});
};
return (
<div className="App">
<input type="text" name="name" value={fan.name} onChange={handleChange} />
<input type="text" name="song" value={fan.song} onChange={handleChange} />
<button
onClick={() => {
alert(`${fan.name}의 최애곡은 ${fan.song}입니다.`);
}}
>
확인
</button>
</div>
);
}
export default App;
//UserForm.js
import React from "react";
function UserForm({ onChange }) {
return <input onChange={onChange} />;
}
export default UserForm;
//App.js
import UserForm from "./UserForm";
function App() {
const [username, setUserName] = useState("아무개");
return (
<div className="App">
<h1>{username}의 블로그</h1>
<UserForm
onChange={(ev) => {
setUserName(ev.target.value);
}}
/>
</div>
);
}
export default App;
use
로 시작해야함.useState
: 컴포넌트 내 동적인 데이터 관리
const App=()=>{
const[state이름, setState이름] = useState(초기값);
}
useEffect
: state의 값이 변경될 때 마다 설정해 놓은 함수가 호출됨.
컴포넌트가 생성될 때, 소멸될 때를 감지하여 특정 로직을 실행할 수 있음.
기본형
Deps -> 변경을 감지할 변수들의 집합(배열)
EffectCallback : Deps에 지정된 변수가 변경될 때 실행할 함수
const App=()=>{
useEffect(EffectCallback, Deps?)
}
예제 - 값 변경시 감지
username의 값이 변경될때 마다 콘솔로그에 username이 찍힘
event의 3번 예제 응용
//UserForm.js
import React from "react";
function UserForm({ onChange }) {
return <input onChange={onChange} />;
}
export default UserForm;
//App.js
import UserForm from "./UserForm";
function App() {
const [username, setUserName] = useState("아무개");
useEffect(() => {
console.log(username);
}, [username]);
return (
<div className="App">
<h1>{username}의 블로그</h1>
<UserForm
onChange={(ev) => {
setUserName(ev.target.value);
}}
/>
</div>
);
}
export default App;
결과
예제 2 - 컴포넌트의 생성/소멸 확인
{isImgOn && <Info />}
: isImgOn
가 true
일 경우 Info
출력//Info.js
import React, { useEffect } from "react";
function Info(props) {
useEffect(() => {
console.log("컴포넌트 생성");
return () => {
console.log("컴포넌트 소멸");
};
}, []);
return null;
}
export default Info;
//App.js
import Info from "./Info";
import "./App.css";
import React, { useState, useEffect } from "react";
function App() {
const [isImgOn, setImgOn] = useState(false);
const handleImg = () => {
setImgOn(!isImgOn);
};
const sImg =
"http://www.stardailynews.co.kr/news/photo/202109/308471_354191_1158.jpg";
return (
<div className="App">
<button onClick={handleImg}>사진</button>
<div>{isImgOn ? <img alt="시은" src={sImg} /> : ""}</div>
{isImgOn && <Info />}
</div>
);
}
export default App;
화면
콘솔
useMemo
import React, { useState, useEffect, useMemo } from "react";
function App() {
const [num1, setNum1] = useState(0);
const [num2, setNum2] = useState(0);
const multi = useMemo(() => {
return num1 * num2;
}, [num1, num2]);
return (
<div className="App">
<input
value={num1}
onChange={(event) => {
setNum1(parseInt(event.target.value));
}}
/>
<input
value={num2}
onChange={(event) => {
setNum2(parseInt(event.target.value));
}}
/>
<div>
{num1}*{num2}={multi}
</div>
</div>
);
}
export default App;
useCallback
useMemo(()⇒fn,deps)
와 useCallback(fn,deps)
는 같음useCallback
은 함수형태로 사용해야함! ```jsx
import React, { useState, useEffect, useMemo, useCallback } from "react";
function App() {
const [num1, setNum1] = useState(0);
const [num2, setNum2] = useState(0);
const multi = useMemo(() => {
return num1 * num2;
}, [num1, num2]);
const calc = useCallback(() => {
return num1 + num2;
}, [num1, num2]);
return (
<div className="App">
<input
value={num1}
onChange={(event) => {
setNum1(parseInt(event.target.value));
}}
/>
<input
value={num2}
onChange={(event) => {
setNum2(parseInt(event.target.value));
}}
/>
<div>
{num1}*{num2}={multi}
</div>
<div>
{num1}+{num2}={calc()}
</div>
</div>
);
}
export default App;
```
useRef
import React,{useRef} from 'react';
function App() {
const inputRef = useRef();
return (
<div className="App">
<input ref={inputRef} />
<button onClick={()=>{
alert(inputRef.current.value);
}}>
클릭
</button>
</div>
);
}
export default App;
```jsx
//useToggle.js
import React,{useState} from 'react';
const useToggle =(initialValue)=>{
const [isOn, setIsOn] = useState(initialValue);
const toggle=()=>{
setIsOn((current)=>{
return !current;
});
}
return {isOn, toggle};
}
export default useToggle;
//App.js
import React from 'react';
import useToggle from './hooks/useToggle';
function App() {
const{isOn, toggle} = useToggle(false);
return (
<div className="App">
<button onClick={()=>{
toggle();
}}>
{isOn ? "켜짐" : "꺼짐"}
</button>
</div>
);
}
export default App;
```