React.js

React를 경험해보자. 5탄

Hoon1994 2020. 11. 3. 23:41

 

✏️React를 경험해보자 5탄

 

4탄에서 Provider를 통해 App에서 Store 접근을 할 수 있게 만들었다.

5탄에서는 리덕스를 이용해서 로그인 기능을 만들어보려고 한다. 

 

import React, { useState } from "react";
import { useDispatch } from "react-redux";
import { loginUser } from "../_actions/user_action";

function LoginPage(props) {
  const dispatch = useDispatch();
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

  const onEmailHandler = (e) => {
    setEmail(e.currentTarget.value);
  };

  const onPasswordHandler = (e) => {
    setPassword(e.currentTarget.value);
  };

  const onSubmitHandler = (e) => {
    e.preventDefault();

    let body = {
      email,
      password,
    };

    dispatch(loginUser(body)).then((res) => {
      if (res.payload.loginSuccess) {
        props.history.push("/");
      } else {
        alert("Err");
      }
    });
  };

  return (
    <div
      style={{
        display: "flex",
        justifyContent: "center",
        alignItems: "center",
        width: "100%",
        height: "100vh",
      }}
    >
      <form
        style={{ display: "flex", flexDirection: "column" }}
        onSubmit={onSubmitHandler}
      >
        <label>Email</label>
        <input type="email" value={email} onChange={onEmailHandler} />
        <label>Password</label>
        <input type="password" value={password} onChange={onPasswordHandler} />
        <br />
        <button type="submit">Login</button>
      </form>
    </div>
  );
}

  

구현 완료된 로그인 페이지의 코드다. 

위에서부터 차례대로 코드를 보자면, 

 

const dispatch = useDispatch();

@returns — redux store's dispatch function 

 

useDispatch는 Store의 dispatch 기능을 사용할 수 있게 해주는 함수를 return 해준다.

 

  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

 

 

[상태값, 상태값을 설정하는 함수] = useState('초기 설정 값')이다. 

 

jsx부분을 보면 input tag에 onChange={onEmailHandler} 코드가 있는데, 

onChange 이벤트가 실행되면 onEmailHandler 함수를 실행하고,

해당 함수안에서는 event.currentTarget.value 값을 setEmail 값에 저장하는 로직이다.

 

 

마찬가지로, form tag에도 onSubmit={onSubmitHandler} 코드가 존재하는데, 

버튼 클릭 시 아래 함수를 실행한다.

 

  const onSubmitHandler = (e) => {

    e.preventDefault();

    let body = {

      email,

      password,

    };

    dispatch(loginUser(body)).then((res) => {

      if (res.payload.loginSuccess) {

        props.history.push("/");

      } else {

        alert("Err");

      }

    });

  };

 

body 객체 안에 email, password를 저장하고 (축약문법 사용), 

dispatch 함수의 인자로 loginUser(body)를 전달한다. 

 

아래는 loginUser의 코드다.

 

import axios from "axios";
import { LOGIN_USER } from "./types";

export function loginUser(dataToSubmit) {
  const req = axios
    .post("/api/users/login", dataToSubmit)
    .then((res) => res.data);

  return {
    type: LOGIN_USER,
    payload: req,
  };
}

 

axios를 통해 post API를 호출하고, 받은 데이터를 payload로, type은 LOGIN_USER를 리턴해준다. 

체이닝이 많이 되어있다 보니까 조금 복잡한데, 이후 reducer 과정은 6탄에서 포스팅하겠다.

 

'React.js' 카테고리의 다른 글

React Query 1편  (0) 2022.11.02
React를 경험해보자. 6탄  (2) 2020.11.05
React를 경험해보자. 4탄  (0) 2020.11.02
React를 경험해보자. 3탄  (0) 2020.11.01
React를 경험해보자. 2탄  (0) 2020.10.30