반응형
헤더의 오른쪽 부분이다.
메인페이지에서 로그인을 안한 비회원일때는 SIGN UP버튼이 표시되고
로그인을 한 회원일 경우 MYPAGE버튼이 표시될 수 있도록 하는 기능을 구현하고자 한다.
header
const Header = function () {
// 로그인 상태 저장 state
// eslint-disable-next-line
const [isLoggedIn, setIsLoggedIn] = useState(false);
.
.
.
{
isLoggedIn ? (
<li className="nav-item">
<Link to="/mypage" className="nav-link text-secondary-emphasis" style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" className="bi bi-person-fill" viewBox="0 0 16 16">
<path d="M3 14s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1H3Zm5-6a3 3Z" />
</svg>
<span style={{ fontSize: '12px', marginTop: '6px' }}>MYPAGE</span>
</Link>
</li>
) : (
<li className="nav-item">
<Link to="/signup" className="nav-link text-secondary-emphasis" style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-box-arrow-in-right" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M6 3.5a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-8a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 0-1 0v2A1.5 1.5 0 0 0 6.5 14h8a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2h-8A1.5 1.5 0 0 0 5 3.5v2a.5.5 0 0 0 1 0v-2z" />
<path fill-rule="evenodd" d="M11.854 8.354a.5.5 0 0 0 0-.708l-3-3a.5.5 0 1 0-.708.708L10.293 7.5H1.5a.5.5 0 0 0 0 1h8.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3z" />
</svg>
<span style={{ fontSize: '12px', marginTop: '6px' }}>SIGN UP</span>
</Link>
</li>
)
}
</ul>
isLoggedIn이 처음에는 false로 기본값 지정이 되어있어 signup버튼이 나오게 되고
로그인이 확인된 경우 true로 변경, mypage버튼이 나오게된다.
signin
const SignIn = function () {
const [loginId, setLoginId] = useState("");
const [loginPassword, setLoginPassword] = useState("");
const { setIsLoggedIn } = useAuth();
반응형
signin 파일에 useAuth() 를 추가한다.
AuthContext
import React, { createContext, useState } from 'react';
const AuthContext = createContext();
export const AuthProvider = ({ children }) => {
const [isLoggedIn, setIsLoggedIn] = useState(false);
return (
<AuthContext.Provider value={{ isLoggedIn, setIsLoggedIn }}>
{children}
</AuthContext.Provider>
);
};
export const useAuth = () => React.useContext(AuthContext);
사용자 인증 정보를 관리하기 위한 AuthContext를 생성하고,
해당 컨텍스트를 사용하여 사용자 인증 상태를 관리하는 AuthProvider를 정의한다.
return문에서
<AuthContext.Provider> 컴포넌트는 isLoggedIn과 setIsLoggedIn 데이터를 자식 컴포넌트에게 제공한다.
app
function App() {
return (
<AuthProvider> {/* AuthProvider로 감싸서 로그인 상태 관리 */}
<Router>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<MainPage />} />
<Route path="/signin" element={<SignIn />} />
<Route path="/searchResult" element={<SearchResult />} />
<Route path="/trading" element={<Trading />} />
<Route path="/signup" element={<SignUp />} />
<Route path="/mypage" element={<MyPage />} />
<Route path="/booksignup" element={<BookSignUp />} />
</Route>
</Routes>
</Router>
</AuthProvider>
);
}
AuthProvider로 감싸서 로그인 상태 관리를 한다.
반응형
'Project > final' 카테고리의 다른 글
[9.16(토) 북스탁 프로젝트] 2차 멘토링 대대성공!! 칭찬일색 ~ 피드백 100% 수용했다! (0) | 2023.09.19 |
---|---|
[9.15(금) 북스탁 프로젝트] 카카오 소셜로그인 구현 | 카카오 간편로그인API연결하기(node.js) (0) | 2023.09.16 |
[9.14(목) 북스탁 프로젝트] 도서 검색결과 페이지를 만들어보자 ~! (0) | 2023.09.14 |
[9.6(수) 북스탁 프로젝트 일지] 팀원의 하차, 메인페이지 목업제작, '역경매'에 포커스, 핵심을 잊지말자!! (0) | 2023.09.06 |
[9.5(화) 파이널 프로젝트의 시작] 북스탁, 도서 역경매 사이트 제작을 시작하다! 생각보다 어려운 기획단계,, (0) | 2023.09.04 |