[React]수정하기

지냐킴·2022년 8월 9일
0

React

목록 보기
12/20
post-thumbnail

DetailPageModal.jsx

import React, { useState } from "react";
import { Modal } from "react-bootstrap";
import { useDispatch } from "react-redux";
import { FaTimes } from "react-icons/fa";
import { editBody } from "../../redux/modules/movieSlice";
import "./DetailPageModal.scss";

const DetailPageModal = ({ show, onHide, setShow, id }) => {
  									//19. props로 받기
  const dispatch = useDispatch();
  const initialState = {
   //4. 초기값 만들어주기 
    id: 0,
    body: "",
  };

  let [edit_Body, setEditBody] = useState(initialState);
  //4. let[editBody, setEditBody] = useState(초기값);
  //7. consol.log(edit_Body) 하면
  // 콘솔에 {id:0, body: 인풋창에 타자친것들이 뜸}
  // 우린 edit_Body에서 body만 필요하니까 

  let inputeditBody = (e) => {
  //6. onChange 했을때 나올 inputeditBody 함수 만들어주기
    const { name, value } = e.target;
    setEditBody({ ...edit_Body, [name]: value, id: id });
  }; 

  let onSubmitHandler = (event) => {
    //11.onSubmitHandler 함수 만들어주기 
    if (edit_Body.body === "") {
      event.preventDefault();
      alert("내용을 모두 채워주세요!!");
      //12.유효성검사 -> edit_Body가 빈칸일때 alert 뜸
    } else {
      event.preventDefault();
      dispatch(editBody(edit_Body));
      //13. edit_Body(action.payload값)의 데이터를 editBody라는 dispatch함수로 보내주라  
      console.log(edit_Body);
      setEditBody(initialState);
      // 14.작성후 인풋창 초기화(빈칸)만들어주기 (여긴 모달창 꺼져서 사실 필요없음 근데 수정후 다시 모달창 띄우면 그전에 작성한거 남아있음 ) 
      alert("정상적으로 등록 되었습니다.");
      setShow(false);
      //15. detail 페이지에서 함수 만들어주기 
      // 16.등록되면 자동으로 창 꺼주기
    }
  };

  return (
    <Modal
      show={show}
      onHide={onHide}
      size="lg"
      aria-labelledby="contained-modal-title-vcenter"
      centered
    >
      <div className="modalBox">
        <FaTimes className="faArrowLeft" onClick={onHide} />
        <div className="editWrap">
          <input
            className="editBody"
	//1.인풋창에 넣었을때 값을 가져와야한다 
            name="body"
	// 2. 네임은 바디
            value={edit_Body.body}
	//3. value="" 
	//빈칸으로 적어주고 안에 내용은 나중에 생각해보자
	//8. value={edit_Body.body}  넣어줌 
	//9. 이제 edit_Body에 들어가는 값을 알아냄 그리고 이제 수정완료 버튼을 눌렀을때 dispatch로 들어가야함  
	
            type="text"
            placeholder="내용을 입력해주세요"
            onChange={inputeditBody}
	// 5. onChange={inputeditBody}
	//인풋창에 뭔가 썻을때가 onChange가 되는거다=> onChange는 inputeditBody가 됨
          ></input>
          <button onClick={onSubmitHandler} 
	//10. onClick 이벤트 시 onSubmitHandler 함수가 발생한다
className="edit_done_btn">
            수정완료
          </button>
        </div>
      </div>
    </Modal>
  );
};

export default DetailPageModal;

Detail .jsx

import React, { useEffect, useState } from "react";
import { useNavigate, useParams } from "react-router-dom";
import { useDispatch, useSelector } from "react-redux";
import "./detail.scss";
import DetailPageModal from "../../components/detailPageModal/DetailPageModal";
import { deleteMovie, editBody, getBody } from "../../redux/modules/movieSlice";
import shortid from "shortid";

const Detail = () => {
  const navigate = useNavigate();
  const dispatch = useDispatch();
  const { id } = useParams();

  const [modalOn, setModalOn] = useState(false);

  let movies = useSelector((state) => state.movies);
  const movie = movies.find((movie) => movie.id == id);

  return (
    <div>
      <div className="detailWrap">
        <div className="detailBox">
          <div className="imgBox">
            <img src={movie.img} />
          </div>
          <div className="contentBox">
            <h2>{movie.title}</h2>
            <h5>{movie.userid}</h5>

            <p>{movie.body}</p>

            <div className="btn_set">
              <button className="btn_edit" onClick={() => setModalOn(true)}>
                수정하기
              </button>
              <button
                className="btn_dele"
                onClick={() => {
                  dispatch(deleteMovie(movie.id));
                  navigate("/");
                }}
              >
                삭제하기
              </button>
            </div>
          </div>
        </div>
      </div>
      <DetailPageModal show={modalOn} id={id} setShow={setModalOn} onHide={() => setModalOn(false)}>
        //17.setShow={setModalOn}
        //18. modal.jsx에서 setShow를 props로 내려주기
        // 여기는 부모 컴포넌트로 자식컴포넌트(detailModal.jsx)로 내려주기 위해 show={modalOn} setShow={setModalOn} 으로 정의를 내려줘야함
        // 자식 컴포넌트에한테 show를 보내줄껀데 show는 부모컴포넌트에서 정의해준 ModalOn 이다 
        // 바로 똑같은 이름으로 못내려주고 정의를 해야함 
        {" "}
      </DetailPageModal>
    </div>
  );
};

export default Detail;

slice 부분

editBody: (state, action) => {
      state = state.map((data) => {
        if (data.id == action.payload.id) {
          //id를 하나는 숫자 하나느 스트링으로 받기때문에 === 이 아닌 ==으로 해준다
          // state map을 해줬을때
       	//date(배열)의 id가 action.payload.id 값이 똑같으면 
          data.body = action.payload.body;
       //action.payload(edit_Body)의 body값을 date의 body로 바꿔준다
        }
        return data;
      });
profile
코린이일기

0개의 댓글