inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)

유저 정보 Context에 담아주기(3)

dispatch에서 const dispatch = useContext(DispatchContext); 가 console.log(dispatch)를 하면 null로 출력이 나옵니다.

349

rlawnsgml1997

작성한 질문수 5

0

안녕하세요 강사님,

수업대로 코드를 작성해도 제목과 같이 원하지 않던 오류가 생겨 질문을 드립니다.

아래와 같이 작성했을때, dispatch함수가 function이 아니라는 오류를 내뱉어, 원인을 찾았더니,

useContext(DispatchContext)가 null인 원인이었습니다. 이를 어떻게 고쳐야 정상적으로 작동을 할지 잘 모르겠습니다.

코드는 다음과 같습니다.

 

import axios from "axios";
import { createContext, useContext, useEffect, useReducer } from "react";
import { User } from "../types";

interface State {
    authenticated: boolean;
    user: User | undefined;
    loading: boolean;
}

export const StateContext = createContext<State>({
    authenticated: false,
    user: undefined,
    loading: true
});

export const DispatchContext = createContext<any>(null);

interface Action {
    type: string;
    payload: any;
}


const reducer = (state: State, { type, payload }: Action) => {
    switch (type) {
        case "LOGIN":
            return {
                ...state,
                authenticated: true,
                user: payload
            }
        case "LOGOUT":
            return {
                ...state,
                authenticated: false,
                user: null
            }
        case "STOP_LOADING":
            return {
                ...state,
                loading: false
            }
        default:
            throw new Error(`Unknown action type: ${type}`)
    }
}



export const AuthProvider = ({ children }: { children: React.ReactNode }) => {

    const [state, defaultDispatch] = useReducer(reducer, {
        user: null,
        authenticated: false,
        loading: true
    })

    console.log("state", state);

    const dispatch = (type: string, payload?: any) => {
        defaultDispatch({ type, payload });
    }

    return (
        <DispatchContext.Provider value={dispatch}>
            <StateContext.Provider value={state}>{children}</StateContext.Provider>
        </DispatchContext.Provider>
    )
}

export function useAuthState() {
    const state = useContext(StateContext);
    //if(!state) throw new Error("Provider is not found");
    return state;
}
export function useAuthDispatch(){
    const dispatch = useContext(DispatchContext);
    //if(!dispatch) throw new Error("Provider is not found");
    return dispatch;
}




/**
 *  
 * <AuthProvider>
 *  <Component {...} />    => Component가 위의 children에 들어감
 * </AuthProvider>
 * 
 * 
 */

위는 context/auth 코드이고, 아래는 pages/api/login 코드입니다.

import React, { useState, useContext, FormEvent} from 'react' import Link from "next/link" import axios from "axios" import InputGroup from "../components/InputGroup" import { useRouter } from 'next/router' import { useAuthDispatch, useAuthState, AuthProvider, StateContext, DispatchContext } from "../context/auth"; const Login = () => { let router = useRouter(); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [errors, setErrors] = useState<any>({}); const dispatch = useAuthDispatch(); //const dispatch = useContext(DispatchContext); const handleSubmit = async (event: FormEvent) =>{ event.preventDefault(); try{ const res = await axios.post("/auth/login",{password, username}, {withCredentials: true}); console.log("res: ",res); dispatch("LOGIN", res.data?.user) router.push('/'); }catch(error: any){ console.log(error || {}); //setErrors(error.response.data || {}); } } return ( <div className="bg-white"> <div className="flex items-center justify-content h-screen p-6"> <div className="w-10/12 h-2/4 mx-auto md:w-96"> <h1 className="mb-2 text-lg text-yellow-500 font-medium">로그인</h1> <AuthProvider> <form onSubmit={handleSubmit} className="h-1/2"> <InputGroup placeholder="Username" value={username} setValue={setUsername} error={errors.username} /> <InputGroup placeholder="Password" value={password} setValue={setPassword} error={errors.password} /> <button className="w-full py-2 text-xs font-bold text-white uppercase bg-gray-400 border border-gray-400 rounded"> 로그인 </button> </form> </AuthProvider> <small className="text-black"> 아직 아이디가 없나요? <Link href="/login"> <a className="ml-1 text-blue-500 uppercase">회원가입</a> </Link> </small> </div> </div> </div> ) } export default Login

클론코딩 Next.js docker typescript postgresql react nodejs

답변 0

toJson을 추가하면 [sub].tsx에서 sub를 받아오지 못합니다.

0

139

2

쿠키 저장이 되지 않습니다.

0

240

1

AxiosError {message: 'Request failed with status code 401/500', name: 'AxiosError', code: 'ERR_BAD_RESPONSE', (2)

0

597

1

AxiosError {message: 'Request failed with status code 401/500', name: 'AxiosError', code: 'ERR_BAD_RESPONSE',

0

667

1

overload 에러

0

181

1

docker compose up 오류

0

219

1

부록) remark 강의 중 parmas 오류

0

142

1

3000번은 잘 들어가지는데 80번은 안됩니다.

1

304

0

커뮤니티를 올리고 난 후 404 page

0

219

1

tailwind css 문제인지, className 에 적용한 css가 적용되지 않아요.

0

1053

2

tsx 수정 시 마다 빌드 후 서버 시작 해야하나요?

0

670

2

useState 쳤을 때 자동완성 되는 단축키 무엇인가요? extention 인가요?

0

817

2

리액트 서버 npm run dev 와 npm run build 후 npm start 의 차이

0

4666

2

data 폴더가 생성되지 않아요.

0

537

1

docker-compose up 오류

0

818

1

회원 가입 페이지 기능 생성(3) 중 에러

0

391

2

Entity에 toJSON 코드 입력 후 404 에러

0

259

1

context에서 useEffect 선언 부분 질문 있어요.

0

304

1

src 폴더구조

0

515

2

서버 실행 시 에러 관련하여 답변받고 1차 조치했는데 여전하여서 질문 남깁니다

0

303

1

엔티티 모두 작성 후 서버 실행 시 에러가 발생합니다

0

319

1

회원가입 누르면 404에러가 뜹니다 ;-;

1

439

1

nextjs버젼에 대해서 질문드립니다.

0

380

1

<npm run dev>시 -61 에러가 나타납니다!

0

366

1