D.evelop/React

[React]fetch함수와 api를 이용한 통신 실습

Danne 2021. 11. 1. 12:54

그 동안 진행한 공부내용을 뒤적거리다 foundation 4주차에 현우님이랑 실습한 통신 코드를 발견했다.

처음으로 백엔드와 통신을 해본 날이었는데, 동휘님, 치훈님과 실습을 마치고 돌아왔던 저녁.

 

현우님이 front와 더 해보고 싶은 작업이 있다고 하셔서.

그리고 그게 더 재밌을 거라고 어필하셔서🤣

내 작업을 제쳐두고 했던 작업.(그래도 밤새 완성은 했던🥲)

 

다음 날,

현우님과의 api 통신 작업 부분을 원복하지 못하고 PR을 올렸었는데, 오히려 멘토님이 해당 코드에 대한 코드리뷰를 해주셔서 더 많이 배울 수 있었다. 이 날은 내가 통신해서 결과를 봐야한다고 한다고 현우님을 찾아가 졸라아했다.

 

이 작업으로 인해, 1, 2차 프로젝트 시 백엔드에서 작업해준 api를 붙일 때 정말 도움이 많이 됐었다.

 

 

[처음 코드]

addComment = () => {
  let token = localStorage.getItem('우리토큰') || '';
  fetch('http://10.58.7.150:8000/posts/comment', {
  headers: {
  	Authorization: token,
  },
  method: 'POST',
  body: JSON.stringify({
    comment_post: this.state.comment,
    post_id: '1',
  }),
})
  .then(res => res.json())
  .then(result => {
      console.log('결과:', result);
  });

const { commentList, comment } = this.state;
  if (this.commentValid() === true) {
    this.setState({
      commentList: commentList.concat({
      content: comment,
 	  userName: 'Dan_d',
    }),
   	  comment: '',
    });
  }
};

 

 

 

[수정한 코드]

comment 등록 시, 유효성을 검사하는 함수가 실행된다.

이 함수를 만족(true)할 경우 token을 확인하고, 이 토큰을 header에 실어 POST요청을 한다.

만약 token이 있으면 comment를 추가할 수 있다.

token이 undefine이면 commnet는 추가 되지 않는다.

addComment = () => {
    if (this.commentValid()) {
      let token = localStorage.getItem('우리토큰') || '';
      fetch('http://10.58.3.17:8000/posts/comment', {
        method: 'POST',
        headers: {
          Authorization: token,
        },
        body: JSON.stringify({
          comment_post: this.state.comment,
          post_id: '1',
        }),
      })
        .then(res => res.json())
        .then(result => {
          if (token) {
            const { commentList, comment } = this.state;
            this.setState({
              commentList: commentList.concat({
                content: comment,
                userName: 'Dan_d',
              }),
              comment: '',
            });
          }
        });
    }
  };

 

 

 

 


src/pages/dan/Main/Feed/Comment/CommentList.js

import React from 'react';
import Comment from './Comment';
import './CommentList.scss';

class CommentList extends React.Component {
  constructor() {
    super();
    this.state = {
      commentList: [],
      comment: '',
    };
  }

  componentDidMount() {
    fetch('./data/commentData.json', {
      method: 'GET',
    })
      .then(res => res.json())
      .then(data => {
        this.setState({
          commentList: data,
        });
      });
  }

  textChange = event => {
    this.setState({
      comment: event.target.value,
    });
  };

  commentValid() {
    const { comment } = this.state;
    return comment.length > 0;
  }

  addComment = () => {
    if (this.commentValid()) {
      let token = localStorage.getItem('우리토큰') || '';
      fetch('http://10.58.3.17:8000/posts/comment', {
        method: 'POST',
        headers: {
          Authorization: token,
        },
        body: JSON.stringify({
          comment_post: this.state.comment,
          post_id: '1',
        }),
      })
        .then(res => res.json())
        .then(result => {
          if (token) {
            const { commentList, comment } = this.state;
            this.setState({
              commentList: commentList.concat({
                content: comment,
                userName: 'Dan_d',
              }),
              comment: '',
            });
          }
        });
    }
  };

  handleButton = event => {
    event.preventDefault();
    this.addComment();
  };

  handleKeyPress = event => {
    if (event.key === 'Enter' && !event.shiftKey) {
      this.addComment();
    }
  };

  render() {
    const { commentList, comment } = this.state;
    return (
      <div className="area_comment">
        <div className="comments">
          <div className="list_comment" onChange={this.addComment}>
            {commentList.map(comment => {
              return (
                <Comment
                  key={comment.id}
                  userName={comment.userName}
                  comment={comment}
                  content={comment.commentText}
                />
              );
            })}
          </div>
          <form className="post_comment">
            <textarea
              type="input"
              placeholder="댓글 달기..."
              value={comment}
              onKeyPress={this.handleKeyPress}
              onChange={this.textChange}
            />
            <button type="submit" onClick={this.handleButton}>
              게시
            </button>
          </form>
        </div>
      </div>
    );
  }
}

export default CommentList;

 

 

 

 

반응형