Westagram Refactoring! ๐Ÿ”ง

Saemsol Yooยท2021๋…„ 2์›” 4์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
5/6
post-thumbnail

โ˜๏ธ ๋ถ€๋ชจ ํ•จ์ˆ˜์—๊ฒŒ ์ธ์ž์ „๋‹ฌํ•˜๊ธฐ

์ž์‹์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ• ๋•Œ, ์ธ์ž๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค! โœจ

  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ
import React, { Component } from "react";
import "./Comment.scss";

class Comment extends Component {
  render() {
    return (
      <div className="Comment">
        {this.props.commentList.map((comment) => {
          return (
            <li key={comment.id}>
              <div>
                <a href="#">{comment.userName}</a>
                <span>{comment.content}</span>
              </div>
              <div>
                <i
                  // id={comment.id}
                  className="fas fa-trash"
                  onClick={() => this.props.deleteComment(comment.id)}  
                  	   //๐Ÿ”ฅ ์ด๋ ‡๊ฒŒ arrow function์„ ์ด์šฉํ•ด์„œ ๋ณด๋‚ด์ฃผ๋ฉด ๋œ๋‹ค.
                />
                <i
                  className={comment.isLiked ? "hidden" : "far fa-heart unlike"}
                />
                <i
                  className={comment.isLiked ? "fas fa-heart like" : "hidden"}
                />
              </div>
            </li>
          );
        })}
      </div>
    );
  }
}

export default Comment;

๐Ÿ‘๐Ÿป ๊ทธ๋Ÿผ ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ์ด๋ ‡๊ฒŒ ์ „๋‹ฌ๋ฐ›์€ ์ธ์ž๋ฅผ ์ด์šฉํ•ด ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ
  deleteComment = (id) => {
    const remainComment = this.state.commentList.filter((comment) => {
      return comment.id !== Number(id);
    });
    this.setState({
      commentList: remainComment,
    });
  };

๐Ÿค” ์ฒ˜์Œ์— ๋‚˜๋Š” this.props.deleteComment(comment.id)
โ†’ ์ด๋ ‡๊ฒŒ ๋ฐ”๋กœ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ž๊พธ ์ „๋‹ฌ์ด ์‹คํŒจํ•ด์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์— ๊ตณ์ด id๊ฐ’์„ ์ฃผ์–ด์„œ e.target.id ๋ฅผ ์ด์šฉํ•ด filterํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ–ˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ์•ˆํ•ด์ค˜๋„ ๋œ๋‹ค!!!! ๐Ÿ™…๐Ÿปโ€โ™€๏ธ๐Ÿ™…๐Ÿปโ€โ™€๏ธ๐Ÿ™…๐Ÿปโ€โ™€๏ธ




โ˜๏ธ isLike ์ƒํƒœ์—๋”ฐ๋ผ ๋‹ค๋ฅธ ์•„์ด์ฝ˜ ๋ณด์—ฌ์ฃผ๊ธฐ

์ข‹์•„์š” ๋ฒ„ํŠผ์ฒ˜๋Ÿผ state ๋กœ๋ถ€ํ„ฐ boolean ๊ฐ’์„ ๋ฐ›์•„์™€ ๋นˆ ํ•˜ํŠธ or ์ฑ„์›Œ์ง„ ํ•˜ํŠธ ๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•  ๋•Œ! ๊ฐ๊ฐ์˜ <i /> ํƒœ๊ทธ์— display: none; ์„ ํ•ด์ฃผ๋Š” className ์„ ์ถ”๊ฐ€ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ! ์•„์˜ˆ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋“ค ํ†ตํ•ด ์กฐ๊ฑด์— ๋งž๋Š” ํƒœ๊ทธ ์ž์ฒด๋ฅผ ํ™”๋ฉด์— ๋„์›Œ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉด ์กฐ๊ธˆ ๋” ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง„๋‹ค! โœจ

  • ์ด์ „์— ์ž‘์„ฑํ•ด์คฌ๋˜ ์ฝ”๋“œ
<i className={comment.isLiked ? "hidden" : "far fa-heart unlike"} />
<i className={comment.isLiked ? "fas fa-heart like" : "hidden"} /> 
  • ์ˆ˜์ •ํ•œ ์ฝ”๋“œ
comment.isLiked 
  ? (<i className="fas fa-heart like" />) 
  : (<i className="far fa-heart unlike" />)
  • ํ•ด๋‹น ๋ถ€๋ถ„ ์ „์ฒด ์ฝ”๋“œ
<div className="Comment">
        {this.props.commentList.map((comment) => {
          return (
            <li key={comment.id}>
              <div>
                <a href="#">{comment.userName}</a>
                <span>{comment.content}</span>
              </div>
              <div>
                <i
                  className="fas fa-trash"
                  onClick={() => this.props.deleteComment(comment.id)} />
                {comment.isLiked 
                  ? (<i className="fas fa-heart like" />) 
                  : (<i className="far fa-heart unlike" /> )}
              </div>
            </li>
          );
        })}
      </div>



