React: React Hook useEffect에 쒅속성이 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 'xxx' ?

에 λ§Œλ“  2019λ…„ 06μ›” 12일  Β·  69μ½”λ©˜νŠΈ  Β·  좜처: facebook/react

μ•ˆλ…•ν•˜μ„Έμš”, 졜근 React Hook을 μ—°κ΅¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν›Œλ₯­ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. React Hook μ„€λͺ…μ„œμ™€ Googleμ—μ„œ λ‚΄ 문제λ₯Ό ν•΄κ²°ν•  μ μ ˆν•œ 닡변을 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

useEffect의 ν•¨μˆ˜μ™€ ν•¨μˆ˜ ꡬ성 μš”μ†Œλ₯Ό ν•¨κ»˜ μ‚¬μš©ν–ˆμ„ λ•Œ μ•„λž˜μ™€ 같이 useEffect에 쒅속성을 μ§€μ •ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” κ²½κ³ κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

image

λ‚΄ 문제λ₯Ό ν•΄κ²°ν•  방법이 μžˆμŠ΅λ‹ˆκΉŒ? λ‚˜λŠ” μ˜€λž«λ™μ•ˆ 그것에 λŒ€ν•΄ 생각해 μ™”λ‹€.

ν˜„μž¬ 행동은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

React Hook useEffect has a missing dependency: 'setCenterPosition'. Either include it or remove the dependency array. (react-hooks/exhaustive-deps)

μ½”λ“œμƒŒλ“œλ°•μŠ€μ˜ λ―Έλ‹ˆ μž¬ν˜„:
https://codesandbox.io/s/trusting-kowalevski-oet4b

μ–΄λ–€ μ†”λ£¨μ…˜μ΄λ“  κ°μ‚¬ν•©λ‹ˆλ‹€.

μ•”ν˜Έ

function App() {
  const [elePositionArr, setElePositionArr] = useState([
    { left: 0, top: 0 },
    { left: 0, top: 0 },
    { left: 0, top: 0 }
  ]);
  const stageRef = useRef(null);
  const Stage = useRef({ w: 0, h: 0 });
  const currentIndex = useRef(0);

  useEffect(() => {
    // Record the size of the stage
    const stageW = stageRef.current.scrollWidth;
    const stageH = stageRef.current.scrollHeight;

    Stage.current = { w: stageW, h: stageH };

    const index = Math.floor(Math.random() * 3);
    currentIndex.current = index;
    setCenterPosition(index);
  }, []);

  // Centering a block element
  function setCenterPosition(index) {
    let cacheEle = elePositionArr;
    // calc center postion
    const centerOfLeft = Stage.current.w / 2 - 25;
    const centerOfTop = Stage.current.h / 2 - 25;

    cacheEle = cacheEle.map((item, i) => {
      const randomWNum = Math.floor(Math.random() * Stage.current.w) - 50;
      const randomHNum = Math.floor(Math.random() * Stage.current.h) - 50;
      const randomLeft = randomWNum <= 50 ? 50 : randomWNum;
      const randomTop = randomHNum <= 50 ? 50 : randomHNum;
      let newItem;

      if (index === i) {
        newItem = { left: centerOfLeft, top: centerOfTop };
      } else {
        newItem = { left: randomLeft, top: randomTop };
      }

      return newItem;
    });

    setElePositionArr(cacheEle);
  }

  function handleClickLi(index) {
    if (currentIndex.current !== index) {
      setCenterPosition(index);
      currentIndex.current = index;
    }
  }

  return (
    <div className="container">
      <div className="stage" ref={stageRef}>
        {elePositionArr.map((item, index) => (
          <div className="ele" key={index} style={item}>
            {index}
          </div>
        ))}
      </div>
      <ul className="nav">
        {elePositionArr.map((item, index) => (
          <li
            className={currentIndex.current === index ? "active-li" : ""}
            onClick={() => {
              handleClickLi(index);
            }}
            key={"li" + index}
          >
            {index}
          </li>
        ))}
      </ul>
    </div>
  );
}

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

수천 λͺ…μ˜ κ°œλ°œμžκ°€ λ™μΌν•œ λ¬Έμ œμ— μ§λ©΄ν•˜κ³  React 개발 νŒ€μ΄ μŠ€λ ˆλ“œλ₯Ό λ‹«κ³  λͺ¨λ“  μ‚¬λžŒμ„ λ¬΄μ‹œν•  λ•Œ:
8d6

λͺ¨λ“  69 λŒ“κΈ€

λ‹€μŒ μ§ˆλ¬Έμ— λ‹΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

https://reactjs.org/docs/hooks-faq.html#is -it-safe-to-omit-functions-from-the-list-of-dependencies

λ‹€μŒ μ§ˆλ¬Έμ— λ‹΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

https://reactjs.org/docs/hooks-faq.html#is -it-safe-to-omit-functions-from-the-list-of-dependencies

@gaearon
λ‚΄ 문제λ₯Ό ν•΄κ²°ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄ λ¬Έμ œκ°€ 더 νŠΉλ³„ν•©λ‹ˆλ‹€. λ‚΄ μ‹€ν–‰ functionsetElePositionArr이 componentDidMount 및 handleClickμ—μ„œ μ‹€ν–‰λ˜κΈ°λ₯Ό μ›ν•˜μ§€λ§Œ React Hook κΈ°λŠ₯이 λ‚΄ μš”κ΅¬ 사항을 μΆ©μ‘±ν•˜μ§€ μ•Šκ³  κ²½κ³ κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

λ‚΄ μ§ˆλ¬Έμ€ : React Hook은 useEffect의 ν•¨μˆ˜μ™€ setState μž‘μ—…μ— λŒ€ν•œ ν•¨μˆ˜ ꡬ성 μš”μ†Œλ₯Ό ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆκΉŒ?

두 번째 μ§ˆλ¬Έμ— λ‹΅ν•  수 μžˆλ„λ‘ μ—΄μ–΄ λ‘‘λ‹ˆλ‹€.

λ™μΌν•œ ESLint κ²½κ³ κ°€ ν‘œμ‹œλ˜μ§€λ§Œ 제 κ²½μš°μ—λŠ” ꡬ성 μš”μ†Œκ°€ 마운트될 λ•Œ 비동기 ν˜ΈμΆœμ„ ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

const ManageTagsModalBody: React.FC<IProps> = ({ children, getTags }) => {
  useEffect(() => {
    getTags();
  }, []);

  return <div>{children}</div>;
};
Line 12:  React Hook useEffect has a missing dependency: 'getTags'. Either include it or remove the dependency array. If 'getTags' changes too often, find the parent component that defines it and wrap that definition in useCallback  react-hooks/exhaustive-deps 

