TIL/Today I Learned

[TIL] 23.07.28 Today I Learned

임성장 2023. 7. 29. 00:42
728x90

요약: 영화 검색 웹페이지 검색 기능 구현

일시: 23.07.28

장소: 더휴먼컴퓨터아트아카데미

배운 점:

module/search.js

// ----------------------액션 타입 작성----------------------

export const CALL_API = 'counter/CALL_API';

// ----------------------액션 함수 작성----------------------

export const callapi = (value) => {
    return {
      type: 'CALL_API',
      payload: value,
    };
  };


// ----------------------초기 상태 작성----------------------

const initialState = {
    movieInfo: [],
};

// -----------------------리듀서 작성------------------------

function saveApi(state = initialState, action) {
  switch (action.type) {
    case CALL_API:
      return {
        ...state,
        movieInfo: action.payload
      };
    default:
      return state;
  }
}

export default saveApi;

src/module/index.js

import { combineReducers } from "redux";
import searchReducer from "./search";

const rootReducer = combineReducers({
    searchReducer,
});

export default rootReducer;

src/Search.jsx

import React from 'react'
import { useState, useEffect } from "react";
import axios from "axios";
import { useSelector, useDispatch } from 'react-redux';
import {callapi} from '../../modules/search'

const Search = () => {
    // const [movieInfo, setMovieInfo] = useState([]);
    const movieInfo = useSelector((state) => state.searchReducer.saveApi);
    const dispatch = useDispatch();

    const saveApiData = (data) => {
        dispatch(callapi(data)); // 액션 디스패치를 통해 상태 업데이트
      };

    const IMG_BASE_URL = "http://image.tmdb.org/t/p/w1280";

    const getMovies = async () => {
        await axios
            .get(
                "TMDB.API"
            )
            .then((response) => {
                // 요청 성공 시의 처리
                console.log("응답 데이터:", response.data.results);
                // setMovieInfo(response.data.results);
                saveApiData(response.data.results)
            })
            .catch((error) => {
                console.error("오류 발생:", error);
            });
    };

    useEffect(() => {
        getMovies();
    }, []);
  return (
    <div>Search</div>
  )
}

export default Search
src/module/search.js src/module/index.js src/Search.jsx
액션 타입(counter/CALL_API)
액션함수(callapi)
초기상태(initialState)
리듀서(saveApi)
combineReducers(리듀서 추가) useSelector, useDispatch 임포트

액션함수 임포트
useSelector((리듀서 객체) ⇒ 리듀서 객체.루트리듀서.가져올 속성)
dispatch = useDispatch();
dispatch(액션함수(매개변수))

 

 

부족한 점:

728x90