wontae

westargram-react ํ›„๊ธฐ

westagram

๐Ÿ™Œ ์†Œ๊ฐœ

  • React.js๋ฅผ ์ด์šฉํ•œ ์ธ์Šคํƒ€๊ทธ๋žจ ํด๋ก 
  • CRA(create-react-app)๋ฅผ ์‚ฌ์šฉํ•œ ์ดˆ๊ธฐ ์„ธํŒ…
  • Git์„ ์‚ฌ์šฉํ•œ ํŒ€ ํ˜‘์—… ๊ณผ์ •
  • MockData๋ฅผ ์ด์šฉํ•˜์—ฌ UI ๊ตฌํ˜„ ํ›„ componentDidMount()์™€ fetch()๋ฅผ ์ด์šฉํ•ด ๋ฐฑ์—”๋“œ์™€์˜ ํ†ต์‹ 
  • Code refactoring

๐ŸŽ‰ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

  • 2020.08.31 ~ 2020.09.11

๐Ÿ›ธ ์‚ฌ์šฉ ๊ธฐ์ˆ 

React
JavaScript
SASS
Git

๐Ÿš€ ๊ตฌํ˜„ ๊ธฐ๋Šฅ

ย ย ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€

login page
login page
  • ์Šฌ๋ผ์ด๋“œ fade-in / fade out
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ํ™•์ธ
  • withRouterHOC ๋กœ ํŽ˜์ด์ง€ ์ด๋™ ๊ตฌํ˜„ - this.props.history.push('/signup')
  • ์„œ๋ฒ„์™€์˜ ํ†ต์‹  fetch()
  • media query๋ฅผ ์ด์šฉํ•œ ๋ฐ˜์‘ํ˜• ๊ตฌํ˜„
  • MockData์™€ map()์„ ํ™œ์šฉํ•ด sitemap ๊ตฌํ˜„

ย ย ๋ฉ”์ธ ํŽ˜์ด์ง€

main page

main page

  • ๋Œ“๊ธ€ ์ถ”๊ฐ€ / ์‚ญ์ œ / ์ข‹์•„์š” ๊ธฐ๋Šฅ
  • ์œ ์ € ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
  • ์œ ์ € ์•„์ด์ฝ˜ ํด๋ฆญ ์‹œ ์„œ๋ธŒ ๋ฉ”๋‰ด ํ† ๊ธ€
  • Mockdata์™€ map()์„ ํ™œ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ํ™œ์šฉ
  • media query๋ฅผ ์ด์šฉํ•œ ๋ฐ˜์‘ํ˜• ๊ตฌํ˜„

โœ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ

  constructor() {
    super();
    this.state = {
      isChecked: false,
      id: '',
      password: '',
    };
  }

  goToMain = () => {
    const { isChecked, id, password } = this.state;

    isChecked &&
      fetch('http://3.34.133.239:8000/account/signin', {
        method: 'POST',
        body: JSON.stringify({
          email: id,
          password: password,
        }),
      })
        .then((response) => response.json())
        .then((result) => {
          if (result.Authorization) {
            localStorage.setItem('token', result.Authorization);
            this.props.history.push('/main-wontae');
          } else if (result.message === 'UNAUTHORIZED') {
            alert('์ด๋ฉ”์ผ / ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”');
          }
        });
  };

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

    if (e.key === 'Enter') {
      this.goToMain();
    }
  };

  checkValidation = () => {
    const { id, password } = this.state;
    const isChecked = id.includes('@') && password.length >= 5;
    this.setState({
      isChecked,
    });
  };

  render() {
    retrun (
      ...
          <div onKeyUp={this.saveData} className="form">
            <input
              name="id"
              type="text"
              placeholder="์ „ํ™”๋ฒˆํ˜ธ, ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋˜๋Š” ์ด๋ฉ”์ผ"
            />
            <input name="password" type="password" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ" />
            <button
              type="submit"
              className={isChecked ? 'isActive' : null}
              onClick={this.goToMain}
            >
              ๋กœ๊ทธ์ธ
            </button>
          </div>
      ...
    )
  }

  • ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์œผ๋กœ ๊ฐ€๋…์„ฑ ๋†’์ด๊ธฐ
  • fetch() ํ•จ์ˆ˜๋กœ ์„œ๋ฒ„์™€์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ 
  • className์˜ ๋™์ ์ธ ์‚ฌ์šฉ
  • ๋ช…ํ™•ํ•œ ํ•จ์ˆ˜, ๋ณ€์ˆ˜, ํด๋ž˜์Šค ์ด๋ฆ„
  • Input์˜ name๊ณผ ๊ณ„์‚ฐ๋œ ์†์„ฑ๋ช…(computed property names) ์ด์šฉํ•˜๊ธฐ