오늘 공부한 내용
- 항해 99 심화주차
- 글쓰기 페이지 기능 구현
오늘은 팀원 조분들이 페이지 구현에 막히고 계신것 같아서 만들어보지는 않았지만, 그 페이지를 처음부터 만들면서 어떻게 들어가는지, 어디로 들어가서 값을 어떻게 받아오는지, 그것을 또 다시 활용하는 방법까지 말씀드리는 시간을 가졌다.
갑작스럽게 말씀 드리게 된거라 아무생각 없이 만들어 보았는데, 다행히도 코드를 짜는게 재밌어서 그런지 구현도 잘 되어서 어려움없이 말씀드릴 수 있었다 .
우선은 메인페이지에서 카테고리 리스트별로 보여지는 카드리스트들이 다르다. 그렇기에 글쓰기 페이지에서 카테고리별로 데이터를 저장하는 방법이 필요하다.
정말 간략하게 표현하자면 다음과 같다.
1. 페이지가 렌더링 될 때 서버에서 카테고리 관련 리스트들을 불러온다.
1-1. useDispatch를 사용하여 Axios.get으로 서버에 있는 데이터들을 리듀서에 저장한다.
1-2. useSelector를 사용하여 리듀서에 있는 데이터들을 컴포넌트(뷰)로 가져온다.
2. 그리고 select box를 만들때 가져온 데이터 리스트들을 넣어준다.
2-1. useSelector로 가져온 객체들 중 name만 따로 배열로 반환하여 변수에 담는다.
2-2. 배열이 담긴 변수를 map함수를 사용하여 select box 안에 있는 option에 props를 전달한다.
3. select box를 선택할 때 useState에 값을 저장하고 제목, 내용을 입력후 추가하기를 누르면 dispatch함수와 redux-thunk를 사용하여 Axios.post를 하고 서버에 저장한다.
const [title, setTitle] = useState("");
const [content, setContent] = useState("");
// eslint-disable-next-line no-unused-vars
const [select, setSelect] = useState("");
// eslint-disable-next-line no-unused-vars
const dispatch = useDispatch();
useEffect(() => {
dispatch(getComm());
}, []);
// dispatch로 Axios.get 요청 > 서버에서 모든 데이터를 가지고 와서 스토어에 저장을한다.
// useSelector로 저장된 comm에 데이터들을 가지고 컴포넌트(뷰)로 온다 > state.post.comm
// 데이터들이 담긴 변수(globalValue)들은 배열이다. console.log로 확인해보면 알 수 있음.
// 변수를 map함수 (map함수는 배열함수) 를 사용하여 객체의 name만 뽑아서 변수에 따로 저장한다. 변수: name
// console.log(name)으로 뽑아낸 변수들을 확인한다.
const globalValue = useSelector((state) => state.post.comm);
const id = globalValue.map((data) => {
return data.id;
});
const name = globalValue.map((data) => {
return data.name;
});
console.log(id);
console.log(title, content);
const onsubmitHandler = () => {
console.log(select);
dispatch(
__addNewPost({
title,
content,
category: select,
img: "https://image.bugsm.co.kr/album/images/500/202860/20286013.jpg",
})
);
};
+ 추가
상세페이지를 추가로 만들었다.
원래 어제가 과제 제출일이었는데.. 팀원분들이 페이지를 못 만드는 사태에 이르러 결국 새벽4시까지 혼자 팀프로젝트를 하고 업로드 해본다.
상세페이지에서 페이지 자체를 수정 및 삭제를 했어야했고 댓글 또한 수정 및 삭제를 했어야했지만 시간상 어쩔 수 없이 상세페이지 댓글 쓰는 기능까지만 만들어야 했다.
원래대로라면 서버에 아이디,비밀번호를 저장해서 삭제 수정시 확인하고 삭제하는 것까지 만들어 보고 싶었는데, 그러지 못해서 너무 아쉽다..
export default function Detail() {
/*
1. 렌더링
1-1. url에서 아이디 값을 가져온 후 서버에서 전체리스트 정보를 들고 온다.
1-2. url과 전체리스트를 find함수를 사용하여 같은 객체를 반환한다.
2. 반환한 내용을 뷰에 뿌려준다.
2-1. map함수를 사용하여 html 작성
*/
const dispatch = useDispatch();
const globalValue = useSelector((state) => state.post.lists);
const repleValue = useSelector((state) => state.post.reple);
const params = useParams();
const id = useRef();
const password = useRef();
const [render, setRender] = useState("");
console.log(repleValue);
const obj = globalValue.find((data) => {
if (Number(params.id) === data.id) {
return data;
}
return "";
});
console.log(obj);
const reple = useRef();
useEffect(() => {
dispatch(getLists());
dispatch(getReple());
}, [render]);
// eslint-disable-next-line consistent-return
const addRepleHandler = () => {
if (password.current.value.length < 4)
return alert("비밀번호는 4자리 이상 입력해주세요.");
dispatch(
setReple({
content: reple.current.value,
id: id.current.value,
password: password.current.value,
page: Number(params.id),
})
);
reple.current.value = "";
id.current.value = "";
password.current.value = "";
setRender(!render);
};
return (
<StWrapper>
<div className="detail_page_inner">
<StPageTitle>{obj.title}</StPageTitle>
<div className="detail_content_wrapper">
<div className="flex-column gap-50-0">
<div className="detail_content_container">
<div className="detail_content">{obj.content}</div>
</div>
<div className="reple_field_wrapper">
<div className="textarea_container">
<div className="user_info">
<input type="text" placeholder="닉네임" ref={id} />
<input
type="password"
placeholder="비밀번호"
ref={password}
/>
</div>
<StTextArea name="" id="" cols="30" rows="10" ref={reple} />
<div className="write_btn_container">
<StRepleButton type="button" onClick={addRepleHandler}>
Write
</StRepleButton>
</div>
</div>
<StRepleWrapper>
{repleValue &&
// eslint-disable-next-line consistent-return
repleValue.map((data) => {
console.log(data.page, Number(params.id));
if (Number(params.id) === data.page) {
return (
<StRepleContainer key={data.id}>
<span>{data.id}</span>
<span>{data.content}</span>
</StRepleContainer>
);
}
})}
</StRepleWrapper>
</div>
</div>
</div>
</div>
</StWrapper>
느낀점
시간이 부족해서 수정/삭제 기능은 만들지 못해서 너무나도 아쉬웠다. 팀프로젝트를 매번 혼자하는 느낌이다. 왜 나만 과제를 하는건지..
내일은 또 새로운 분들을 만나 팀프로젝트를 새로 시작한다. 벌써부터 무섭다.. 왜.. 나만 해 과제..
내일 할 일
- 새로운 팀프로젝트
'TIL & WIL' 카테고리의 다른 글
221218_WIL (0) | 2022.12.18 |
---|---|
221216_TIL (0) | 2022.12.17 |
221214_TIL (0) | 2022.12.15 |
221213_TIL (0) | 2022.12.14 |
221212_TIL (0) | 2022.12.13 |