드디어 로그인 페이지 구현 부분이다. redux 부분이 어려워서 여러번 복습해야할 것 같다.🥲 우선은 배운 부분을 정리해둔다!
강의에서는 진행하지 않았지만 보통은 Formik과 Yup 라이브러리를 통해서 유효성 체크하는 기능을 추가해준다고 한다. 나중에 한번 살펴보겠다!
import React, { useState } from "react";
import { useDispatch } from "react-redux";
import { loginUser } from "../../../_actions/user_action";
import { useNavigate } from "react-router-dom";
function LoginPage(props) {
const dispatch = useDispatch();
const navigate = useNavigate();
const [Email, setEmail] = useState("");
const [Password, setPassword] = useState("");
const onEmailHandler = (event) => {
setEmail(event.currentTarget.value);
};
const onPasswordHandler = (event) => {
setPassword(event.currentTarget.value);
};
const onSubmitHandler = (event) => {
event.preventDefault();
let body = {
email: Email,
password: Password,
};
dispatch(loginUser(body)).then((response) => {
if (response.payload.loginSuccess) {
navigate(-1);
} else {
alert("Error");
}
});
};
return (
<div
style={{ display: "flex", justifyContent: "center", alignItems: "center", width: "100%", height: "100vh" }}
onSubmit={onSubmitHandler}
>
<form style={{ display: "flex", flexDirection: "column" }}>
<label>Email</label>
<input type="email" value={Email} onChange={onEmailHandler} />
<label>Password</label>
<input type="password" value={Password} onChange={onPasswordHandler} />
<br />
<button>Login</button>
</form>
</div>
);
}
export default LoginPage;
import axios from "axios";
import { LOGIN_USER } from "./types";
export function loginUser(dataToSubmit) {
const request = axios.post("/api/users/login", dataToSubmit).then((response) => response.data);
return {
type: LOGIN_USER,
payload: request,
};
}
유저의 action들을 담아두려하는 파일이고, 해당 코드는 로그인을 시작 할 때의 action을 구현한 내용이다.
loginUser function 생성
axios를 통해 request 진행
export const LOGIN_USER = "login_user";
action의 type들만 빼서 관리해준다. 여러군데에서 사용하는데 요것이 오타가 날 수도 있고 이렇게 빼서 관리하는게 훨씬 깔끔하다.
유저 로그인과 관련한 type을 빼서 관리해준다!
import { LOGIN_USER } from "../_actions/types";
const userReducer = (state = {}, action) => {
switch (action.type) {
case LOGIN_USER:
return { ...state, loginSuccess: action.payload };
default:
return state;
}
};
export default userReducer;
reducer는 previousState과 action을 조합해 nextState를 만든다.
import { combineReducers } from "redux";
import user from "./user_reducer";
const rootReducer = combineReducers({
user,
});
export default rootReducer;
rootReducer에 user_reducer를 추가해준다!
dispatch(loginUser(body)).then(response => {
if(response.payload.loginSuccess) {
props.history.push("/")
} else {
alert("Error");
}
})
해당 강의에서는 LoginPage.js 의 dispatch 부분에서 로그인 성공 시 LandingPage로 넘기는 부분에서 위와 같이 작성한다.
그러면 요런 에러가 짜잔~
uncaught (in promise) typeerror cannot read properties of undefined (reading 'push')
처음에는 버전 문제인가 싶어서 다른 방법으로 해결하는법을 찾아봤는데 지금 찾아보니 버전 문제는 아닌 것 같다.
[React] history.push()로 props 데이터 넘겨주기
왜 안되었는지 잘 모르겠지만 useNavigate를 이용해서 navigate로 라우팅을 시켜주어 해결했다!
dispatch(loginUser(body)).then((response) => {
if (response.payload.loginSuccess) {
navigate(-1);
} else {
alert("Error");
}
});
};
따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 를 공부하며 작성한 글입니다.