Backend
home

2024. 6. 27 - React

복습

Counter.js 코드
import React from "react"; import {useState} from "react"; // let count = 0 // const countHandle = () => { // // count++ // setCount(count + 1) // console.log(count) // } function Counter() { // const [변수명, set함수명] = useState() const [count, setCount] = useState(0) // count = 0 // setCount() => state 값을 변경해주는 함수, 실행 => 재 렌더링 return ( <div> <p>{count}번 클릭!</p> <button onClick={() => setCount(count + 1)}> Click </button> </div> ) } export default Counter
JavaScript
복사
View - 클릭시 카운팅 됨
ToolBar.js
import React from "react"; function Toolbar({isLogin, onClickLoginHandle, onClickLogoutHandle}) { // {a, b, c} // const {isLogin, onClickHandle, onClickLogout} = props return ( <div style={{ padding: 5, borderBottom: '1px solid gray' }}> {isLogin && <h3>환영합니다.</h3>} { isLogin ? <button onClick={onClickLogoutHandle}>로그아웃</button> : <button onClick={onClickLoginHandle}>로그인</button> } </div> ) } export default Toolbar
JavaScript
복사
View

합성

Containment
여러 개의 children 집합이 필요한 경우 별도로 props를 정의해서 각각의 위치에 컴포넌트를 구성해준다.
import React from "react"; import { useState } from "react"; import Dialog from "./Dialog"; let room = [] function SignUpDialog(props) { const [userName, setUserName] = useState(''); const handleClick = (event) => { // 배열에 추가 room.push(userName) setUserName('') alert(`환영합니다!! ${userName}`) } return ( <Dialog title="스터디 팀 참여" message="이름을 입력하세요"> <input type="text" value={userName} onChange={(event) => { setUserName(event.target.value) }} /> <button onClick={handleClick}>참여하기</button> <div> { room.map((name, index) => { return <p key={index}>{name}</p> }) } </div> </Dialog> ) } export default SignUpDialog
JavaScript
복사

컨테이너형 컴포넌트와 프리젠테이션 컴포넌트

상위 컴포넌트는 다른 컴포넌트를 포함하는 일종의 컨테이너(container) 역할을 하는데 이러한 컴포넌트를 ‘컨테이너형 컴포넌트’ 라고 한다.
출력 위주의 하위 컴포넌트를 ‘프리젠테이션 컴포넌트’ 라고 한다.
컨테이너형 컴포넌트 특징
하위 컴포넌트에 필요한 상태와 변수, 함수 등을 가지고 있고 필요할 때 하위 컴포넌트 들에게 이를 속성(props)으로 전달.
컴포넌트들 간의 통신에서 컨트롤러 역할.
프리젠테이션 컴포넌트 특징
주로 화면에 보여줄 내용을 구성하는 용도로 사용.
상위 컴포넌트에서 전달된 속성(props)을 이용해서 상위 컴포넌트와 통신.
하나의 기능에 중점을 두고 만들어지는 경우가 많음.

실습

하위 컴포넌트
Container.js
import React, { useState } from "react"; import Display from "./Display"; function Container(props) { // 하위 컴포넌트의 데이터를 관리, 관련된 핸들러 정의 // 하위 컴포넌트로 필요한 속성 전달 const menus = [ {mno: 1, name: '상품1', price: 3000}, {mno: 2, name: '상품2', price: 4000}, {mno: 3, name: '상품3', price: 5000}, {mno: 4, name: '상품4', price: 6000}, {mno: 5, name: '상품5', price: 7000}, ] // const [selectedMenu, setSelectedMenu] = useState() const changeMenu = (mno) => { const menu = menu.find(m => m.mno === mno) setSelectedMenu(menu) } return ( <div> <Display arr={menus} changeMenu={changeMenu}></Display> <div>선택제품의 설명</div> </div> ) } export default Container
JavaScript
복사
Display.js
import React from "react"; function Display({ arr, changeMenu }) { return ( <div style={{ border: '3px solid #333', padding: 10, width: 200 }}> <ul> { arr.map(menu => { // 반복해야 하는 항목에는 키가 있어야 한다 return <li key={menu.mno} onClick={() => changeMenu()}> {menu.name} </li> }) } </ul> </div> ) } export default Display
JavaScript
복사
실습 - 간단한 단어를 배열로 관리하고 이를 등록/조회/삭제 하는 컴포넌트들 구성하기