8주차에는 스타일 라이브러리인 Emotion과 Redux Toolkit을 적용하는 것을 배웠다. 그리고 8주차 과제에는 배운 것을 적용하여 홈페이지를 예쁘게 스타일링하는 것이었다.
Emotion은 Javascript로 css 스타일을 작성하기 위한 라이브러리이다. Emotion을 사용하는 두가지 주된 방법이 있다. 첫번째는 프레임워크에 구애받지 않고 사용하는 것이고, 두번째는 리액트에 사용하는 것이다. (두가지 설치 방법이 다르다)
import styled from '@emotion/styled';
const MenuList = styled.ul({
display: 'flex',
margin: 0,
padding: '.4em 0',
listStyle: 'none',
});
// props를 받아서 사용할 수 있음
const MenuItem = styled.li(({ active }) => ({
marginRight: '1em',
'& button': {
color: '#333',
padding: '.4em 1em',
border: '1px solid #ccc',
backgroundColor: active ? '#eee' : 'transparent',
textDecoration: 'none',
cursor: 'pointer',
'&:hover': {
fontWeight: 'bold',
color: '#000',
},
},
}));
export default function RegionsContainer() {
const dispatch = useDispatch();
const regions = useSelector(get('regions'));
const selectedRegion = useSelector(get('selectedRegion'));
function handleClick(regionId) {
dispatch(selectRegion(regionId));
dispatch(loadRestaurants());
}
return (
<MenuList>
{regions.map((region) => (
<MenuItem
key={region.id}
active={selectedRegion && region.id === selectedRegion.id}
>
<button type="button" onClick={() => handleClick(region.id)}>
{region.name}
{selectedRegion
? region.id === selectedRegion.id
? '(V)'
: null
: null}
</button>
</MenuItem>
))}
</MenuList>
);
}
slice.js
파일에 이것들을 모아둔다.import { configureStore } from '@reduxjs/toolkit';
import reducer from './slice';
const store = configureStore({ reducer });
export default store;
import { configureStore } from '@reduxjs/toolkit'
import usersReducer from './usersReducer'
import postsReducer from './postsReducer'
const store = configureStore({
reducer: {
users: usersReducer,
posts: postsReducer,
},
})
export default store
📁src
ㅏApp.jsx
ㅏApp.test.jsx
ㅏindex.js
ㅏreducer.js
ㅏreducer.test.js
ㅏstore.js
ㅏutils.js
ㅏutils.test.js
ㅏ📁components
ㅏ📁Categories
ㅏCategoriesContainer.jsx
ㅏCategoriesContainer.test.jsx
ㅏ📁MenuItems
ㅏMenuItems.jsx
ㅏMenuItems.test.jsx
ㅏ📁Regions
ㅏRegionsContainer.jsx
ㅏRegionsContainer.test.jsx
ㅏ📁ReviewForm
ㅏReviewForm.jsx
ㅏReviewForm.test.jsx
ㅏ📁Reviews
ㅏReviews.jsx
ㅏReviews.test.jsx
ㅏ📁TextField
ㅏTextField.jsx
ㅏTextField.test.jsx
ㅏ📁pages
ㅏ📁AboutPage
ㅏAboutPage.jsx
ㅏAboutPage.test.jsx
ㅏ📁HomePage
ㅏHomePage.jsx
ㅏHomePage.test.jsx
ㅏ📁LoginPage
ㅏLoginForm.jsx
ㅏLoginForm.test.jsx
ㅏLoginFormContainer.jsx
ㅏLoginFormContainer.test.jsx
ㅏLoginPage.jsx
ㅏLoginPage.test.jsx
ㅏLogoutForm.jsx
ㅏLogoutForm.test.jsx
ㅏ📁NotFoundPage
ㅏNotFoundPage.jsx
ㅏNotFoundPage.test.jsx
ㅏ📁RestaurantPage
ㅏRestaurantContainer.jsx
ㅏRestaurantContainer.test.jsx
ㅏRestaurantDetail.jsx
ㅏRestaurantDetail.test.jsx
ㅏRestaurantPage.jsx
ㅏRestaurantPage.test.jsx
ㅏ📁RestaurantsPage
ㅏRestaurantsContainer.jsx
ㅏRestaurantsContainer.test.jsx
ㅏRestaurantsPage.jsx
ㅏRestaurantsPage.test.jsx
ㅏ📁services
ㅏ📁slice
ㅏloginSlice.js
ㅏslice.js
관심사별로 폴더 분리를 하는 게 처음이라서 많이 어려웠다.
와... 이거 포스팅을 안 해놓고 있었다.
포스팅 해놓은 줄 알고 있었는데, 안 했었다니...!
지금이라도 뒤늦게 포스팅합니다...
리액트 8주차 과제가 끝난 이후에는 슬라이드 기능도 좀 더 보완하고, 페이지네이션 기능도 만들고, 웹페이지 디자인도 좀 바꿔서 Netlify를 통해서 배포한 상태이다. (하지만 이 글을 올리는 시점에는 배포한 사이트에 오류가 있어서...헤매는 중이다.)
암튼 리액트에 대해서 공부하게 된 좋은 계기였다. 코드숨 과정을 들으면서 아쉬웠던 점은 강의가 옛날 강의라는 점? (옛날 강의이다 보니, 직접 새로운 버전을 검색하면서 배우는 것도 좋았지만, 어떻게 보면 초반에 배우는 사람들에게는 힘들수도 있을 것 같다)