본문 바로가기

React 수업 정리

게시판 구현해보기(3)

이제 목록, 생성, 상세페이지를 전부 만들었으니 

상세페이지 안에서 수정페이지만 만들면 끝이난다. 만들어보도록하자.

 

 const {id} = useParams();
 const [ modify, setModify ] = useState(null);
 const [ form, setForm ] = useState({
        title : '',
        writer : '',
        contents : ''
    });

 

데이터의 id를 이용해서 원하는 데이터의 페이지를 수정하기위해 id 정의 해준다음

받을 데이터의 상태와 구성을 정의해준다.

 

  const getModifyData = async () => {
        try{
            const board = await axios.get(`/detail/${id}`);
            setModify(board.data[0]);
            setForm({
                title : board.data[0].title,
                contents : board.data[0].contents,
                writer : board.data[0].writer
            })
        }catch(err){
            console.log(err);
        }
    }

 

데이터를 받을때 setForm에 구성에서 title, contents, wirter를 빈값에서 내가 원래 입력했던 데이터를 받아준다.

데이터는 상세페이지에서 가져오기때문에 미리 만들었던 server.js 는  detail에서 get 미리 만들어놨던걸 이용.

 

useEffect(()=>{
        getModifyData();
    }, []);

 

 

랜더링 될 때마다 데이터를 받아주도록 구현을 끝내준다.

 

 

 const onChange = (e) => {
        const { name, value } = e.target;
        setForm({
            ...form,
            [name]: value,
        });
    };

 

수정 할 때 값이 변화해야하므로 onChange를 만들어 준다.

 

const onModify = async () => {

        if(form.title === ''){
            alert('제목을 입력해주세요.');
            return;
        }
        if(form.writer === ''){
            alert('작성자를 입력해주세요.');
            return;
        }
        if(form.contents === ''){
            alert('내용을 입력해주세요.');
            return;
        }
        if(window.confirm('수정하시겠습니까?')){
            try{
               await axios.post(`/modify/${id}`, form);           
                window.location.href = `/detail/${id}`;
            }catch(error){
                console.log(error);
            }
        }
    }

 

app.post('/modify/:id', (req, res) => {

    const { title, writer, contents } = req.body;

    const id = req.params.id;

    const sql = `update free_board set title = ? , writer =? , contents = ? where id = ${id}`;

    db.query(sql, [title, writer, contents], (err, data) => {
        if(!err){
            res.sendStatus(200); 
        } else {
            console.log(err);
            res.send('전송오류');
        }
    })
})

 

내용을 바꾼 form 데이터를 받아서 수정 할 수 있도록 구현해주도록 한다.

수정 후 다시 목록말고 상세페이지로 가도록 설정.

   if(modify !== null){
        return (
            <div className='modify'>
                <h2>자유게시판 글쓰기</h2>
                <hr />
                <div className='inputBox'>
                    <div>
                        <input className='titleInput' type="text" name='title' placeholder='제목을 입력해주세요' onChange={onChange} value={form.title}/>
                        <input className='nameInput' type="text" name='writer' placeholder='작성자' onChange={onChange} value={form.writer}/>
                    </div>
                </div>

                <textarea type="text" name='contents' placeholder='내용을 입력해주세요' onChange={onChange} value={form.contents}/>

                <br />

                <button onClick={onModify}>수정</button>
            </div>
        );
    };
};

 

이제 만들어둔 기능이 작동하도록 화면을 구현해주면 수정페이지도 구현이 끝이난다.

 

전부 만들고나니 게시글마다  총 댓글수도 리스트 제목옆에 나왔으면 좋겠다고 생각해서 만들어보았다.

 

  const sql = `
        SELECT fb.*, COUNT(c.co_id) AS commentCount 
        FROM free_board fb 
        LEFT JOIN comments c ON fb.id = c.board_id 
        GROUP BY fb.id 
        ORDER BY fb.id DESC
    `;

 

list 목록을 구현하는 app.get에  sql 구문을 이렇게 수정해줘서 보드와 댓글을 조인으로 연결해 댓글 id 개수를 카운팅 하도록 만들어주었다

 

    {b.commentCount > 0 && <span className="comment-count">({b.commentCount})</span>}

 

그리고 화면에다가 댓글이 0개를 넘어서면 숫자가 나오도록 표시해주면 끝.

 


 

완성

 

검색 , 페이지 ,  정렬 , 글 추가 / 삭제 / 수정 , 댓글 추가 / 삭제 전부 기능하는 것을 확인 할 수 있음.

 

 

'React 수업 정리' 카테고리의 다른 글

게시판 구현해보기(2)  (0) 2024.09.24
게시판 구현해보기(1)  (0) 2024.09.24
Board 만들어보기  (0) 2024.09.19
React 5일차  (0) 2024.09.10
React 4일차.  (3) 2024.09.09