ManageTagsModalBody λŠ” 데이터에 μ˜μ‘΄ν•˜μ§€ μ•ŠμœΌλ©° ꡬ성 μš”μ†Œκ°€ λ Œλ”λ§λ  λ•Œλ§ˆλ‹€ 데이터λ₯Ό λ‘œλ“œν•˜λŠ” 래퍼둜만 μ‚¬μš©λ©λ‹ˆλ‹€. children ꡬ성 μš”μ†Œκ°€ getTags κ°€ κ°€μ Έμ˜¨ 데이터λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λŠ” 점은 μ£Όλͺ©ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

쒅속성 λͺ©λ‘μ— 무엇을 μΆ”κ°€ν•΄μ•Ό 할지 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μ„€λͺ…도 κΆκΈˆν•©λ‹ˆλ‹€.
React Hook useEffect에 λˆ„λ½λœ 쒅속성: 'dispatch'κ°€ μžˆμŠ΅λ‹ˆλ‹€.

  useEffect(() => {
    axios.get('http://localhost:8000/api/future-registrations')
      .then((result) => {
        dispatch(initRegistrationsAction(result.data));
      });
  }, []);

λ™μΌν•œ λ¬Έμ œκ°€ 여기에 μžˆμŠ΅λ‹ˆλ‹€. μ΄μƒν•œ κ·œμΉ™.

여기도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. https://github.com/facebook/react/issues/15865#issuecomment -506503377μ—μ„œμ™€ 같이 κ°„λ‹¨ν•©λ‹ˆλ‹€.

  useEffect(() => {
    dispatch(fetchPosts());
  }, []);

이 κ²½κ³ λ₯Ό μ–΅μ œν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

κ²½κ³  λ©”μ‹œμ§€μ—μ„œ μ œμ•ˆν•œ λŒ€λ‘œ λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const initFetch = useCallback(() => {
    dispatch(fetchPosts());
  }, [dispatch]);

  useEffect(() => {
    initFetch();
  }, [initFetch]);

@fayway 그러면 initFetch 및 dispatch 값이 변경될 λ•Œλ§ˆλ‹€ useEffect의 콜백이 μ‹€ν–‰λ©λ‹ˆλ‹€.
κ·ΈλŠ” ν•œ 번 μ½œλ°±μ„ μ‹€ν–‰ν•˜κ³  μ‹Άμ–΄

@shkyung 제 경우 initFetch λŠ” 원인(μ €μž₯μ†Œ)을 λ³€κ²½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. νŒŒκ²¬λ„ λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ–΄μ©Œλ©΄ μ΄λ ‡κ²Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€

const setCenterPosition = useRef(null)
setCenterPosition.current = useCallback( ()=>{} ,[deps])

effect(()=>{ setCenterPosition.current() },[setCenterPosition,otherDeps])

이 λ³€ν™”λŠ” λ‹€μ†Œ 우슀꽝슀럽고 μ†”μ§νžˆ λ§ν•΄μ„œ μ—­νš¨κ³Όλ₯Ό λ‚³λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. 였히렀 이전 λ²„μ „μœΌλ‘œ λ‘€λ°±ν•˜κ³  이 λ¬Έμ œμ— λŒ€ν•΄ μƒκ°ν•˜κ²Œ ν•˜μ‹­μ‹œμ˜€.

같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. componentDidMountμ—μ„œλ§Œ λ‚΄ κ°€μ Έμ˜€κΈ°κ°€ μ‹€ν–‰λ˜κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€. 배열에 쒅속성을 μΆ”κ°€ν•˜λ©΄ 끝점에 반볡적으둜 λ„λ‹¬ν•˜κ²Œ λ©λ‹ˆλ‹€.

React Hook useEffect에 λˆ„λ½λœ 쒅속성: 'dispatch'κ°€ μžˆμŠ΅λ‹ˆλ‹€.

const [state, dispatch] = useReducer(reducer, initialState);
const { count, step } = state;

useEffect(() => {
  const id = setInterval(() => {
    dispatch({ type: 'tick' }); // Instead of setCount(c => c + step);
  }, 1000);
  return () => clearInterval(id);
}, [dispatch]);

이것은 맀우 일반적인 μ‚¬μš© 사둀인 것 κ°™μŠ΅λ‹ˆλ‹€. ν˜„μž¬ ν”„λ‘œμ νŠΈμ—μ„œ κ²ͺμ—ˆλ˜ κ²ƒμž…λ‹ˆλ‹€.

효과 후크λ₯Ό ν•œ 번만 μ‹€ν–‰ν•˜κ³  μ‹Άμ§€λ§Œ μ‹œμž‘ μ‹œ μƒνƒœμ—λ§Œ 관심이 μžˆμ§€λ§Œ 쒅속성이 μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ μ‚¬μš© 쀑
// eslint-disable-next-line react-hooks/exhaustive-deps ,
Linting κ·œμΉ™μ„ 끄렀면 이 κ²½μš°μ—λŠ” 끄지 μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

이것은 맀우 일반적인 μ‚¬μš© 사둀인 것 κ°™μŠ΅λ‹ˆλ‹€. ν˜„μž¬ ν”„λ‘œμ νŠΈμ—μ„œ κ²ͺμ—ˆλ˜ κ²ƒμž…λ‹ˆλ‹€.

효과 후크λ₯Ό ν•œ 번만 μ‹€ν–‰ν•˜κ³  μ‹Άμ§€λ§Œ μ‹œμž‘ μ‹œ μƒνƒœμ—λ§Œ 관심이 μžˆμ§€λ§Œ 쒅속성이 μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ μ‚¬μš© 쀑
// eslint-disable-next-line react-hooks/exhaustive-deps ,
Linting κ·œμΉ™μ„ 끄렀면 이 κ²½μš°μ—λŠ” 끄지 μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

Lintλ₯Ό λ‹«λŠ” 것은 μž„μ‹œ 해결책일 뿐이며 이 문제의 핡심은 후크λ₯Ό μ΄ν•΄ν•˜λŠ” 데 μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ™μΌν•œ λ¬Έμ œκ°€ 여기에 μžˆμŠ΅λ‹ˆλ‹€. useEffect() λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜λ₯Ό ν•œ 번 μ‹€ν–‰ν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. 두 번째 λ§€κ°œλ³€μˆ˜λ‘œ []λ₯Ό μ‚¬μš©ν•˜λ©΄ μ›ν•˜λŠ” λŒ€λ‘œ μˆ˜ν–‰λ˜μ§€λ§Œ 계속 이 κ²½κ³ κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