โ˜๏ธ localhost:3000 ์ƒ๋žต!

์ž๊ธฐ ์ž์‹ ์˜ public์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์ด๋ผ๋ฉด http://localhost:3000/ โ† ์ด ๋ถ€๋ถ„์„ ์ƒ๋žตํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

  componentDidMount() {
    fetch("http://localhost:3000/data_saemsolyoo/commentData.json")
      .then((res) => res.json())
      .then((data) => {
        console.log();
        this.setState({
          commentList: data,
        });
      });
  }

โ†’ fetch("/data_saemsolyoo/commentData.json") โœจ




โ˜๏ธ ๋กœ์ง์„ ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์œผ๋กœ!

์‚ผํ•ญ ์—ฐ์‚ฐ์ž์˜ ์œ„์น˜๋ฅผ ์กฐ๊ธˆ ๋ฐ”๊ฟ” ์ค€๋‹ค๋ฉด if๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , setState๋„ ํ•˜๋‚˜๋งŒ ์“ฐ๋ฉด์„œ! ๊ฐ™์€ ๋กœ์ง์„ ์ž‘์„ฑํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค! ๐Ÿ™‚


  • ์ด์ „์— ์ž‘์„ฑํ•ด์คฌ๋˜ ์ฝ”๋“œ
  activeSubmitBtn = (e) => {
    if (e.target.value.length > 0) {
      this.setState({ disabled: false });
    } else {
      this.setState({ disabled: true });
    }
  };
  • ์ˆ˜์ •ํ•œ ์ฝ”๋“œ
activeSubmitBtn = (e) => {
    this.setState({ disabled: e.target.value.length > 0 ? false : true });
  };



โ˜๏ธ ํ•จ์ˆ˜์ค„์ด๊ธฐ

๐Ÿค” ๋ญ”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š”๊ฒƒ ๊ฐ™๋‹ค๋ฉด..? ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค!!

  • ์ด์ „์— ์ž‘์„ฑํ•ด์คฌ๋˜ ์ฝ”๋“œ
  handleIdInput = (e) => {
    const userId = e.target.value;
    this.setState({
      id: userId,
    });
  };

  handlePwInput = (e) => {
    const userPw = e.target.value;

    this.setState({
      pw: userPw,
    });
  };

โ†’ ์ด๋ ‡๊ฒŒ ID. PW๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜๋“ค์ด ๊ฐ๊ฐ ์žˆ์—ˆ๋‹ค,,,

  • ์ˆ˜์ •ํ•œ ์ฝ”๋“œ

์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฐ๊ฐ์˜ input์— name attribute๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  ๊ทธ name์€ state์˜ key๊ฐ’๊ณผ ๋˜‘๊ฐ™์ด ํ•ด์ค€๋‹ค! ๊ทธ๋Ÿผ ํ•ด๋‹น key๊ฐ’(name)์— ๋”ฐ๋ผ setState๊ฐ€ ๋˜์–ด ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋กœ ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ‘๐Ÿป

  handleInput = (e) => {
    const { value, name } = e.target;
    this.setState({
      [name]: value,
    });
  };



โ˜๏ธ image import

์ด๋ฏธ์ง€๋ฅผ import ํ•ด์ค„ ๋•Œ ๋„ˆ๋ฌด ๋งŽ์€ import๋กœ ํŒŒ์ผ ์ƒ๋‹จ์ด ์ง€์ €๋ถ„ํ•ด ๋ณด์ธ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ‘  images.js ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋‹ค import ํ•ด์ค€๋‹ค.
โ‘ก ๊ทธ๋ฆฌ๊ณ  import ํ•ด์ค€ ๊ฒƒ๋“ค์„ ๊ฐ๊ฐ export ํ•ด์ค€๋‹ค.
โ‘ข ์ด๋ฏธ์ง€๊ฐ€ ํ•„์š”ํ•œ ํŒŒ์ผ์—์„œ import ํ•ด ์‚ฌ์šฉํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค ๐Ÿ™‚

// images.js
import menu from '../../../../../images/saemsolyoo/Main/menu.svg';
import heart from '../../../../../images/saemsolyoo/Main/heart.svg';
import send from '../../../../../images/saranglee/Main/send.svg';
import bookmark from '../../../../../images/saemsolyoo/Main/bookmark.svg';
import comment from '../../../../../images/saemsolyoo/Main/comment.svg';

export const images = { menu, heart, send, bookmark, comment }
// Feed.js
import { menu, heart, send, bookmark, comment } from "./images"
profile
Becoming a front-end developer ๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€