Skip to main content

Command Palette

Search for a command to run...

[Instagram Clone]React_Login Page

Published

JSX code for Login Form

Rules

  1. 'class' attributes ➡️ 'className'
  2. End self-closing tags
  3. Edit image paths
const Login = () => {
(...)
  return (
    <>
      <div className="login-container">
        <h1>Westagram</h1>
        <form>
          <input
            type="text"
            placeholder="Phone number, username or email address"
            className="login-input"
            id="id"
          />
          <input
            type="password"
            placeholder="Password"
            className="login-input"
            id="pw"
          />
          <button type="submit"> Log In </button>
        </form>
        <div className="divider">OR</div>
        <div className="fb-wrapper">
          <div className="fb">
            <a href="https://facebook.com">
              <img src="/images/sooyeonJang/facebook.png" alt="facebook-logo" />
              Log in with Facebook
            </a>
          </div>
        </div>
        <div className="forgot-wrapper">
          <div className="forgot">
            <a href="https://www.instagram.com/accounts/password/reset/">
              Forgotten your password?
            </a>
          </div>
        </div>
      </div>
      <div className="sign-up">
        <p>
          Don't have an account?{' '}
          <a href="https://www.instagram.com/accounts/emailsignup/">Sign up</a>
        </p>
      </div>
    </>
  );
};


Save User Inputs

import React, { useState } from 'react'; 
//import useState Hook from React to add states to function components.

const Login = () => {
(...)
  const [id, setId] = useState('');
  const [pw, setPw] = useState('');
(...)
};


Add Functions to Handle Form Submit

const Login = () => {
(...)
  function handleIdInput(e) {
    setId(e.target.value);
  }

  function handlePwInput(e) {
    setPw(e.target.value);
  }

  return (
    <>
(...)
        <form>
          <input
            onChange={handleIdInput}
            type="text"
            placeholder="Phone number, username or email address"
            className="login-input"
            id="id"
          />
          <input
            onChange={handlePwInput}
            type="password"
            placeholder="Password"
            className="login-input"
            id="pw"
          />
(...)
 );
};


ID&Password Validation

const Login = () => {
(...)
  const isValidEmail = id.includes('@') && id.includes('.');
  const isValidPassword = pw.length >= 5;

  const isValidLogin = isValidEmail && isValidPassword;
(...)

  return (
    <>
(...)
        <form>
          <input
            onChange={handleIdInput}
            type="text"
            placeholder="Phone number, username or email address"
            className="login-input"
            id="id"
          />
          <input
            onChange={handlePwInput}
            type="password"
            placeholder="Password"
            className="login-input"
            id="pw"
          />
          <button
            className={
              isValidLogin ? 'login-btn-activated' : 'login-btn-deactivated'
            } 
            type="submit"
          >
            Log In
          </button>
        </form>
(...)
  );
};

☝️SCSS

.login-btn-deactivated {
  display: block;
  box-sizing: border-box;
  background-color: rgba(56, 151, 240, 0.3);
  border-style: none;
  border-radius: 5px;
  width: 320px;
  padding: 8px;
  margin: 0 auto;
  color: $white;
}

.login-btn-activated {
  display: block;
  box-sizing: border-box;
  background-color: rgba(56, 151, 240);
  border-style: none;
  border-radius: 5px;
  width: 320px;
  padding: 8px;
  margin: 0 auto;
  color: $white;
}


Navigate to the Main page

(...)
import { useNavigate } from 'react-router-dom';

const Login = () => {
  const navigate = useNavigate();

  const goToMain = () => {
    navigate('/main-sy');
  };
(...)
  return (
(...)
          <button
            className={
              isValidLogin ? 'login-btn-activated' : 'login-btn-deactivated'
            }
            type="submit"
            onClick={goToMain}
          >
            Log In
          </button>
        </form>
(...)
  );
};




Full Code🔻

import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import './Login.scss'; //link css
import { useNavigate } from 'react-router-dom';

