๐ŸŒŸ ๋กœ๊ทธ์ธ ํผ ๋งŒ๋“ค๊ธฐ

summereuna๐Ÿฅยท2022๋…„ 3์›” 9์ผ

๐ŸŒŸ Twinkle (React, Firebase)

๋ชฉ๋ก ๋ณด๊ธฐ
6/42

Login Form ๋งŒ๋“ค๊ธฐ


๐Ÿ“ Auth.js

const Auth = () => (
  <div>
    <h1>๋กœ๊ทธ์ธ ํŽ˜์ด์ง€</h1>
    <p>๋กœ๊ณ  ๋„ฃ๊ธฐ</p>
    <form>
      <input type="email" placeholder="Email" required></input>
      <input type="password" placeholder="Password" required></input>
      <input type="submit" value="Login" />
    </form>
    <div>
      <button>Continue with Google</button>
      <button>Continue with GitHub</button>
    </div>
  </div>
);

export default Auth;

๊ธฐ๋ณธ์ ์œผ๋กœ ์ผ๋‹จ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด ๋ณด์ž.
ํ˜„์žฌ local๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์•„๊นŒ ์ž…๋ ฅํ•œ GitHub์˜ OAuth App์˜ ์ฝœ๋ฐฑ url์€ ๋กœ์ปฌ์ด ์•„๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ GitHub์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฑฐ๋ž€ ๊ฒƒ์„ ์ธ์ง€ํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ž. ^3^

๋ฐ˜์‘ํ•˜๋Š” Login Form ๋งŒ๋“ค๊ธฐ


useState()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ input๊ณผ form์— state๋ฅผ ์ ์šฉํ•˜์ž.

โ—๏ธ ์—ฌ๊ธฐ์„œ ์ž ๊น! ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ return ์“ฐ๋Š” ์—ฌ๋ถ€ ํ™•์ธํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ž.

//return ์•ˆ์จ๋„ ๋Œ
const ๋ณ€์ˆ˜๋ช… = () = > ();
//
//return ์จ์•ผ ํ•จ
const ๋ณ€์ˆ˜๋ช… = () = > {
  return();
};
import { useState } from "react";

const Auth = () => {
  //์ด๋ฉ”์ผ๊ณผ ํŒจ์Šค์›Œ๋“œ ๋‘˜๋‹ค useState()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state๊ฐ’์„ ์‚ฌ์šฉํ•˜์ž.
  //๋””ํดํŠธ ๊ฐ’์€ ""์œผ๋กœ ์ž…๋ ฅํ•˜์ž.
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  //email, password์— ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ
  const onChange = (event) => {
    console.log(event.target.name);
  };
  //form์— ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ
  const onSubmit = (event) => {
    event.preventDefault();
  };
  return (
    <div>
      <h1>๋กœ๊ทธ์ธ ํŽ˜์ด์ง€</h1>
      <p>๋กœ๊ณ  ๋„ฃ๊ธฐ</p>
      {/*form์— onSubmit ์ด๋ฒคํŠธ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค*/}
      <form onSubmit={onSubmit}>
        <input
          type="email"
          placeholder="Email"
          required
          {/*value์— state๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
          name์„ ์ž‘์„ฑํ•˜์—ฌ event.target.name์ด ์–ด๋–ป๊ฒŒ ์ฝ˜์†”์— ์ฐํžˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.
          onChange ์ด๋ฒคํŠธ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค*/}
          value={email}
          name="email"
          onChange={onChange}
        ></input>
        <input
          type="password"
          placeholder="Password"
          required
          {/*value์— state๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
          name์„ ์ž‘์„ฑํ•˜์—ฌ event.target.name์ด ์–ด๋–ป๊ฒŒ ์ฝ˜์†”์— ์ฐํžˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.
          onChange ์ด๋ฒคํŠธ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค*/}
          value={password}
          name="password"
          onChange={onChange}
        ></input>
        <input type="submit" value="Login" />
      </form>
      <div>
        <button>Continue with Google</button>
        <button>Continue with GitHub</button>
      </div>
    </div>
  );
};

export default Auth;
  • ์ด๋ฒคํŠธ ํƒ€๊ฒŸ ๋„ค์ž„์ด ์ž˜ ๋ฐ›์•„์˜จ๋‹ค.
    ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ์ด๋ฉ”์ผ/ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅํ•  ๋•Œ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ ์ด๋ฒคํŠธ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

Way 1.
์ด๋ ‡๊ฒŒ ๋ง์ด๋‹ค. if/else if ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ form์„ ์ปจํŠธ๋กค ํ•ด๋ณด์ž.
name์ด "email"์ด๋ฉด setEmail()๋กœ value๋ณด๋‚ด์„œ email state๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , name์ด "password"์ด๋ฉด setPassword()๋กœ value๋ณด๋‚ด์„œ password state๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋œ๋‹ค.

const onChange = (event) => {
    const {
      target: { name, value },
    } = event;
    if (name === "email") {
      setEmail(value);
    } else if (name === "password") {
      setPassword(value);
    }
  };

Way 2.
์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค๋Š” ๊ณ ์ˆ˜์˜ ๋Œ“๊ธ€...!
์•„์— form state์•ˆ์— ์ด๋ฉ”์ผ, ํŒจ์Šค์›Œ๋“œ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ฒŒ ํ•˜๋Š” ๊ทธ๋Ÿฐ...ใ…‡.ใ…‡!!

  const [form, setForm] = useState({ email: "", password: "" });
  const onChange = ({ target: { name, value } }) =>
    setForm({ ...form, [name]: value });

Way 3.
if else if๋กœ ๋‹ค์ค‘ ์กฐ๊ฑด๋ฌธ ์“ฐ๋Š” ๋Œ€์‹  ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
์ฝ”๋”ฉ์˜ ์„ธ๊ณ„๋Š” ๋ฌด๊ถ๋ฌด์ง„ํ•˜๊ตฌ๋งŒ...^.^!

onChange={e => setEmail(e.target.value)}
onChange={e => setPassword(e.target.value)}

๐Ÿ”ฅ ๊ฐ€์žฅ ๋ณดํŽธ์ ์ธ Way.1์œผ๋กœ ๊ฐ€๋Š” ๊ฑธ๋กœ ..^^!

๋ฐ˜์‘ํ•˜๋Š” Login Form ๋กœ์ง


import { useState } from "react";

const Auth = () => {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  //email, password์— ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ
  const onChange = (event) => {
    const {
      target: { name, value },
    } = event;
    if (name === "email") {
      setEmail(value);
    } else if (name === "password") {
      setPassword(value);
    }
  };
  //form์— ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ
  const onSubmit = (event) => {
    event.preventDefault();
  };
  return (
    <div>
      <h1>๋กœ๊ทธ์ธ ํŽ˜์ด์ง€</h1>
      <p>๋กœ๊ณ  ๋„ฃ๊ธฐ</p>
      <form onSubmit={onSubmit}>
        <input
          type="email"
          placeholder="Email"
          required
          value={email}
          name="email"
          onChange={onChange}
        ></input>
        <input
          type="password"
          placeholder="Password"
          required
          value={password}
          name="password"
          onChange={onChange}
        ></input>
        <input type="submit" value="Login" />
      </form>
      <div>
        <button>Continue with Google</button>
        <button>Continue with GitHub</button>
      </div>
    </div>
  );
};

export default Auth;

๋กœ์ง

  1. input(์ด๋ฉ”์ผ ์ธํ’‹/๋น„๋ฒˆ ์ธํ’‹)์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋งˆ๋‹ค, onChange ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  2. onChange ์ด๋ฒคํŠธ๋Š” onChange ํŽ‘์…˜์„ ํ˜ธ์ถœํ•œ๋‹ค.

  3. onChange ํŽ‘์…˜์„ ํ˜ธ์ถœ input์— ์ž…๋ ฅํ•œ ๊ฐ’(event.target.value)์„ ํ† ๋Œ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์ด ์‹คํ–‰๋œ๋‹ค.

  • name์ด email๊ณผ ๊ฐ™์„ ๊ฒฝ์šฐ
    setEmail()๊ณผ ์ž…๋ ฅํ•œ event.target.value๊ฐ’์„ ์ด์šฉํ•˜์—ฌ email state๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฉ”์ผ input์€ ์ด๋ฉ”์ผ state์— ์žˆ๋Š” value ๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค.
  • name์ด password์™€ ๊ฐ™์„ ๊ฒฝ์šฐ
    setPassword()์™€ ์ž…๋ ฅํ•œ event.target.value๊ฐ’์„ ์ด์šฉํ•˜์—ฌ password state๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํŒจ์Šค์›Œ๋“œ input์€ ํŒจ์Šค์›Œ๋“œ state์— ์žˆ๋Š” value ๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค.
  1. ๋”ฐ๋ผ์„œ input์ด ๋ฐ”๋€Œ๋Š” ๋ชจ๋“  ์ˆœ๊ฐ„๋งˆ๋‹ค state๋„ ๋ฐ”๋€Œ๋Š” ๊ฑฐ๋‹ค.
    ์ฝ˜์†”๋กœ๊ทธ ์ฐ์–ด๋ณด๋ฉด ํ‚ค๋ณด๋“œ ์ž…๋ ฅํ•  ๋•Œ ๋งˆ๋‹ค(ํ•œ๊ธ€์ž ํ•œ๊ธ€์ž ๋งˆ๋‹ค/ onChange ์ด๋ฒคํŠธ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—) value ๊ฐ’ ๋ฐ”๋€Œ๋Š” ๊ฑฐ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
profile
Always have hope๐Ÿ€ & constant passion๐Ÿ”ฅ

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