React에서 다른 Function Component에 있는 함수 호출: React Calling Function From Another Function Component

하스레·2022년 3월 26일
0

WeeklyBox에서 AfterBoxList에 있는 함수를 호출하는 방법은 없을까 찾아보다가

useImperativeHandle이라는 리액트 훅을 통해 가능한 방법을 찾았다.

Home의 자식은 WeeklyBoxList, AfterBoxList이고,

이중 WeeklyBoxList의 자식은 WeeklyBox이다.

요약하자면 다음과 같다.

Home.js

import React, {useRef} from "react";
import AfterBoxList from "../../components/Home/AfterBoxList";
import WeeklyBoxList from "../../components/Home/WeeklyBoxList";
import "./Home.css";

function Home() {
    const childRef = useRef(null);

    const refreshAfterBoxList = () => {
        childRef.current.getAfterBoxList();
    }

    return <div className = "home-layout">
            <div className = "home-layout__wrap">
                <div className = "home-layout__wrap__left">
                    <WeeklyBoxList 
                        refreshAfterBoxList = {refreshAfterBoxList}
                        />
                    <AfterBoxList 
                        ref = {childRef}
                        />
                </div>
            </div>
        </div>;
}

export default Home;

AfterBoxList.js

import React, { useImperativeHandle, useState, useEffect, forwardRef } from "react";
import axios from "axios";
import AfterBox from "./AfterBox";
import "./AfterBoxList.css";

export const AfterContext = React.createContext();

function AfterBoxList({accessToken, userId}, ref) {
   
   // 첫번째 방법
    useImperativeHandle(ref, () => ({
        getAfterBoxList
      }));

	// 두번째 방법
    // useImperativeHandle(ref, () => ({
    //     refreshAfterList: () => {
    //         getAfterBoxList();
    //     }
    //   }));

    async function getAfterBoxList() {
        // ...
    };

    return <div></div>;
}
export default forwardRef(AfterBoxList);

WeeklyBox.js

import React from "react";
import "./WeeklyBox.css";

function WeeklyBox({refreshAfterBoxList}) {
  
    const onClickCompleteBtn = () => {
        refreshAfterBoxList();
    }

    return <div className="weeklyBox">
    	...
	</div>;
}

export default WeeklyBox;

WeeklyBoxList에서는 Home에서 받은 함수를 그대로 자식인 WeeklyBox에 넘겨주었다.

profile
Software Developer

0개의 댓글