μ˜€λŠ˜κΉŒμ§€ μƒˆ ν”„λ‘œμ νŠΈμ—μ„œ λ³Έ 적이 μ—†κΈ° λ•Œλ¬Έμ— μ΄μƒν•œ κ²½κ³ μž…λ‹ˆλ‹€. ꡬ성 μš”μ†Œκ°€ λ§ˆμš΄νŠΈλ˜μ—ˆμ„ λ•Œ ν•œ 번만 ν˜ΈμΆœλ˜λŠ” μ‚¬μš© 사둀λ₯Ό λ§μΉ©λ‹ˆλ‹€. 보푸라기 κ²½κ³ λ₯Ό λ¬΄μ‹œν•˜λŠ” 것 μ™Έμ—λŠ” ν•΄κ²° 방법이 μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

여기에 λ‚΄ 2μ„ΌνŠΈλ₯Ό λ„£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 특히 Axiosλ₯Ό μ‚¬μš©ν•˜μ—¬ λ„€νŠΈμ›Œν¬ μš”μ²­μ„ μ·¨μ†Œν•˜λŠ” 경우. ν•„μš”ν•œ 경우 λ³„λ„μ˜ 문제λ₯Ό λ§Œλ“€μ§€λ§Œ 이 λ¬Έμ œκ°€ λ‚˜ μžμ‹ μ—κ²Œ 직접적인 영ν–₯을 λ―Έμ³€λ‹€κ³  λŠκΌˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚΄ useApi ν›„ν¬λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€ -

import axios, { AxiosInstance } from "axios";
import axiosRetry from "axios-retry";
import { FetchEnv } from "../../utilities";
import { useStorage } from "../useStorage";

export const useApi = ({ isAuth = false, retries = 3 } = {}) => {
  const cancelToken = axios.CancelToken.source();
  const { getItem } = useStorage();

  const getBaseUrl = () => {
    return FetchEnv({
      defaultValue: "http://api.example.com",
      key: "API_URI"
    });
  };

  const authorizedClient = (client: AxiosInstance) => {
    const session = getItem("SESSION", "sessionStorage");
    const hasAccessToken = Boolean(session.tokens.accessToken);

    if (isAuth && !hasAccessToken) {
      console.error("No access token found to initiate authorized request.");
      return client;
    } else {
      client.defaults.headers[
        "Authorization"
      ] = `Bearer ${session.tokens.accessToken}`;
      return client;
    }
  };

  const buildFetch = (): AxiosInstance => {
    const client = axios.create({
      baseURL: getBaseUrl(),
      cancelToken: cancelToken.token
    });
    axiosRetry(client, { retries });
    return isAuth ? authorizedClient(client) : client;
  };

  return {
    cancelRequest: cancelToken.cancel,
    fetch: buildFetch()
  };
};

ꡬ성 μš”μ†Œ λ‚΄μ—μ„œ 이 후크λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 μ •μ˜ν•˜λ©΄ λ©λ‹ˆλ‹€. 그러면 마운트 μ‹œ, useEffect λ‚΄μ—μ„œ, 이벀트 ν•Έλ“€λŸ¬μ˜ μΌλΆ€λ‘œ 인증된 호좜과 μΈμ¦λ˜μ§€ μ•Šμ€ ν˜ΈμΆœμ„ λͺ¨λ‘ μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. cancelRequestλŠ” μƒμ„±λœ 고유 μ·¨μ†Œ ν† ν°μž…λ‹ˆλ‹€. 이 ꡬ성 μš”μ†Œμ™€ κ΄€λ ¨λœ "fetch" axios μΈμŠ€ν„΄μŠ€μ™€ μŒμ„ μ΄λ£Ήλ‹ˆλ‹€.

const { cancelRequest, fetch } = useApi();

μ–΄λ–€ μ΄μœ λ‘œλ“  이 ꡬ성 μš”μ†Œκ°€ 마운트 ν•΄μ œλ˜λ©΄ λ‹€μŒμ΄ ν˜ΈμΆœλ©λ‹ˆλ‹€.

  useEffect(() => {
    return () => {
      cancelRequest("Auth network request cancelled");
    };
  }, []);

이제 ν˜„μž¬ μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ²½κ³ κ°€ 적용되면(cancelRequestλ₯Ό useEffect μ’…μ†μ„±μœΌλ‘œ μ„€μ •) fetch λ©”μ„œλ“œκ°€ 호좜될 λ•Œ λ„€νŠΈμ›Œν¬ μš”μ²­μ„ μ¦‰μ‹œ μ·¨μ†Œν•©λ‹ˆλ‹€. 쑰언을 μ£Όμ‹œλ©΄ λŒ€λ‹¨νžˆ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν˜„μž¬λ‘œμ„œλŠ” ts-lintκ°€ 이λ₯Ό λΉ„ν™œμ„±ν™”ν•˜λŠ” 것이 μœ μΌν•œ 해결책인 것 κ°™μŠ΅λ‹ˆλ‹€...

λ‚˜λŠ” μ—¬κΈ°μ„œ λ¬Έμ œκ°€ μš°λ¦¬κ°€ 후크에 λŒ€ν•΄ μƒκ°ν•˜λŠ” 방식 일 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. @luojinghui 의 의견 은 λˆˆμ— λ³΄μ΄λŠ” 것보닀 더 λ§Žμ€ 것이 μžˆμŒμ„ μ‹œμ‚¬ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” λ‹€λ₯΄κ²Œ 생각해야 ν•˜μ§€ μ•Šμ„κΉŒμš”? 일뢀 λ¦¬νŒ©ν† λ§μœΌλ‘œ 후크 쀑 ν•˜λ‚˜μ—μ„œ 이 문제λ₯Ό μ œκ±°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 결과적으둜 μ½”λ“œκ°€ 더 λͺ…ν™•ν•΄μ§‘λ‹ˆλ‹€.

λ°”λ‘œ μœ„μ˜ @Stoner609 의 예 μ—μ„œ 타이밍 μ½”λ“œκ°€ useCallback 후크에 μžˆμ–΄μ•Ό ν•˜λŠ”μ§€ κΆκΈˆν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ μ’…μ†μ„±μœΌλ‘œ κΈ°λŠ₯(정적이어야 함)을 κ°–λŠ” 것은 μ—¬μ „νžˆ β€‹β€‹μ΄μƒν•©λ‹ˆλ‹€.

이 κ²½μš°λŠ” μΌμ’…μ˜ μ˜ˆμ™Έκ°€ λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€

ꡬ성 μš”μ†Œκ°€ λ‘œλ“œλ˜κ³  맀개 λ³€μˆ˜λ₯Ό λ°›λŠ” ν•¨μˆ˜λ₯Ό ν•œ 번만 μ‹€ν–‰ν•˜λ €λŠ” 경우 useRefλ₯Ό μ‚¬μš©ν•˜μ—¬ κ²½κ³ λ₯Ό ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 μž‘λ™ν•©λ‹ˆλ‹€.

  const InitialPropA= useRef(propA);
  useEffect(() => {
    myFunction(InitialPropA.current);
  }, [myFunction, InitialPropA]);

