tmdb API๋ฅผ ํ์ฉํ ์ํ ์ถ์ฒ ์ฌ์ดํธ
-
React
- styled-components
- react-icons
- react-responsive
- react-router-dom
-
Redux-thunk
-
๋ฐฐํฌ : netlify
-
์ค๋์ ์ํ Top10 ์ถ์ฒ
-
์ ํํ ์ฅ๋ฅด๋ณ ์ํ Top20 ์ถ์ฒ
-
์ํ ์ ํ ์ ์ฅ
- ์ ํ์, ์ถ์ฒ์, ์ธ๊ธฐ์ ์ ๋ ฌ
- ์ฌ์ฌ์ฉํ ์ ์๋ ์ปดํฌ๋ํธ๋ ๋ถ๋ฆฌ๋ ์ ์๋๋ก ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ฅผ ๋๋ด๋ค.
- container component์ presentational component๋ฅผ ๋๋์ด ์ํ, UI๋ฅผ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ๋ค.
- ์ ํธํจ์๋ก refactoringํ์ฌ api๋ฅผ ๋ฐ์์ค๋ ๋ถ๋ถ์์ ๋ฐ๋ณต๋๋ ํจ์๋ฅผ ์ ๋ฆฌํ๋ค.
- ๋ถํ์ํ style์ ์์ฑํ์ง ์๊ธฐ ์ํด ๊ณ ๋ฏผํ๋ค.
- GenreList Component : ์ฒดํฌ๋ฐ์ค ์ปจํธ๋กค ์ปดํฌ๋ํธ
function GenreListComponent({ data }) {
const dispatch = useDispatch();
const userGenre = JSON.parse(localStorage.getItem("genre"))
? JSON.parse(localStorage.getItem("genre"))
: [];
//์ ์ ๊ฐ ์ ํํ ์ฅ๋ฅด
const [selectGenres, setselectGenres] = useState(userGenre);
//"๋ชจ๋ ์ฅ๋ฅด" input controller
const [isAllChecked, setIsAllChecked] = useState(
userGenre.length === 0 ? true : false
);
//์ ์ฒดํด์
const onCancle = () => {
setIsAllChecked(true);
setselectGenres([]);
};
//"๋ชจ๋ ์ฅ๋ฅด" ์ปจํธ๋กค
const handleAll = () => {
setselectGenres([]);
setIsAllChecked(true);
};
//"๋ชจ๋ ์ฅ๋ฅด" ์ ์ธ ์ปจํธ๋กค
const handleCheck = (e, checked, genre) => {
setIsAllChecked(false);
if (checked) {
setselectGenres([...selectGenres, genre]);
} else {
setselectGenres(
selectGenres.filter(
(genres) => JSON.stringify(genres) !== JSON.stringify(genre)
)
);
}
};
//์ฐพ์๋ณด๊ธฐ
const onSearch = () => {
setGenre(selectGenres);
dispatch(getGenreMovies(selectGenres.map((genre) => genre.id)));
};
return (
<S.Section>
<S.Genres>
<S.Title>์ฅ๋ฅด๋ณ ์ํ ์ฐพ๊ธฐ</S.Title>
<S.GenreBox>
<S.GenreList>
<S.Input
type="checkbox"
name="allGenres"
id="allGenres"
checked={isAllChecked}
onChange={(e) => handleAll(e.target.checked)}
/>
<S.Label htmlFor="allGenres">๋ชจ๋ ์ฅ๋ฅด</S.Label>
</S.GenreList>
{data &&
data.map((genre) => (
<S.GenreList key={genre.id}>
<S.Input
type="checkbox"
name={genre.name}
id={genre.id}
checked={
JSON.stringify(selectGenres).includes(JSON.stringify(genre))
? true
: false
}
onChange={(e) => handleCheck(e, e.target.checked, genre)}
/>
<S.Label htmlFor={genre.id}>{genre.name}</S.Label>
</S.GenreList>
))}
</S.GenreBox>
<S.ButtonBox>
<S.Button onClick={onCancle}>์ ์ฒดํด์ </S.Button>
<S.Button onClick={onSearch}>์ฐพ์๋ณด๊ธฐ</S.Button>
</S.ButtonBox>
</S.Genres>
</S.Section>
);
}
export default GenreListComponent;