인프런 커뮤니티 질문&답변
로그인 관련 커스텀 훅 만들기 -> 부분 질문입니다.
작성
·
61
·
수정됨
0
현재 loginSlice.tsx에서 오류가 나고 있습니다..
아래와 같은 메세지를 접했습니다.
useCustomLogin.tsx:2 Uncaught SyntaxError: The requested module '/src/store.tsx' does not provide an export named 'AppDispatch' (at useCustomLogin.tsx:2:10)
어느부분을 손 봐야할까요?
vite 6.3버전으로 이용하고 있습니다.
loginSlice.tsx
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"
import { loginPost } from "../api/memberApi"
import { removeCookie, setCookie } from "../util/cookieUtil"
export interface LoginInfo {
email:string,
nickname:string,
accessToken: string,
refreshToken: string,
roleNames: string[],
status: string
}
const initState:LoginInfo = {
email: '',
nickname: '',
accessToken:'',
refreshToken: '',
roleNames: [],
status: ''
}
export const loginPostAsync = createAsyncThunk('loginPostAsync', ({email, pw}: {email:string, pw:string}) => {
console.log("---------------loginPostAsync---------------------")
console.log(email, pw)
return loginPost(email, pw)
})
const loginSlice = createSlice({
name: 'loginSlice',
initialState: initState,
reducers: {
save: (state, action) => {
console.log("save...........")
return action.payload
},
logout: (state, action) => {
console.log("logout..........")
removeCookie("member")
}
},
extraReducers :(builder) => {
builder.addCase(loginPostAsync.fulfilled , (state, action) => {
console.log("loginPostAsync.fulfilled")
const newState:LoginInfo = action.payload
newState.status = 'fulfilled'
setCookie("member", JSON.stringify(newState), 1)
return newState
})
.addCase(loginPostAsync.pending, (state, action) => {
console.log("loginPostAsync.pending")
state.status = 'pending'
})
.addCase(loginPostAsync.rejected, (state, action) => {
console.log("loginPostAsync.rejected")
state.status = 'rejected'
})
}
})
export const { save, logout} = loginSlice.actions
export default loginSlice.reducer
useCustoLogin.tsx
import { useDispatch, useSelector } from "react-redux"
import { AppDispatch, RootState } from "../store"
import { Navigate, useNavigate } from "react-router"
import { loginPostAsync, logout, save } from "../slices/loginSlice"
import { useEffect } from "react"
import { getCookie } from "../util/cookieUtil"
const useCustomLogin = () => {
const dispatch = useDispatch<AppDispatch>()
//로그인 상태 객체
const loginState = useSelector((state: RootState) => state.loginSlice)
//로그인 여부
const loginStatus = loginState.status //fulfilled, pending, rejected
useEffect(()=> {
if(! loginStatus ) {
const cookieData = getCookie("member")
if(cookieData){
dispatch(save(cookieData))
}
}
}, [])
const navigate = useNavigate()
const doLogin = async (email:string, pw:string) => {
dispatch(loginPostAsync({ email, pw }))
}
const doLogout = () => {
dispatch(logout(null))
}
const moveToLogin = () => {
navigate("/member/login")
}
const moveToLoginReturn = () => { //--------로그인 페이지로 이동 컴포넌트
return <Navigate replace to="/member/login"/>
}
const moveToPath = (path:string) => { //----------------페이지 이동
navigate({pathname: path}, {replace:true})
}
return {loginState, loginStatus, doLogin, doLogout,moveToLogin,moveToLoginReturn,moveToPath}
}
export default useCustomLogin
store.tsx
import { configureStore } from "@reduxjs/toolkit";
import loginSlice from "./slices/loginSlice";
const store = configureStore({
reducer: {
"loginSlice": loginSlice,
}
})
export type AppDispatch = typeof store.dispatch
export type RootState = ReturnType<typeof store.getState>
export default store
답변 2
0
올려주는 코드를 강의에 사용한 코드에 적용했을때 특별히 에러가 발생하지는 않았습니다.
해당 부분은 AppDispatch 에 대한 import 문제라고 나오는데 문제가 있지는 않네요..
우선 제공되는 코드를 한번 이용해 보시는게 어떨까 싶습니다.
해당 섹션에 추가되어 있는 소스코드역시 6.3으로 제작되어 있습니다. 강의 자료에 있으니 사용해 보시길 바랍니다.
혹시 문제 해결이 안되시면 개인 깃헙 주소를 메일(cookie_00@naver.com)으로 보내주시면 살펴볼 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 별다방님.
로그인 관련 커스텀 훅에서 발생한 오류는 주로 useCustomLogin.tsx가 store.tsx에서 제대로 내보내지 않는 것을 가져오려 했을 때 발생할 수 있습니다.
문제 해결:
모듈 내보내기 확인:
store.tsx파일에서AppDispatch와RootState가 제대로 내보내지고 있는지 확인해 봅시다. 보통 ES6 모듈 시스템에서는export키워드를 사용해 내보내기를 정의합니다.내보내기 명확히 하기:
store.tsx에서AppDispatch,RootState의 타입을 명시적으로 내보내야 import 기능이 정상 작동할 수 있습니다. 다행히 코드에서는 정확히export type AppDispatch = typeof store.dispatch와export type RootState = ReturnType<typeof store.getState>라고 명시되어 있습니다.Vite 버전 및 설정 확인: 사용 중인 Vite의 버전이 영향을 줄 수 있습니다. 최신 Vite 버전에서는 ES 모듈 시스템을 사용하므로,
store.tsx파일의 내보내기가 ES 모듈 방식으로 되어있는지 확인이 필요합니다.캐시 및 빌드 데이터 삭제: Vite가 빌드된 데이터를 캐시하여 문제를 일으킬 수도 있습니다.
npm run clean또는npm cache clean --force를 사용해 캐시를 정리하고 프로젝트를 다시 빌드해 보세요.
추가 지원 리소스
이 오류와 관련된 내용은 비슷한 주제를 다루는 기존 질문 URL을 참조하실 수 있습니다:
- React에서 타입스크립트로 Redux의 상태와 Dispatch 타입 정하기
위의 해결 방안들이 도움이 되길 바라며, 만약 이 방법으로 문제가 해결되지 않거나 추가적인 도움이 필요하신 경우, 더 상세한 설명을 덧붙여 주시면 감사하겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





