4기 카카오 프론트 전체 스터디 - 리액트 2주차 (조건부 렌더링, 리스트, 스타일링, 폼 다루기)
이번에는 리액트를 스타일링하는 것 그리고 양식 및 사용자 입력에 대한 폼 다루는 방법을 이야기해 보겠다.
목표
이를 통해 이룰 목표는 다음과 같다.
- 조건부 렌더링
- 리스트 렌더링 / key
- Styled-components / Tailwind CSS
- 폼 다루기
하나식 해결해 보자.
조건부 렌더링
우리는 조건부에 따라서 렌더링을 부분적으로 일으킬 수 있다. 코드를 살펴보자.
예시 1 (if문 작성)
let content;
if (isLoggedIn) {
content = <AdminPanel />;
} else {
content = <LoginForm />;
}
return (
<div>
{content}
</div>
);
심플하게 보면, if문을 이용해서 조건부로 렌더링을 할 수 있다.
이보다 더 코드를 축약하고 싶다면 삼항연산자를 사용하면 된다.
예시 2 (삼항연산자)
<div>
{isLoggedIn ? (
<AdminPanel />
) : (
<LoginForm />
)}
</div>
true이면 ":" 연산자 앞에 있는 컴포넌트가 렌더링 되고, 그게 아니면 뒤에 있는 컴포넌트가 렌더링이 된다.
else 분기가 필요하지 않으면 더 짧은 && 연산자를 사용할 수도 있다.
<div>
{isLoggedIn && <AdminPanel />}
</div>
리스트 렌더링 / key
반복되는 리스트를 렌더링 하는 방법이 있다. 바로 map()이라는 함수를 사용하는 것이다. 코드를 살펴보자.
예를 들어..
const products = [
{ title: 'Cabbage', id: 1 },
{ title: 'Garlic', id: 2 },
{ title: 'Apple', id: 3 },
];
이런 리스트가 있다고 치자. 그러면
const products = [
{ title: 'Cabbage', id: 1 },
{ title: 'Garlic', id: 2 },
{ title: 'Apple', id: 3 },
];
const listItems = products.map(product =>
<li key={product.id}>
{product.title}
</li>
);
return (
<ul>{listItems}</ul>
);
그 리스트를 map함수로 가져오고 그것을 변수에 할당할 수 있다.
코드를 살펴보면 product라는 리스트의 title를 <li> 태그로 반복하여 렌더링 할 수 있게 만든다.
이것을 const로 선언 이후 return 값에 <ui> 태그로 렌더링 하게 만든다.
key의 중요성
이때, <li>에 key 값을 할당한다.
목록의 각 항목에 대해, 형제 항목 사이에서 해당 항목을 고유하게 식별하는 문자열 또는 숫자를 전달해야 한다.
React는 나중에 항목을 삽입, 삭제 또는 재정렬할 때 어떤 일이 일어났는지 알기 위해 key를 사용한다.
key는 할당해야 하며 그렇지 않으면 에러가 뜬다. key는 보통 id값을 할당해 주는 것이 관례이다.(상황에 따라 달라질 수 있음)
Styled-components / Tailwind CSS
이제, 전반적인 스타일링에 대한 이야기를 조금 해보겠다.
리액트에선 스타일링을 여러 방식으로 진행이 가능하다.
리스트를 좀 뽑으면.
- 바닐라 css
- 인라인 스타일링
- css 모듈로 스코핑하기
- Styled-components
- Tailwind CSS
이 정도이다. (참고로 스타일링도 동적으로 할당이 가능하다.)
바닐라 css는 그냥 일반적인 css이다. 우리가 전부 다 알고 있는 css...
인라인 스타일링도 있고, css모듈로 스코핑하는 것도 있다.
그다음, Styled-components가 있다.
이건 말 그대로 컴포넌트 안에 스타일링까지 박는 것을 뜻한다. 일명 css-in-js인 것.
간략한 코드는 >
npm i styled-components
import styled from "styled-components";
const Button = styled.button`
background: lightblue;
border: none;
padding: 12px 40px;
cursor: pointer;
`;
....
function App() {
return <Button>클릭</Button>
}
이런 식으로 문법을 작성하고, 내가 할당하고 싶은 컴포넌트에 스타일링을 할 수 있다.
jsx에 HTML / CSS / JavaScript가 다 때려 박혀있는 모습을 볼 수 있다.
근데...
https://careerly.co.kr/comments/118367
달레 / 굿바이 Styled Components | 커리어리
Styled Components가 공식적으로 개발을 중단하고 후원도 그만 받는다고 합니다. CSS-in-JS...
careerly.co.kr
정말 놀랍게도 공식적으로 개발을 중단한다고 오피셜로 떴다. css-in-js 라이브러리에서 가장 인기가 많은 라이브러리여서 바로 사라지지는 않고 서서히 사라지겠지만, 새로운 프로젝트는 적용하는 것은 지양하길 바란다.
TailWind
그래서 TailWind가 있다. 이 친구도 비슷한 라이브러리이다.
공식 홈페이지 >
Tailwind CSS - Rapidly build modern websites without ever leaving your HTML.
Tailwind CSS is a utility-first CSS framework for rapidly building modern websites without ever leaving your HTML.
tailwindcss.com
코드를 살펴보자.
<div class="flex flex-col items-center gap-6 p-7 md:flex-row md:gap-8 rounded-2xl">
<div>
<img class="size-48 shadow-xl rounded-md" alt="" src="/img/cover.png" />
</div>
<div class="flex items-center md:items-start">
<span class="text-2xl font-medium">Class Warfare</span>
<span class="font-medium text-sky-500">The Anti-Patterns</span>
<span class="flex gap-2 font-medium text-gray-600 dark:text-gray-400">
<span>No. 4</span>
<span>·</span>
<span>2025</span>
</span>
</div>
</div>
이 라이브러리도 jsx에 스타일링을 박아버리는 모습을 볼 수 있다.
npm으로 설치하는 방법 >
npm install tailwindcss @tailwindcss/vite
이는 vite로 빌드되어 있는 프로젝트에 적용하는 방법이다.
이 밖에 리액트나 Next.js에 적용하는 방법들이 존재한다. 이에 대한 것은 공식문서를 참고하자.
https://tailwindcss.com/docs/installation/using-vite
Installing with Vite - Installation
Integrate Tailwind CSS with frameworks like Laravel, SvelteKit, React Router, and SolidJS.
tailwindcss.com
폼 다루기
생각보다 form은 다루기 어렵다.
물론 컴포넌트를 만들고 사람들에게 form를 제안하는 건 어렵지 않다.(직관적이어서)
그러나 form의 유효성 체크. 즉 "form"의 기능을 제대로 테스트하는 부분에서 좀 까다롭다. (이거 때문에 라이브러리도 있다.)
라이브러리
가장 유명한 라이브러리는 리액트 훅 폼이라는 라이브러리이다.
React Hook Form - performant, flexible and extensible form library
Performant, flexible and extensible forms with easy-to-use validation.
react-hook-form.com
form 레퍼런스
코드를 간략하게 확인해 보자.
export default function Search() {
function search(formData) {
const query = formData.get("query");
alert(`You searched for '${query}'`);
}
return (
<form action={search}>
<input name="query" />
<button type="submit">Search</button>
</form>
);
}
기존적으로 제공해 주는 form을 이용해서 form를 다룰 수 있다.
그리고, 방법은 진짜 여러 가지가 존재한다.
- State와 Handler 사용하는 방법
- Ref를 사용하는 방법
- FormData와 브라우저 API 사용
- 커스텀 Hook 사용
- 라이브러리 사용 (이건 위에서 제공해 줌)
관련 링크 >
https://jeonghwan-kim.github.io/dev/2022/03/29/react-form-and-formik.html
리액트로 폼(Form) 다루기
폼 다루는 방법에 대해 얘기해 보자. 브라우져는 폼을 다루기 위한 내장 API를 가지고 있다. 이걸 이용하면 빠르게 폼을 만들수 있는데 이전에 한 번 정리했다. HTML5 폼 검증에 대해 정리해 보자
jeonghwan-kim.github.io
[react] form을 다루는 5가지 방법
react에서 form을 다루는 방법은 여러가지가 있고 어떤식으로 사용할 수 있는지 한번 알아보자. 다음와 같은 로그인 form이 있다. 아주 간단한 양식이지만 react에서는 여러가지 방식으로 form을 사용
rudaks.tistory.com