로그인 페이지에서 같은 로그인 폼으로 로그인을 할 수도 있고 가입을 할 수도 있게 useState를 사용하여 만들어 두었는데, 대신 표준 웹 개념인 쿼리 매개변수(검색 매개변수)를 활용할 수있다.
쿼리 매개변수란 URL에서 ?물음표 뒤에 붙는 매개변수이다.
예를 들면, 로그인 하는지, 아니면 가입하는지에 따라 mode
라는 매개변수를 활용하여 url을 설정하여 설정된 용도에 따라 다른 양식을 로딩하는 것이다.
라우트 경로는 계속 /auth
이지만 뒤에 매개변수를 추가하여 정확히 어떤 컴포넌트가 주어지는지 정의하면 된다.
따라서 직접 url을 입력하여 로그인/가입 페이지로 이동할 수 있다.
상태 기반 로직 > 쿼리 매개 변수 로직으로 대체하자.
쿼리 매개변수는 공식적으로는 검색(search) 매개변수라고 부른다.
const [searchParams, setSearchParams] = useSearchParams();
useSearchParams()는 배열을 리턴하는데 구조분해할당으로 가져올 수 있다.
const isLogin = searchParams.get("mode") === "login";
특정 쿼리 매개변수에 대한 값 가져오는 get()메서드를 사용하여 "mode" 쿼리 매개변수를 가져와 그 값이 login인지 확인한다. 다른 값이면 가입모드가 된다.
import { Form, Link, useSearchParams } from "react-router-dom";
import classes from "./AuthForm.module.css";
function AuthForm() {
const [searchParams] = useSearchParams();
const isLogin = searchParams.get("mode") === "login";
return (
<>
<Form method="post" className={classes.form}>
<h1>{isLogin ? "Log in" : "Create a new user"}</h1>
<p>
<label htmlFor="email">Email</label>
<input id="email" type="email" name="email" required />
</p>
<p>
<label htmlFor="image">Password</label>
<input id="password" type="password" name="password" required />
</p>
<div className={classes.actions}>
<Link to={`?mode=${isLogin ? "signup" : "login"}`}>
{isLogin ? "Create new user" : "Login"}
</Link>
<button>Save</button>
</div>
</Form>
</>
);
}
export default AuthForm;
로그인 화면 url: /auth?mode=login
가입 화면 url: /auth?mode=signup