κ²½κ³  λ©”μ‹œμ§€μ—μ„œ μ œμ•ˆν•œ λŒ€λ‘œ λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const initFetch = useCallback(() => {
    dispatch(fetchPosts());
  }, [dispatch]);

  useEffect(() => {
    initFetch();
  }, [initFetch]);

λ‚΄κ°€ 이 재치 μžˆλŠ” λŒ€λ‹΅μ„ μ’‹μ•„ν•˜λŠ” 만큼 이것은 일반적으둜 λ‚΄ μ½”λ“œμ—μ„œ μΌμ–΄λ‚˜λŠ” μΌμž…λ‹ˆλ‹€.
λ””μŠ€νŒ¨μΉ˜κ°€ μ‚¬λΌμ§„λ‹€λŠ” μ„±κ°€μ‹  κ²½κ³ λ₯Ό λ°›κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” κ·Έ λ―ΈμŠ€ν„°λ¦¬μ˜ λ°°μ—΄μ—μ„œ 무슨 일이 μ™œ μΌμ–΄λ‚˜λŠ”μ§€ μ •ν™•νžˆ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€. :)

κ²½κ³  λ©”μ‹œμ§€μ—μ„œ μ œμ•ˆν•œ λŒ€λ‘œ λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const initFetch = useCallback(() => {
    dispatch(fetchPosts());
  }, [dispatch]);

  useEffect(() => {
    initFetch();
  }, [initFetch]);

이것은 λ˜ν•œ API와 같은 κ²½μš°μ— λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 생성할 수 있으며, λ¬΄ν•œ λ£¨ν”„μ—μ„œ ν˜ΈμΆœμ„ λ§Œλ“€ κ²ƒμž…λ‹ˆλ‹€.

정말 이것에 λŒ€ν•œ μˆ˜μ •μ΄ ν•„μš”ν•©λ‹ˆλ‹€. useEffect() λ‚΄λΆ€μ˜ ν•¨μˆ˜λ₯Ό ν•œ 번만 μ‹€ν–‰ν•˜λ €λŠ” 경우 계속 였λ₯˜κ°€ λ°œμƒν•˜κ³  ν•΄κ²° 방법에 λŒ€ν•œ 아이디어가 μ—†μŠ΅λ‹ˆλ‹€.

같은 였λ₯˜μ— 직면 -

React Hook useEffect에 'props' 쒅속성이 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, "μ†Œν’ˆ"λ°”λžŒμ§ν•œ μˆ˜μ •μ΄ useEffect 콜의 "μ†Œν’ˆ"였브젝트 μ™ΈλΆ€ destructure 및 useEffect λ‚΄λΆ€ κ·Έ νŠΉμ • μ†Œν’ˆμ„ μ°Έμ‘°ν•˜λ―€λ‘œ μ–΄λ–€ μ†Œν’ˆ λ³€κ²½, λ°˜μ‘ - 후크 될 λ•Œ / μ „μˆ˜ deps을 λ°”κΏ€

μ½”λ“œ -

  useEffect(() => {
    props.dispatch(searchMediaAction("rain"));
  }, []);

@luojinghui : 보푸라기 였λ₯˜λ₯Ό ν•΄κ²°ν–ˆλ‹€λ©΄ μ•Œλ €μ£Όμ„Έμš”

같은 였λ₯˜

같은 문제. componentDidMount의 λ™μž‘μ„ λͺ¨λ°©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 경고에 관심이 μ—†μŠ΅λ‹ˆλ‹€. λ³€κ²½ 사항이 μžˆμ„ λ•Œ 후크λ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€.

useEffect() λŒ€ν•œ 두 번째 μΈμˆ˜κ°€ [] 인 경우 이 κ²½κ³ λ₯Ό ν‘œμ‹œ ν•˜μ§€ μ•Šμ„ 것을 μ œμ•ˆν•©λ‹ˆλ‹€. 이 경우 b/c κ°œλ°œμžλŠ” 이 νš¨κ³Όκ°€ ν•œ 번만 μ‹€ν–‰λ˜κ³  λ”°λΌμ„œ μ‚¬μš©ν•˜κΈ°λ₯Ό _μ›ν•©λ‹ˆλ‹€_ 초기 prop 값이며 후속 λ Œλ”λ§μ—μ„œ prop이 λ³€κ²½λ˜λŠ”μ§€ μ—¬λΆ€λŠ” μ‹ κ²½ 쓰지 μ•ŠμŠ΅λ‹ˆλ‹€.

사둀 1:
μ΄ˆκΈ°ν™” μ‹œμ™€ μ§€μ •λœ λ§€κ°œλ³€μˆ˜ 값이 변경될 λ•Œ(lint κ²½κ³ μ—μ„œ μ•Œ 수 μžˆλ“―μ΄) ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜λ₯Ό 배열에 μ „λ‹¬ν•©λ‹ˆλ‹€.

사둀 2:
ν•¨μˆ˜κ°€ μ΄ˆκΈ°ν™” μ‹œ μ •ν™•νžˆ ν•œ 번 μ‹€ν–‰λ˜λ„λ‘ ν•˜λ €λ©΄ 빈 배열을 μ‚¬μš©ν•˜μ—¬ νš¨κ³Όκ°€ ν•œ 번만 νŠΈλ¦¬κ±°λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

Case 2μ—μ„œλŠ” 기본적으둜 React Hook λ¬Έμ„œ 사양에 따라 componentDidMount 이벀트λ₯Ό μˆ˜μ‹ ν•©λ‹ˆλ‹€. Lint 였λ₯˜λŠ” React Hook λ¬Έμ„œ 및 개발자 κΈ°λŒ€μΉ˜μ™€ μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이게 μ™œ λ‹«ν˜€μžˆλ‚˜μš”?

μ–΄λ–€ 해결책이 μžˆμŠ΅λ‹ˆκΉŒ?

@kennylbj

λ‹€μ–‘ν•œ μ œμ•ˆμ„ μ‹œλ„ν•œ ν›„ 이것이 ꢁ극적으둜 μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” eslint-disable을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것을 μ„ ν˜Έν–ˆμ§€λ§Œ μ΄ˆλ³΄μžμ—κ²ŒλŠ” μ½”λ“œλ₯Ό 비ꡐ적 κ°„λ‹¨ν•˜κ²Œ μœ μ§€ν•˜λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€. 이 μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λ©΄ useCallback λ‚΄λΆ€μ—μ„œ ν˜ΈμΆœν•˜μ§€ μ•Šκ³  λ””μŠ€νŒ¨μΉ˜ ν•¨μˆ˜λ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. 도움이 λ˜μ—ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

