본문 바로가기
Frontend/Project(개인 기록용)

mongoDB에 저장된 reple 불러오기 및 reple 모달 구현

by Johnny_gon 2023. 6. 7.
728x90
반응형

 

 

client 코드

mongoDB에 저장된 댓글 client에 가져와서 보여주는 작업

 
   const RepleList = (props) => {
 
     const [repleList, setRepleList] = useState([]);
 
     useEffect(() => {
       let body = {
         postId: props.postId,
       };
   
       axios.post("/api/reple/getReple", body).then((res) => {
         if (res.data.success) {
           setRepleList(res.data.repleList);
           // setRepleList([...res.data.repleList]);
         }
       });
     }, []);
   
     return (
       <RepleListDiv>
         {repleList.map((list, i) => {
           return <RepleContent list={list} key={i} />;
         })}
       </RepleListDiv>
     );
   };
 

 

 

 

server 코드

 
   router.post("/getReple", (req, res) => {
     Reple.find({ postId: req.body.postId })
       .populate("author")
       .exec()
       .then((repleInfo) => {
         return res.status(200).json({
           success: true,
           repleList: repleInfo,
         });
       })
       .catch((err) => {
         return res.status(400).json({
           success: false,
         });
       });
   });
 

 

 

 

 

client 코드

댓글(reple) 수정 작업

state 훅을 사용하여 초기값 false로 주고

modalHandler 함수를 만들어서 span태그의 img 클릭시 state가 true로 변하여

모달창을 띄우게 구현

 
  const [modal, setModal] = useState(false);
 
  const modalHandler = () => {
      setModal(true);
    };
 
 
  <div className="modalControl">
  <span onClick={modalHandler}>
    <img
      src={correction}
      alt="에디트 이미지"
      style={{ width: "2vh", opacity: "0.3" }}
    />
  </span>
  {modal && (
    //
    <div className="modalDiv" >
      <p >수정</p>
      <p className="delete" >
        삭제
      </p>
   </div>
  )}
 

 

 

 

이미지 클릭시 수정,삭제 모달창 나타남 확인.

(...)클릭시 모달창 보여주기

 

 

 

모달창 띄우기는 성공했으나 닫는 기능은 useOnClickOutside훅을 사용하여 구현하였습니다.

 

useOnClickOutside에 인자로 ref, handler를 주어서

useEffect를 사용하여 ref, handler 조건이 변경될 때마다 이벤트 실행.

 
  const ref = useRef();
 
  useOnClickOutside(ref, () => setModal(false));
 
 
   const useOnClickOutside = (ref, handler) => {
    useEffect(() => {
      const listener = (event) => {
      // console.log(ref);
        if (!ref.current || ref.current.contains(event.target)) {
          return;
        }
        handler(event);
      };
      document.addEventListener("mousedown", listener);
    //모바일
      document.addEventListener("touchstart", listener);
      return () => {
        document.removeEventListener("mousedown", listener);
      //모바일
        document.removeEventListener("touchstart", listener);
      };
    }, [ref, handler]);
  };
 

 

 

 

modalDiv에 ref추가로 구현

...클릭시 모달 창 띄우고 모달창 이외의 모든 곳을 클릭시 창을 닫습니다.

 
              <div className="modalDiv" ref={ref}>
                <p onClick={editHandler}>수정</p>
                <p className="delete" onClick={deleteHandler}>
                  삭제
                </p>
              </div>
 

 

 

 

useOnClickOutside 참조  https://usehooks-ts.com/react-hook/use-on-click-outside

 

useOnClickOutside() react hook - usehooks-ts

React hook for listening for clicks outside of a specified element (see useRef ). This can be useful for closing a modal, a dropdown menu etc.

usehooks-ts.com

 

 

 

추가로 댓글 등록한 유저만 댓글 모달기능 사용할 수 있게 추가 작업을 합니다.

댓글 등록한 유저의 uid와 현재 접속한 유저의 uid가 같다면 모달img 노출

 
      {props.list.author.uid === user.uid && (
          <div className="modalControl">
            <span onClick={modalHandler}>
              <img
                src={correction}
                alt="에디트 이미지"
                style={{ width: "2vh", opacity: "0.3" }}
              />
            </span>
            {modal && (
              //
              <div className="modalDiv" ref={ref}>
                <p >수정</p>
                <p className="delete">
                  삭제
                </p>
              </div>
            )}
          </div>
        )}
 

 

 

728x90
반응형