모각코+/React
[모각코+] 웹 리액트(React) 1월달과정 13일차
Jshrewd
2022. 1. 27. 00:42
728x90
https://codemate.kr/@Qcell/input-%ED%83%9C%EA%B7%B8-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC-ipQ53Trvdq
input 태그 상태 관리 by Qcell | 코드메이트
이번 시간에는 input 태그 상태 관리를 통해 홈 탭에서 console.log로 입력한 데이터를 출력하는 통신을 구현했습니다 :) 그 전에 전시간까지 구현했던 탐색 페이지에 이어서, 홈 탭에서도 데이터를
codemate.kr
input 태그 상태 관리
이번 시간에는 input 태그 상태 관리를 통해 홈 탭에서 console.log로 입력한 데이터를 출력하는 통신을 구현했습니다 :)
그 전에 전시간까지 구현했던 탐색 페이지에 이어서, 홈 탭에서도 데이터를 받아와 구현하는 HomeCard와 HomeFilter 컴포넌트를 구현하였습니다.
HomeCard.js
import styles from './HomeCard.module.css';
function HomeCard(data, index) {
return (
<a
href={`https://www.youtube.com/watch?v=${data.id}`}
key={`home-card-${index}`}
className={styles.card}
>
<img
className={styles.thumbnail}
src={data.thumbnail}
alt={`${data.title}의 썸네일`}
/>
<div className={styles.info}>
<a href={`https://www.youtube.com/channel/${data.channelId}`}>
<img
className={styles.channelImg}
src={data.channelThumbnail}
alt={`${data.channelTitle} 프로필 사진`}
/>
</a>
<div>
<div className={styles.title}> {data.title}</div>
<div className={styles.uploader}>{data.channelTitle}</div>
<div className={styles.flex}>
<div className={styles.view}>{data.viewCount}</div>
<div className={styles.date}>{data.date}</div>
</div>
</div>
</div>
</a>
);
}
export default HomeCard;
HomeFilter.js
import styles from './HomeFilter.module.css';
function HomeFilter({ filter, text, onClickFilter }) {
return (
<button
className={filter === text ? styles.black : styles.gray}
onClick={onClickFilter}
>
{text}
</button>
);
}
export default HomeFilter;
그 뒤에, Home 컴포넌트에서 데이터 통신을 하기 위해 onClick 메소드와 event를 prop로 받는 onChange 메소드를 구현하여 input 태그의 입력값을 console.log로 출력했습니다 :D
Home.js
import styles from './Home.module.css';
import Layout from '../components/shared/Layout';
import youtubeData from '../data/youtubeData.json';
import HomeFilter from '../components/home/HomeFilter';
import HomeCard from '../components/home/HomeCard';
import { useState } from 'react';
const target = ['전체', 'Music', 'Entertainment', 'Comedy'];
function Home() {
const [filter, setFilter] = useState('전체');
function mapFunc(data, index) {
return (
<HomeFilter
filter={filter}
text={data}
onClickFilter={function () {
setFilter(data);
}}
key={`home-filter-${index}`}
/>
);
}
function filterFunc(data) {
if (filter === '전체' || data.category === filter) return true;
return false;
}
return (
<Layout activeMenu="home">
<div className={styles.header}>{target.map(mapFunc)}</div>
<div className={styles.container}>
<div className={styles.grid}>
{youtubeData['data'].filter(filterFunc).map(HomeCard)}
</div>
</div>
</Layout>
);
}
export default Home;

728x90