5-5. FavoriteListContainer 만들기
import FavoriteList from '../components/FavoriteList';
import { connect } from 'react-redux';
export default connect(
(state) => ({
contacts: state.contacts
})
)(FavoriteList);
이번 컴포넌트는 더더욱 쉽습니다. 연결 해 줄 액션이 없으니 데이터만 넣어주면 됩니다.
하지만, 이제 우리 컴포넌트가 일반 객체가 아닌 immutable
객체들을 다루게 되었으니, 일부 컴포넌트들을 수정해주어야합니다.
FavoriteList 컴포넌트 수정하기
일반 객체가 아닌, Map
과 List
를 다루니까 이에 맞춰서 수정을 해주겠습니다.
propTypes
를 react-immutable-proptypes
를 사용해서 설정을 해주고,
필터링을 하는과정과, key
를 설정하는 부분에서 .get()
을 통하여 값을 가져오도록 설정하세요.
src/components/FavoriteList
import React from 'react';
import styled from 'styled-components';
import FavoriteItem from './FavoriteItem';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
const Wrapper = styled.div`
/* 레이아웃 */
position: relative; /* 자식 컴포넌트의 크기를 이 컴포넌트의 50% 로 설정하기 위함 */
display: flex;
flex-wrap: wrap; /* 공간이 부족하면 다음 줄에 보여줌 */
`;
const FavoriteList = ({contacts}) => {
const favoriteList = contacts
.filter( // 즐겨찾기 필터링
contact => contact.get('favorite')
).map(
contact => (
<FavoriteItem
key={contact.get('id')}
contact={contact}
/>
)
);
return (
<Wrapper>
{favoriteList}
</Wrapper>
);
};
FavoriteList.propTypes = {
contacts: ImmutablePropTypes.listOf(
ImmutablePropTypes.mapContains({
id: PropTypes.string,
name: PropTypes.string,
phone: PropTypes.string,
color: PropTypes.string,
favorite: PropTypes.bool
})
)
};
export default FavoriteList;
propTypes
를 설정 할 때, List
는 ImmutablePropTypes.listOf()
를 사용하고, Map
은 ImmutablePropTypes.mapContains()
를 사용합니다.
FavoriteItem 수정하기
FavoriteItem
컴포넌트도 조금 수정해주어야합니다. propTypes 를 수정하고, 또, contact 를 렌더링 하는 과정에서 contact: { name, phone, color }
문법이 먹히지 않으니 이를 다음과 같이 수정하세요.
src/components/FavoriteItem.js
import React from 'react';
import styled from 'styled-components';
import PropTypes from 'prop-types';
import PersonIcon from 'react-icons/lib/md/person';
import ImmutablePropTypes from 'react-immutable-proptypes';
/* style 컴포넌트 생략 */
const FavoriteItem = ({contact}) => {
const { color, name, phone } = contact.toJS();
return (
<Wrapper>
<Box color={color}>
<ThumbnailContainer>
<PersonIcon/>
</ThumbnailContainer>
<Info>
<Name>{name}</Name>
<Phone>{phone}</Phone>
</Info>
</Box>
</Wrapper>
)
};
FavoriteItem.propTypes = {
contact: ImmutablePropTypes.mapContains({
id: PropTypes.string,
name: PropTypes.string,
phone: PropTypes.string,
color: PropTypes.string,
favorite: PropTypes.bool
})
};
export default FavoriteItem;
일반 Map
인스턴스는 비구조화 할당이 되지 않으니, toJS()
를 한 다음에 비구조화 할당을 하였습니다.
App 에서 불러와서 사용하기
이제 FavoriteListContainer
를 App
컴포넌트에서 불러와서 렌더링하세요.
src/App.js
import Header from './components/Header';
import Container from './components/Container';
import { connect } from 'react-redux'
import ViewSelectorContainer from './containers/ViewSelectorContainer';
import InputContainer from './containers/InputContainer';
import FavoriteListContainer from './containers/FavoriteListContainer';
class App extends Component {
render() {
// 레퍼런스 준비
const { view } = this.props;
return (
<div>
<Header/>
<ViewSelectorContainer/>
{/* view 값에 따라 다른 컨테이너를 보여준다 */}
<Container visible={view==='favorite'}>
<FavoriteListContainer/>
</Container>
<Container visible={view==='list'}>
<InputContainer/>
{/* ContactListContainer */}
</Container>
{/* ContactModalContainer */}
{/* FloatingButtonContainer */}
</div>
);
}
}
export default connect(
(state) => ({
view: state.base.get('view')
})
)(App);