```μžλ°”μŠ€ν¬λ¦½νŠΈ
// ... ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€
const { dispatchFunc } = μ»€μŠ€ν…€ν›…();
const memoizeDispatchFunc = useCallback(dispatchFunc, []);

useEffect(() => {
λ©”λͺ¨ν™”λ””μŠ€νŒ¨μΉ˜νŽ‘ν¬();
}, [memoizeDispatchFunc]);
````

빈 배열을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? κ·Έλ ‡κ²Œ ν•˜λ©΄ μž‘λ™ν•˜λŠ” 것 κ°™μ§€λ§Œ(μ½”λ“œλŠ” μ—¬μ „νžˆ μ˜ˆμƒλŒ€λ‘œ μ‹€ν–‰λ˜κ³  κ²½κ³ λŠ” 사라짐) κ·Έλ ‡κ²Œ ν•΄μ„œλŠ” μ•ˆ λ˜λŠ” μ΄μœ κ°€ μžˆλŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

useEffect(()=>{ myFunc(); } )

@robthedev ν›Œλ₯­ν•œ μ†”λ£¨μ…˜.
reduxλ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ₯Ό λ‹¨μˆœν™”ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

const dispatch = useDispatch();

// redux can guarantee that the dispatch function will not change between renders.
// so we don't need to wrap it with useCallback for now.
useEffect(() => {
  dispatch(actions());
}, [dispatch]);

Dan의 이 κΈ°μ‚¬λŠ” μ €μ—κ²Œ λ§Žμ€ 도움

이 λ¬Έμ œμ— λŒ€ν•œ 해결책은 쒅속성을 μ œκ±°ν•˜λŠ” 것이 μ•„λ‹ˆλΌ ꡬ성 μš”μ†Œ μ™ΈλΆ€μ—μ„œ props λ˜λŠ” stateκ°€ ν•„μš”ν•˜μ§€ μ•Šμ€ ν•¨μˆ˜λ₯Ό ν˜Έμ΄μŠ€νŠΈν•˜κ±°λ‚˜ μ •μ˜λœ useCallback으둜 λž˜ν•‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

@kennylbj

λ‹€μ–‘ν•œ μ œμ•ˆμ„ μ‹œλ„ν•œ ν›„ 이것이 ꢁ극적으둜 μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” eslint-disable을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것을 μ„ ν˜Έν–ˆμ§€λ§Œ μ΄ˆλ³΄μžμ—κ²ŒλŠ” μ½”λ“œλ₯Ό 비ꡐ적 κ°„λ‹¨ν•˜κ²Œ μœ μ§€ν•˜λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€. 이 μ ‘κ·Ό 방식을 μ‚¬μš©ν•˜λ©΄ useCallback λ‚΄λΆ€μ—μ„œ ν˜ΈμΆœν•˜μ§€ μ•Šκ³  λ””μŠ€νŒ¨μΉ˜ ν•¨μˆ˜λ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. 도움이 λ˜μ—ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

// ... inside function component
const { dispatchFunc } = customHook();
const memoizeDispatchFunc = useCallback(dispatchFunc, []);

useEffect(() => {
  memoizeDispatchFunc();
}, [memoizeDispatchFunc]);

λ‚˜μ™€ ν•¨κ»˜ μœ„μ˜ μ˜ˆλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
TypeError: Cannot destructure property 'dispatchFunc' of 'componentDidMount(...)' as it is undefined.

@react-team: ν–‰λ³΅ν•œ μƒμš©κ΅¬ μ½”λ“œ. :) 그것은 논리적이고 λ‹€μ‹œ 읽을 수 μžˆμŠ΅λ‹ˆκΉŒ... μ΄λ²€νŠΈλŠ” μ‚¬μš©ν•˜κΈ° 간단해야 ν•©λ‹ˆλ‹€... 단지 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄ 5쀄 μ΄μƒμ˜ 논리λ₯Ό μž‘μ„±ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ‚˜λ₯Ό μœ„ν•΄ λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ 였λ₯˜κ°€ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€.

  useEffect(() => {
    props.getTasks()
  }, [])

λ‚˜λŠ” 이것을 λ‹€μŒκ³Ό 같이 μˆ˜μ •ν–ˆλ‹€.

const { getTasks } = props
  useEffect(() => {
    getTasks()
  }, [getTasks])

수천 λͺ…μ˜ κ°œλ°œμžκ°€ λ™μΌν•œ λ¬Έμ œμ— μ§λ©΄ν•˜κ³  React 개발 νŒ€μ΄ μŠ€λ ˆλ“œλ₯Ό λ‹«κ³  λͺ¨λ“  μ‚¬λžŒμ„ λ¬΄μ‹œν•  λ•Œ:
8d6

λ‚΄ λ¬Έμ œλŠ” 이 μŠ€λ ˆλ“œμ˜ λ‹€λ₯Έ λ¬Έμ œμ™€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ λΆˆμŒν•œ 영혼이 토끼 ꡬ멍에 빠질 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ κ³΅μœ ν•˜κ² μŠ΅λ‹ˆλ‹€.

function hydrate( _state, _errors=false) {
    console.log('hydrate()');
    setState({...state,..._state});
    if(_errors){
        setErrors({...errors,..._errors});
    }
}

μ‚¬μš©μžλŠ” λ‹€μŒκ³Ό 같이 μƒνƒœλ₯Ό μˆ˜ν™”ν•˜κΈ° μœ„ν•΄ useEffect() 와 ν•¨κ»˜ 이것을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

useEffect(()=>{
    hydrate({
        name:'Garrett',
        email:'[email protected]',
        newsletter: 'yes'
    });
},[hydrate]); //unfortunately, this causes an infinite render, because hydrate will always change

κ·Έλž˜μ„œ 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‚΄ μˆ˜ν™”λ¬Ό ν•¨μˆ˜λ₯Ό useCallback() λž˜ν•‘ν•˜λ„λ‘ λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. 이제 λͺ¨λ“  λ Œλ”λ§ˆλ‹€ λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©°(λ‚΄ 생각에) 이것이 μ„±λŠ₯에 더 쒋을 κ²ƒμž…λ‹ˆλ‹€. λ‚΄ μ‚¬μš©μž 지정 ν›„ν¬μ—μ„œ λ°˜ν™˜λœ λͺ¨λ“  λ„μš°λ―Έ ν•¨μˆ˜μ— λŒ€ν•΄ 이것을 κ΅¬ν˜„ν•©λ‹ˆλ‹€.

const hydrate = useCallback(( _state, _errors=false )=> {
    console.log('hydrate()');
    setState({...state,..._state});
    if(_errors){
        setErrors({...errors,..._errors});
    }
},[]);

λˆ„κ°€ 이것이 사싀인지 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ? useCallback λŠ” λ Œλ”λ§μ—μ„œ hydrate κ°€ λ³€κ²½λ˜λŠ” 것을 λ°©μ§€ν•˜λ―€λ‘œ 더 λ‚˜μ€ μ„±λŠ₯을 μœ„ν•΄ μ΄λŸ¬ν•œ λͺ¨λ“  κΈ°λŠ₯을 useCallback 에 λž˜ν•‘ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. ?

redux can guarantee that the dispatch function will not change between renders.

당신은 그것에 λŒ€ν•΄ ν™•μ‹ ν•©λ‹ˆκΉŒ?
κ·Έλ ‡κ²Œ λ§ν•˜λŠ” λ¬Έμ„œμ— λ§ν¬ν•˜μ‹­μ‹œμ˜€.

μžμ„Έν•œ λ‚΄μš©μ€ https://overreacted.io/a-complete-guide-to-useeffect/#decoupling -updates-from-actionsλ₯Ό ν™•μΈν•˜κ±°λ‚˜ κ΅¬ν˜„ μ„ΈλΆ€ 사항은 useEffect μ†ŒμŠ€ μ½”λ“œ λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ—μ„œ Dan이 λ§ν•œ 것을 μ°Έμ‘°ν•©λ‹ˆλ‹€.

λŒ€λ‹΅μ€ Reactκ°€ λ””μŠ€νŒ¨μΉ˜ ν•¨μˆ˜κ°€ ꡬ성 μš”μ†Œ 수λͺ… λ‚΄λ‚΄ μΌμ •ν•˜λ„λ‘ 보μž₯ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ μœ„μ˜ μ˜ˆμ—μ„œλŠ” 간격을 λ‹€μ‹œ ꡬ독할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ””μŠ€νŒ¨μΉ˜ ν•¨μˆ˜κ°€ μΌμ •ν•˜λ„λ‘ 보μž₯

μΏ¨, κ³ λ§ˆμ›Œ!

수천 λͺ…μ˜ κ°œλ°œμžκ°€ λ™μΌν•œ λ¬Έμ œμ— μ§λ©΄ν•˜κ³  React 개발 νŒ€μ΄ μŠ€λ ˆλ“œλ₯Ό λ‹«κ³  λͺ¨λ“  μ‚¬λžŒμ„ λ¬΄μ‹œν•  λ•Œ:
8d6

거의 μ΄κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ 후크λ₯Ό μ‹œλ„ν•˜κ³  있으며 곡식 λ¬Έμ„œμ—μ„œ 닀루지 μ•Šκ³  μ˜λ―Έκ°€ μ—†λŠ” κ²½κ³ λ₯Ό λ°›μ•˜μŠ΅λ‹ˆλ‹€. "이 효과λ₯Ό ν•œ 번만 μ‹€ν–‰ν•˜μ‹­μ‹œμ˜€"와 같은 κΈ°λ³Έ μ‚¬μš© 사둀가 μ΄λ ‡κ²Œ λ§Žμ€ 문제λ₯Ό μΌμœΌν‚€λ©΄ 후크가 μ§„μ§€ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  μ€€λΉ„κ°€ λ˜μ—ˆλŠ”μ§€ 정말 κΆκΈˆν•©λ‹ˆλ‹€.

κΈ€μŽ„, μŠ€λ ˆλ“œκ°€ λ‹«ν˜€ μžˆλ‹€λŠ” 사싀을 μ œμ™Έν•˜κ³ λŠ” 그닀지 말할 것도 μ—†μŠ΅λ‹ˆλ‹€.

같은 λ¬Έμ œμ— 직면해 μžˆμŠ΅λ‹ˆλ‹€!

ν•΄κ²°μ±…,
(그것은 λ‚˜λ₯Ό μœ„ν•΄ μΌν–ˆμŠ΅λ‹ˆλ‹€):

const onInit = function(){ 
    console.log('initiated', Date.now());
}

useEffect(onInit, []);

린트 μͺ½μ—μ„œ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμœΌλ©΄ μ’‹κ² μ§€λ§Œ 이봐...

@ra30r 쒋은 ν•΄κ²° λ°©λ²•μ΄μ§€λ§Œ λΆ€μž‘μš©μ„ μΌμœΌν‚¬ 수 μžˆλŠ”μ§€ κΆκΈˆν•˜μ‹­λ‹ˆκΉŒ? :생각:

μ—¬μ „νžˆ 아무것도? πŸ˜”

Udemy의 κ³Όμ •μ—μ„œ 양식 μœ νš¨μ„± 검사 였λ₯˜λ₯Ό μœ λ°œν•˜λŠ” 방법을 배운 κ²½μš°κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

이것은 λˆ„λ½λœ 쒅속성 "λ””μŠ€νŒ¨μΉ˜"λ₯Ό νŠΈλ¦¬κ±°ν–ˆμ§€λ§Œ μ—¬μ „νžˆ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.

  useEffect(() => {
    if (state.business_name.value) {
      const delay = setTimeout(() => dispatch({ type: "businessNameAfterDelay" }), 1000)
      return () => clearTimeout(delay)
    }
  }, [state.business_name.value])

@ra30r 의 예제λ₯Ό μ‚¬μš©ν•˜μ—¬ 였λ₯˜λ₯Ό μ§€μš°κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같이 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.

  const businessNameAfterDelay = function () {
    if (state.business_name.value) {
      const delay = setTimeout(() => dispatch({ type: "businessNameAfterDelay" }), 1000)
      return () => clearTimeout(delay)
    }
  }

  useEffect(businessNameAfterDelay, [state.business_name.value])

이게 μ™œ λ‹«ν˜€μžˆλ‚˜μš”?

λ‚˜λŠ” λŒ€λ‹΅μ΄ μ–΄λ”˜κ°€μ— μ£Όμ–΄μ‘Œλ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€. lol.. μ–΄μ¨Œλ“ .. 해결책은 λ‹€μŒκ³Ό 같이 ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€:
useEffect(() => { dispatch(); }, [dispatch]);

도움이 λ˜μ—ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€!!

이게 μ™œ λ‹«ν˜€μžˆλ‚˜μš”?

λ‚˜λŠ” λŒ€λ‹΅μ΄ μ–΄λ”˜κ°€μ— μ£Όμ–΄μ‘Œλ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€. lol.. μ–΄μ¨Œλ“ .. 해결책은 λ‹€μŒκ³Ό 같이 ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€:
useEffect(() => { dispatch(); }, [dispatch]);

도움이 λ˜μ—ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€!!

예, κ·Έ ν•΄κ²° 방법이 μž‘λ™ν•©λ‹ˆλ‹€. @kennylbj λŠ” μ–Όλ§ˆ 전에 μ—¬κΈ°μ—μ„œ λ§ν–ˆμŠ΅λ‹ˆλ‹€.
λ¬Έμ œκ°€ μ’…λ£Œλœ μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? 여기에도 κ΄€λ ¨ 밈이 μžˆμŠ΅λ‹ˆλ‹€... xd

λ‚΄ λ¬Έμ œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€(μƒ˜ν”Œ μ½”λ“œ).

  const [userStatus, setUserStatus]: any = React.useState([]);
  const [userData, setUserData]: any = React.useState([]);

  useEffect(() => {
    setUserStatus(!userStatus);
    return () => {};
  }, [userData]);

λ”°λΌμ„œ μ½”λ“œμ—μ„œμ™€ 같이 userData λ³€κ²½ 사항이 μžˆμ„ λ•Œ userStatus 값을 λ³€κ²½ν•˜κ³  이 경우 userStatus 값을 ν™•μΈν•˜λ €λ©΄ deps에 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  const [userStatus, setUserStatus]: any = React.useState([]);
  const [userData, setUserData]: any = React.useState([]);

  useEffect(() => {
    setUserStatus(!userStatus);
    return () => {};
  }, [userData, userStatus]);

이 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” 끝이 μ—†λŠ” 루프가 λ©λ‹ˆλ‹€.

@spmsupun
useState의 콜백 μŠ€νƒ€μΌμ„ μ‚¬μš©ν•˜μ—¬ useEffect의 쒅속성 배열에 userStatus λ³€μˆ˜λ₯Ό λ„μž…ν•˜μ§€ μ•Šλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 useEffect(() => {
    setUserStatus(prevState => !prevState);
    return () => {};
  }, [userData]);

그리고 이것을 κΈ°λŠ₯ μ—…λ°μ΄νŠΈ 라고

μ†”λ£¨μ…˜ --> 쒅속성을 μœ„ν•΄ λ§ˆμ§€λ§‰μ— λ””μŠ€νŒ¨μΉ˜λ₯Ό β€‹β€‹μΆ”κ°€ν•˜μ‹­μ‹œμ˜€.
React Hook useEffect에 λˆ„λ½λœ 쒅속성: 'dispatch'κ°€ μžˆμŠ΅λ‹ˆλ‹€.

  useEffect(() => {
    axios.get('http://localhost:8000/api/future-registrations')
      .then((result) => {
        dispatch(initRegistrationsAction(result.data));
      });
**  }, [dispatch]);**

@kennylbj 이것은 ν•˜λ‚˜μ˜ μƒνƒœλ₯Ό λ‹€λ£° λ•Œ μ’‹μŠ΅λ‹ˆλ‹€. μ‹€μ œ μ‹œλ‚˜λ¦¬μ˜€λŠ” propsμž…λ‹ˆλ‹€. λ‚˜λŠ” λΆ€λͺ¨λ‘œλΆ€ν„° μ†Œν’ˆμ„ 보내고 있으며 두 번 λ³€κ²½λ˜μ–΄ usereffectκ°€ 두 번 ν˜ΈμΆœν•˜μ§€λ§Œ λ‚΄λΆ€μ—μ„œ λ¦¬μŠ€λ„ˆλ₯Ό μ‹€ν–‰ν•˜κ³  있으며 두 번 μˆ˜μ‹ ν•©λ‹ˆλ‹€.

@spmsupun ν•˜μ§€λ§Œ 이전 λ¦¬μŠ€λ„ˆμ˜ 등둝을 ν•΄μ œν•˜κ³  쒅속성 λ°°μ—΄μ˜ λ³€μˆ˜κ°€ 변경될 λ•Œλ§ˆλ‹€ μƒˆ λ¦¬μŠ€λ„ˆλ₯Ό λ“±λ‘ν•˜λŠ” 것은 맀우 정상적이라고 μƒκ°ν•©λ‹ˆλ‹€(예: props의 userIdκ°€ λ³€κ²½λ˜λ©΄ λ¦¬μŠ€λ„ˆλ„ λ³€κ²½λ˜μ–΄μ•Ό 함). 그리고 이 λ™μž‘μ€ λ°˜μ‘μ΄ κΈ°λŒ€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ—¬μ „νžˆ λ¦¬μŠ€λ„ˆλ₯Ό 두 번 ν˜ΈμΆœν•˜μ§€ μ•ŠμœΌλ €λ©΄ μ „λ‹¬λœ props에 더 신경을 써야 ν•˜κ³  λ Œλ”λ§ 쀑에 λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@kennylbj κΈ€μŽ„ 등둝을 μ·¨μ†Œν•˜μ§€λ§Œ μ—¬μ „νžˆ 쒋은 μŠ΅κ΄€μ€ μ•„λ‹™λ‹ˆλ‹€.
image
λ¦¬μŠ€λ„ˆ ν΄λž˜μŠ€μ—μ„œ μ²˜λ¦¬ν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ†ŒμΌ“ IDκ°€ 같더라도 λ¦¬μŠ€λ„ˆκ°€ 두 번 ν˜ΈμΆœλ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‹€μŒ 상황이 좩쑱되면 이것이 μΌμ–΄λ‚˜μ§€ μ•Šμ„ 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

ts // call useEffect if and only if sockeId changed. useEffect(() => { const unregister = register(socketId); return () => unregister(socketId); }, [socketId])

λ‹€λ₯Έ λ Œλ” 쀑에 λ³€κ²½λ˜μ–΄ 이 λ™μž‘μ„ μΌμœΌν‚€λŠ” 쒅속성 λ°°μ—΄μ˜ λ‹€λ₯Έ λ³€μˆ˜κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

예 3 쒅속성,ν•˜μ§€λ§Œ λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ μ•Œμ•„λƒ…λ‹ˆλ‹€.

ν”Όμ—”

κ²½κ³  λ©”μ‹œμ§€μ—μ„œ μ œμ•ˆν•œ λŒ€λ‘œ λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const initFetch = useCallback(() => {
    dispatch(fetchPosts());
  }, [dispatch]);

  useEffect(() => {
    initFetch();
  }, [initFetch]);

μ™€μš°, λΉ„εΈΈζ„Ÿθ°’δ½ πŸ™

πŸš€ μ•„λž˜ μ½”λ“œ μŠ€λ‹ˆνŽ«μ€ μ €μ—κ²Œ 정말 잘 λ§žμŠ΅λ‹ˆλ‹€.

ꡬ성 μš”μ†Œμ—μ„œ 마운트

const onInit = () => getUsers()
useEffect(onInit, [])

λ§€κ°œλ³€μˆ˜ λ³€κ²½ μ‹œ

const onInit = () => getUser(id)
useEffect(onInit, [id])

μ΅œμ„ μ˜ ν•΄κ²° 방법: react-hooks/exhaustive-deps: "꺼짐"
λ‚˜λŠ” 이 eslint κΈ°λŠ₯이 μœ μš©ν•˜λ‹€λŠ” 것을 κ²°μ½” λ°œκ²¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. 항상.

πŸš€ μ•„λž˜ μ½”λ“œ μŠ€λ‹ˆνŽ«μ€ μ €μ—κ²Œ 정말 잘 λ§žμŠ΅λ‹ˆλ‹€.

ꡬ성 μš”μ†Œμ—μ„œ 마운트

const onInit = () => getUsers()
useEffect(onInit, [])

λ§€κ°œλ³€μˆ˜ λ³€κ²½ μ‹œ

const onInit = () => getUser(id)
useEffect(onInit, [id])

잘 ν•˜μ…¨μ–΄μš”.

λ‚˜λŠ” λ°˜μ‘ λ¬Έμ„œκ°€ @luojinghui 의 μ‚¬μš© 사둀λ₯Ό μΆ©λΆ„νžˆ 닀루지 μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

주어진 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” μ—¬λŸ¬ 가지 방법이 μžˆμŠ΅λ‹ˆλ‹€. 예: setCenterPosition() . μƒνƒœ λ³€κ²½( useEffect λ₯Ό 톡해 연결됨), 클릭 ν•Έλ“€λŸ¬(직접 호좜) 등을 κ΄€μ°°ν•˜μ—¬ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜μ‘ λ¬Έμ„œ μ œμ•ˆ

이것이 일반적으둜 λ‚΄λΆ€ νš¨κ³Όμ— ν•„μš”ν•œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λ €λŠ” 이유

κ·ΈλŸ¬λ‚˜ 일반적으둜 μ‹€μ œ μ˜ˆμ œμ—μ„œλŠ” 클래슀 ꡬ성 μš”μ†Œ( this.setCenterPosition(...) )의 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œ 일반적으둜 ν•˜λŠ” κ²ƒμ²˜λŸΌ ν•¨μˆ˜λ₯Ό μž¬μ‚¬μš©ν•΄μ•Ό ν•˜λ©° 후크가 μ‹€μ œλ‘œ 전체 κΈ°λŠ₯에 μ ν•©ν•œμ§€ κΆκΈˆν•΄μ§€κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. λ³΅μž‘ν•œ ꡬ성 μš”μ†Œ.

μ‹€μ œλ‘œ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ μ•„λ§ˆλ„ 해결책은 useCallback

const setCenterPosition = useCallback(() => {
  ...
}, [Stage, elePositionArr, setElePositionArr]);

useEffect() => {
  ...
}, [stageRef, Stage, currentIndex, setCenterPosition]);

...ν•˜μ§€λ§Œ 그것은 λ‚˜μ—κ²Œ μ’€ λ”μ°ν•©λ‹ˆλ‹€. 그리고 더 κΉ¨λ—ν•œ 방법이 있기λ₯Ό λ°”λžλ‹ˆλ‹€. @gaearon 이 확인할 수 μžˆμ„κΉŒμš”?

같은 λ¬Έμ œμ— μ§λ©΄ν•˜μ—¬ useEffect // eslint-disable-next-line react-hooks/exhaustive-deps 끝에 이 쀄을 μ‚¬μš©ν•˜μ—¬ κ²½κ³  buλ₯Ό λΉ„ν™œμ„±ν™”ν•  수 μžˆμ§€λ§Œ μ‚¬μš©ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€.

μ—¬κΈ° λ‚΄ μ½”λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€

`const [items, setItems] = useState([
{
이름: "ν…ŒμŠ€νŠΈ 1",
아이디: 1
},
{
이름: "ν…ŒμŠ€νŠΈ 2",
아이디: 2
},
{
이름: "ν…ŒμŠ€νŠΈ 3",
아이디: 3
},
{
이름: "ν…ŒμŠ€νŠΈ 4",
아이디: 4
},
{
이름: "ν…ŒμŠ€νŠΈ 5",
아이디: 5
}
]);

