React
2023-04-30 19:18
프로젝트 리스트 상단에 진행 상태 탭을 만든다.
탭 아이템으로는 all, not start, progress, done 이 있다.
default 값으로 all을 두고 사용자가 클릭했을 때 클릭한 상태에 해당하는 프로젝트를 보여준다!
우선, status 객체를 생성해준다.
components/ProjectListHeader.jsx
const status = [
{
text: "all",
order: 1,
},
{
text: "not start",
order: 2,
},
{
text: "progress",
order: 3,
},
{
text: "done",
order: 4,
},
];
javascript스타일을 주기 위한 active state 정의
const [active, setActive] = useState(1);
javascriptStatusItem 렌더링
const handleStatus = (e, i) => {
setActive(i + 1);
dispatch(changeStatus(e.target.innetText));
};
...
<StatusWrapper id="container" active={active}>
{status.map((v, i) => {
return (
<StatusItem key={i} onClick={(e) => handleStatus(e, i)}>
{v.text}
</StatusItem>
);
})}
</StatusWrapper>
javascript코드를 살펴보면 StatusItem을 클릭하면 setActive(i+1)이 실행되고
Wrapper에 active props로 active 값을 넣어준다.
emotion 스타일 컴포넌트에 active props 값을 가져와서 스타일을 준다 !
const StatusWrapper = styled.div`
display: flex;
gap: 1rem;
${({ active }) =>
active
? css`
div:nth-of-type(${active}) {
background-color: var(--primary-color);
color: #fff;
}
`
: css``}
`;
javascript
이제 상태값에 따라 상태에 맞는 데이터를 가져와보자.
slices/ProjectSlice.js
우선, 상태변수를 전역으로 관리하기 위해 slice를 생성했다.
const { createSlice } = require("@reduxjs/toolkit");
const initialProjectSlice = {
displayStatus: 'all'
}
const ProjectSlice = createSlice({
name: 'ProjectSlice',
initialState: initialProjectSlice,
reducers: {
changeStatus: (state, action) => {
const statusValue = action.payload;
return {
displayStatus: statusValue
}
}
}
})
export const { changeStatus } = ProjectSlice.actions;
export default ProjectSlice.reducer;
javascriptcomponents/ProjectListHeader.jsx
슬라이스에서 정의한 displayStatus 값을 가져오고
ispatch 함수를 미리 정의한 handleStatus에 넣어서 값을 변경하자.
import { changeStatus } from "@/slices/ProjectSlice";
const { displayStatus } = useSelector((state) => state.ProjectSlice);
const dispatch = useDispatch();
const handleStatus = (e, i) => {
setActive(i + 1);
dispatch(changeStatus(e.target.innetText));
};
javascript클릭할 때마다 active 값이 변경되어서 활성화된 탭에 스타일을 줄 것이고 displayStatus 값도 변경될 것이다.
이제 프로젝트 리스트 컴포넌트에서 data 를 displayStatus 값으로 필터링하면 된다.