(실제 고민시간은 몇시간 안되지만 시도 ~ 완성 기간)
목표 : 스파이 투표창(모달)이 죽은 사람에게 노출되지 않도록 기능 구현하기
React-src
//Modal.js
const user_list = useSelector((state) => state.vote.userList);
const deadPerson = user_list.filter((user) => user.isEliminated === 'Y');
console.log(deadPerson, '죽은 사람들 리스트');
=> 필터링한 값은 배열로 [{a, b, c}] 생겨서 필터링을 하고 조건문을 붙여도 적용되지 않은점 발견
너무 멍청했다
//Ingame.js
const user_list = useSelector((state) => state.vote.userList);
const isFired = user_list.filter((user) => user.isEliminated === 'Y');
console.log(isFired, '죽은 사람들 리스트');
//빈배열
const isFireds = [];
//해고 명단 반복문 돌려서 ID값 isFireds에 넣기
isFired.forEach((id) => {
isFireds.push(Object.values(id));
});
//해고 명단 ID 리스트에 본인 ID가 있다면 true반환
const _isFired = isFireds[0].includes(parseInt(userId));
=> 방법도 이해됐고 성공할거라 확신했으나 리액트에서 타입에러 발생
원인은 랜더링 됐을 때는 죽은 유저가 없기때문에 undefined 값이 들어가 그 값으로 비교문을 하게 되니 읽을 수 없다는 메시지 오류 반환
만약 새로 만들 배열의 길이가 0 이면 '아무 내용'을 추가
=> 이렇게 만들어진 변수로 각 모달에 넣어주니 성공 하게 됐다.
//Ingame.js
// 처음 시작할 때 isFireds는 빈배열이기에 오류가 나서 밑에 코드 작성
// 빈배열일때 undefined ID넣기
if (isFireds.length === 0) isFireds.push('undefined Id');
//Ingame.js
const isFired = roomUserList.filter((user) => user.isEliminated === 'Y'); // 해고당한 명단
//리펙토링 부분
const isFireds = isFired.map((user) => {
return user.userId;
});
console.log(isFireds); // 리스트 중 userId만 반환 [1, 2...]
const _isFired = isFireds.includes(parseInt(userId));
console.log(_isFired, '불린형');
나에게 나름 고전한 문제였던 기능이었다.
이번에도 나혼자 생각 할때는 어렵게 생각했는데 다른이들이 도움을 주고 들어보니 이렇게 간단하게 해결할 수 있는 문제를 혼자 끙끙 앓는데 시간을 너무 많이 썼다.
도움을 주신분들에게 감사.