const Login = () => {
  const navigate = useNavigate();

  const goToMain = () => {
    navigate('/main-sy');
  };

  const [id, setId] = useState('');
  const [pw, setPw] = useState('');

  const isValidEmail = id.includes('@') && id.includes('.');
  const isValidPassword = pw.length >= 5;

  const isValidLogin = isValidEmail && isValidPassword;

  function handleIdInput(e) {
    setId(e.target.value);
  }

  function handlePwInput(e) {
    setPw(e.target.value);
  }

  return (
    <>
      <div className="login-container">
        <h1>Westagram</h1>
        <form>
          <input
            onChange={handleIdInput}
            type="text"
            placeholder="Phone number, username or email address"
            className="login-input"
            id="id"
          />
          <input
            onChange={handlePwInput}
            type="password"
            placeholder="Password"
            className="login-input"
            id="pw"
            onkeydown="activateBtn()"
          />
          <button
            className={
              isValidLogin ? 'login-btn-activated' : 'login-btn-deactivated'
            }
            type="submit"
            onClick={goToMain}
          >
            Log In
          </button>
        </form>
        <div className="divider">OR</div>
        <div className="fb-wrapper">
          <div className="fb">
            <a href="https://facebook.com">
              <img src="/images/sooyeonJang/facebook.png" alt="facebook-logo" />
              Log in with Facebook
            </a>
          </div>
        </div>
        <div className="forgot-wrapper">
          <div className="forgot">
            <a href="https://www.instagram.com/accounts/password/reset/">
              Forgotten your password?
            </a>
          </div>
        </div>
      </div>
      <div className="sign-up">
        <p>
          Don't have an account?{' '}
          <a href="https://www.instagram.com/accounts/emailsignup/">Sign up</a>
        </p>
      </div>
    </>
  );
};

export default Login;

More from this blog

[Kream 클론 프로젝트] 상품 더보기 기능

목표 offset/limit parameter를 사용한 상품 더보기 기능 구현 과정 1. 상품 더보기 기능 상품 목록 하단의 더보기 버튼을 누를 때마다 상품을 8개씩 더 로딩해오는 기능을 구현하기위해 예전에 배웠던 query parameter와 offset/limit 개념을 활용했다. offset과 limit을 설정해두면 데이터 요청 후 받아온 결과값에 순서를 부여해서 offset부터 limit까지의 데이터만 보여줄 수 있도록 페이징 처리...

Jul 22, 2022

[Kream 클론 프로젝트] 상품 검색 & 정렬 기능

목표 상품의 검색과 옵션별 정렬이 가능한 상품 목록 페이지 구현 과정 1. 상품 목록(메인) 페이지 UI 1) Kream이 상품 거래 사이트이다보니 각 상품마다 동일하게 반복되는 양식들이 많았는데, 이 부분들을 전부 컴포넌트로 만들고 재사용함으로써 코드의 길이를 많이 줄일 수 있었다. 특히 2차 프로젝트에서는 styled components를 사용하면서 각 페이지마다 js파일의 코드 양이 두배로 많아지는 바람에 한번 작성하고나면 알아보기가...

Jul 22, 2022

[Lululemon 클론 프로젝트] 장바구니 페이지

목표 상품 추가 / 삭제 / 수량 변경이 가능한 장바구니 페이지 구현 과정 1. 상품 데이터 받아오기 1) 사용자가 장바구니에 넣은 상품들의 목록을 렌더링하기위해 fetch 함수로 서버에서 데이터를 받아온 후 'itemList' 변수에 저장해두었다 . 2) 사용자를 식별한 다음 그에 맞는 데이터를 불러와야하기때문에 request header에 로그인시 발급했던 토큰 인가 과정을 추가했다. 코드🔻 const Bag = () => { co...

Jun 11, 2022

[Lululemon 클론 프로젝트] 로그인/회원가입 페이지

목표 JWT 인증방식을 활용한 로그인/회원가입 페이지 구현 과정 1. 로그인/회원가입 페이지 UI 1) lululemon의 사이트는 로그인 페이지에서 회원가입 버튼 클릭시 양식이 슬라이드로 올라와 한 페이지에서 로그인과 회원가입을 모두 진행할 수 있는 방식으로 되어 있었다. 이를 구현하기 위해 로그인 양식과 회원가입 양식을 각각 컴포넌트로 만든 뒤 'modal' 변수의 상태값이 true인지 false인지에 따라 적절한 컴포넌트가 렌더링될 수 ...

Jun 11, 2022

Rey's Blog

49 posts