useEffect(() => {
μƒμˆ˜ 간격 ID = setInterval(() => {
setItems(shuffleArray(ν•­λͺ©));
}, 1000);
λ°˜ν™˜() => {
clearInterval(intervalId);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

이 λ¬Έμ œμ— λŒ€ν•œ λ‚˜μ˜ 해결책은 μ΄λŸ¬ν•œ κ²½μš°μ— React Hooks μ‚¬μš©μ„ μ€‘λ‹¨ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. ꡬ성 μš”μ†Œμ— componentDidMount 와 같은 μƒνƒœ 논리 및 수λͺ… μ£ΌκΈ° μ΄λ²€νŠΈκ°€ 많이 ν•„μš”ν•œ 경우 클래슀 ꡬ성 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜κ³  두톡을 ν”Όν•˜μ‹­μ‹œμ˜€. 클래슀 ꡬ성 μš”μ†ŒλŠ” μ™„λ²½ν•˜κ³  이 μŠ€λ ˆλ“œκ°€ 증λͺ…ν•˜λŠ” 것이 μžˆλ‹€λ©΄ λ³΅μž‘ν•œ μƒνƒœ 논리 λ˜λŠ” 수λͺ… μ£ΌκΈ° μ΄λ²€νŠΈκ°€ ν•„μš”ν•  λ•Œ React Hooksκ°€ 이λ₯Ό μ™„μ „νžˆ λŒ€μ²΄ν•  μ€€λΉ„κ°€ λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. React Hooksλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 훨씬 λ‚«μŠ΅λ‹ˆκΉŒ?).

μ €λŠ” React Hooks의 μ‚¬μš©μ„ useState 와 같은 κ°„λ‹¨ν•œ κ²ƒμœΌλ‘œ μ œν•œν•˜μ—¬ λΆ€μšΈ ν”Œλž˜κ·Έμ™€ 같은 것을 μ„€μ •ν•©λ‹ˆλ‹€. ꡬ성 μš”μ†Œκ°€ useEffect κ°€ ν•„μš”ν•  만큼 λ³΅μž‘ν•΄μ§€λ©΄ 클래슀 ꡬ성 μš”μ†Œκ°€ 더 μ ν•©ν•˜λ‹€λŠ” μ‹ ν˜Έλ‘œ κ°„μ£Όν•©λ‹ˆλ‹€.

(λͺ…확성을 μœ„ν•΄ νŽΈμ§‘λ¨).

이것이 ν˜„μž¬ λ‚΄ μ†”λ£¨μ…˜μž…λ‹ˆλ‹€.

const mounted = () => {
  dispatch(something());
}

useEffect(mounted, []);

@ra30r react/issues/15865#issuecomment-651254164 κ°μ‚¬ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