로그인을 구현하기
로그인을 진행하기위해서는
form 에서 submit을 통해 현재 name과 비밀번호를 dispatch를 통해 액션을 실행해줘야한다
그러므로 액션관련 함수들을 생성해줘야한다.
type.js
export const REGISTER_USER = "REGISTER_USER";
export const LOGIN_USER ="LOGIN_USER";
userAction.js
import { REGISTER_USER, LOGIN_USER } from "./types";
import { request } from "../utils/axios";
const USER_URL = "/api/user";
export function registerUser(dataToSubmit) {
const data = request("post", USER_URL + "/register", dataToSubmit);
return {
type: REGISTER_USER,
payload: data,
};
}
export function loginUser(dataToSubmit) {
const data = request("post", USER_URL + "/login", dataToSubmit);
return {
type: LOGIN_USER,
payload: data,
};
}
userReducer.js
import { REGISTER_USER, LOGIN_USER } from "../_actions/types";
export default function (state = {}, action) {
switch (action.type) {
case REGISTER_USER:
return { ...state, success: action.payload };
case LOGIN_USER:
return { ...state, loginSuccess: action.payload };
default:
return state;
}
}
LoginUser.js
import React, { useState } from "react";
import { withRouter } from "react-router-dom";
import { useDispatch } from "react-redux";
import { loginUser } from "../../../_actions/userAction";
function LoginPage(props) {
const [Email, setEmail] = useState("");
const [Password, setPassword] = useState("");
const dispatch = useDispatch();
const onEmailHandler = (e) => {
setEmail(e.currentTarget.value);
};
const onPasswordHanlder = (e) => {
setPassword(e.currentTarget.value);
};
const onSubmitHandler = (e) => {
e.preventDefault();
//로그인을 진행하기위해서
//첫번째 useDispatch(액션) 을 활용해서 액션을 dispatch해준다
const body = {
email: Email,
password: Password,
};
dispatch(loginUser(body))
.then((res) => {
console.log(res);
if (res.payload.loginSuccess) {
props.history.push("/");
} else {
alert(res.payload.message);
}
})
.catch((err) => {
console.log(err);
});
};
return (
<div
style={{
display: "flex",
justifyContent: "center",
alignItems: "center",
width: "100%",
height: "100vh",
}}>
<form
onSubmit={onSubmitHandler}
style={{ display: "flex", flexDirection: "column" }}>
<label>Email</label>
<input type="email" value={Email} onChange={onEmailHandler} />
<label>Password</label>
<input type="password" value={Password} onChange={onPasswordHanlder} />
<br />
<button type="submit">Login</button>
</form>
</div>
);
}
export default withRouter(LoginPage);
로그인 버튼을 누르고 return res가 loginSuccess = true일때 메인 페이지 라우터 ("/") 로 보내주는 로직이다.
로그인 기능을 작성했으니 로그아웃 기능도 작성해 보려한다.
로그아웃 기능은 훨씬더 간단하다
export const REGISTER_USER = "REGISTER_USER";
export const LOGIN_USER = "LOGIN_USER";
export const LOGOUT_USER = "LOGOUT_USER";
import { REGISTER_USER, LOGIN_USER, LOGOUT_USER } from "./types";
import { request } from "../utils/axios";
const USER_URL = "/api/user";
export function registerUser(dataToSubmit) {
const data = request("post", USER_URL + "/register", dataToSubmit);
return {
type: REGISTER_USER,
payload: data,
};
}
export function loginUser(dataToSubmit) {
const data = request("post", USER_URL + "/login", dataToSubmit);
return {
type: LOGIN_USER,
payload: data,
};
}
export function logoutUser() {
const data = request("post", USER_URL + "/logout");
return {
type: LOGOUT_USER,
payload: data,
};
}
import { REGISTER_USER, LOGIN_USER, LOGOUT_USER } from "../_actions/types";
export default function (state = {}, action) {
switch (action.type) {
case REGISTER_USER:
return { ...state, success: action.payload };
case LOGIN_USER:
return { ...state, loginSuccess: action.payload };
case LOGOUT_USER:
return { ...state, success: action.payload };
default:
return state;
}
}
LandingPage.js
import React from "react";
import { withRouter } from "react-router-dom";
import { useDispatch } from "react-redux";
import { logoutUser } from "../../../_actions/userAction";
function LandingPage(props) {
const dispatch = useDispatch();
const onClickHandler = () => {
//useDispatch를 사용해서 로그아웃 액션을 실행한다
//useDispatch와 logout 액션이 두가지 필요하다
dispatch(logoutUser())
.then((res) => {
console.log(res);
if (res.payload.success) {
props.history.push("/login");
} else {
alert("로그아웃에 실패하였습니다");
}
})
.catch((err) => console.log(err));
};
return (
<div
style={{
display: "flex",
justifyContent: "center",
alignItems: "center",
width: "100%",
height: "100vh",
}}>
<h2>시작 페이지</h2>
<button onClick={onClickHandler}>로그아웃</button>
</div>
);
}
export default withRouter(LandingPage);
해당 글은 위 강의를 바탕으로 작성되었습니다.
'React > react 활용하기' 카테고리의 다른 글
react + redux를 활용한 로그인및 회원가입 만들기 - auth(접근방지, 허용) 기능 구현하기 (1) | 2020.07.01 |
---|---|
react + redux를 활용한 로그인및 회원가입 만들기 - 회원가입만들기 (2) | 2020.06.30 |