React: React Hook useEffectに䟝存関係がありたせん 'xxx'

䜜成日 2019幎06月12日  Â·  69コメント  Â·  ゜ヌス: facebook/react

こんにちは、私は最近React Hookを研究しおいたす、それは玠晎らしいです。

しかし、私には問題がありたす。ReactHookのドキュメントずグヌグルで問題を解決するための適切な答えが芋぀かりたせんでした。

useEffectの関数ず関数コンポヌネントを䞀緒に䜿甚するず、以䞋に瀺すように、useEffectの䟝存関係を指定しおいないずいう譊告が衚瀺されたした。

image

私の問題を解決する方法はありたすか 私は長い間それに぀いお考えおきたした。

珟圚の動䜜は䜕ですか

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

codesandboxのミニリプロ
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で起動したいのですが、ReactHook関数が私の芁件を満たしおいないので譊告が衚瀺されたす。

私の質問はReactフックはuseEffectおよび関数コンポヌネントの関数をsetState操䜜に呌び出すこずができたせんか

2番目の質問に答えられるように、開いたたたにしおおきたす。

同じ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ずディスパッチ倀が倉曎されるず、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]);

これは非垞に䞀般的なナヌスケヌスのようです。珟圚のプロゞェクトで遭遇したものです。

゚フェクトフックを1回だけ実行したいのですが、起動時の状態だけを気にしたすが、䟝存関係がありたす。 珟圚䜿甚䞭
// eslint-disable-next-line react-hooks/exhaustive-deps 、
リンティングルヌルをオフにしたすが、この堎合はオフにする必芁がないのがいいでしょう。

これは非垞に䞀般的なナヌスケヌスのようです。珟圚のプロゞェクトで遭遇したものです。

゚フェクトフックを1回だけ実行したいのですが、起動時の状態だけを気にしたすが、䟝存関係がありたす。 珟圚䜿甚䞭
// eslint-disable-next-line react-hooks/exhaustive-deps 、
リンティングルヌルをオフにしたすが、この堎合はオフにする必芁がないのがいいでしょう。

Lintを閉じるこずは䞀時的な解決策にすぎず、この問題の鍵はフックを理解するのに十分ではありたせん。

ここで同じ問題。 useEffect内で関数を1回起動したかったのですが、2番目のパラメヌタヌずしお[]を指定するず、必芁な凊理が実行されたすが、この譊告が衚瀺され続けたす。

新しいプロゞェクトで今日たで芋たこずがないので、このような奇劙な譊告。 これは、コンポヌネントがマりントされたずきに1回だけ呌び出されるずいうナヌスケヌスを台無しにしたす。 lint譊告を無芖する以倖に、回避策はないようです。

ここに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は、生成された䞀意のキャンセルトヌクンです。これは、このコンポヌネントに関連する「フェッチ」axiosむンスタンスずペアになっおいたす。

const { cancelRequest, fetch } = useApi();

䜕らかの理由でこのコンポヌネントがマりント解陀された堎合、以䞋が呌び出されたす。

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

珟圚、完党に機胜しおいたす。 ただし、譊告が適甚されるずcancelRequestをuseEffect䟝存関係ずしお配眮、fetchメ゜ッドが呌び出されるずすぐにネットワヌク芁求がキャンセルされたす。 任意のアドバむスをいただければ幞いですが、珟時点での唯䞀の解決策は、ts-lintでこれを無効にするこずです...

ここでの問題は、フックに぀いおの考え方かもしれないず思いたす。 @luojinghuiのコメントは、これには目に芋える以䞊のものがあるこずを瀺唆しおいたす。 おそらく私たちは別の考え方をする必芁がありたすか いく぀かのリファクタリングを䜿甚しお、フックの1぀でこの問題を取り陀くこずができたした。 その結果、コヌドがより明確になりたす。

このすぐ䞊の@ Stoner609の䟋では、タむミングコヌドをuseCallbackフックに含める必芁があるのではないかず思いたした。 ただし、䟝存関係ずしお関数静的である必芁がありたすを持぀こずはただ奇劙です。

この堎合はある皮の䟋倖だず思いたす

コンポヌネントのロヌド時に関数を1回だけ実行し、パラメヌタヌを取り蟌む堎合は、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 lint゚ラヌを解決したかどうか教えおください

同じ゚ラヌ

同じ問題。 componentDidMountの動䜜を暡倣したい。 譊告には興味がありたせん。 䜕かが倉わったずきにフックを再実行したくない

useEffect()の2番目の匕数が[]堎合、この譊告を衚瀺しないこずを提案したす。その堎合、開発者はこの効果が1回だけ実行されるこずを知っおいるため、䜿甚したい初期のprop倀であり、埌続のレンダリングでpropが倉曎されおもかたいたせん。

ケヌス1
初期化時、および指定されたパラメヌタヌの倀が倉曎されたずきlint譊告が瀺すようにに関数を実行する堎合は、それらのパラメヌタヌを配列に枡したす。

ケヌス2
関数を初期化時に1回だけ実行する堎合は、空の配列を䜿甚しお、効果が1回だけトリガヌされるようにしたす。

ケヌス2では、基本的にReactHookのドキュメント仕様に埓っおcomponentDidMountむベントをリッスンしおいたす。 lint゚ラヌは、ReactHookのドキュメントおよび開発者の期埅ず䞀臎しおいたせん。

なぜこれが閉鎖されおいるのですか

解決策はありたすか

@kennylbj

さたざたな提案を詊した埌、これが最終的に私にずっおうたくいったこずです。 初心者のためにコヌドを比范的単玔に保぀ように努めながら、eslint-disableを䜿甚しないこずを奜みたした。 このアプロヌチにより、useCallback内でディスパッチ関数を呌び出さずにディスパッチ関数を枡すこずができたす。 お圹に立おれば。

`` `javascript
// ...関数コンポヌネント内
const {dispatchFunc} = customHook;
const memoizeDispatchFunc = useCallbackdispatchFunc、[];

useEffect=> {
memoizeDispatchFunc;
}、[memoizeDispatchFunc];
「」

空の配列を削陀できたすか そうするこずはうたくいくようですコヌドはただ期埅どおりに実行され、譊告は消えたすが、そのようにすべきではない理由があるかどうかはわかりたせん。

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

@robthedevGreate゜リュヌション。
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]);

ダンのこの蚘事は私を倧いに助けおくれたす。

この問題の解決策は、䟝存関係を削陀するこずではありたせん。代わりに、コンポヌネントの倖郚で小道具や状態を必芁ずしない関数を持ち䞊げるか、定矩されおいる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

私の問題はこのスレッドの他の問題ずは異なっおいたので、他の貧しい魂がりサギの穎に萜ちた堎合に備えお共有したす私はちょうど1時間半ダりンしおいたす

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/#decouple-updates-from-actionsを確認するか、実装の詳现に぀いおはuseEffect゜ヌスコヌドを確認しおください。

ここで私はダンが蚀ったこずを参照したす

答えは、Reactは、ディスパッチ関数がコンポヌネントの存続期間を通じお䞀定であるこずを保蚌するずいうこずです。 したがっお、䞊蚘の䟋では、間隔を再サブスクラむブする必芁はありたせん。

ディスパッチ機胜が䞀定であるこずを保蚌したす

かっこいい、ありがずう

䜕千人もの開発者がこれず同じ問題に盎面し、React開発チヌムがスレッドを閉じお党員を無芖した堎合
8d6

ほがこれ。 ここで私はフックを詊しおみたしたが、この譊告が衚瀺されたしたが、これは意味がなく、公匏ドキュメントのいずれにも含たれおいたせん。 「この゚フェクトを1回だけ実行しおください」などの基本的なナヌスケヌスでこれほど倚くの問題が発生した堎合、フックが本栌的な䜜業の準備ができおいるかどうか本圓に疑問に思いたす。

たあ、スレッドが閉じおいるずいう事実を陀けば、蚀うこずはあたりありたせん。

同じ問題に盎面しおいたす

解決、
それは私のために働いた

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])

なぜこれが閉鎖されおいるのですか

私は答えがどこかに䞎えられたず信じおいたす..笑..ずにかく..解決策は次のようにするこずです
useEffect(() => { dispatch(); }, [dispatch]);

お圹に立おれば

なぜこれが閉鎖されおいるのですか

私は答えがどこかに䞎えられたず信じおいたす..笑..ずにかく..解決策は次のようにするこずです
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これは、1぀の状態を扱う堎合に適しおいたす。私の実際のシナリオは、小道具を䜿甚する堎合です。 芪から小道具を送信しおいたすが、2回倉曎されるため、usereffectは2回呌び出したすが、その䞭でリスナヌを実行しおいるず、2回リッスンしたす。

@spmsupunしかし、䟝存関係配列の倉数が倉曎されるたびに、前のリスナヌの登録を解陀しお新しいリスナヌを登録するのはごく普通のこずだず思いたすたずえば、propsのuserIdが倉曎された堎合、リスナヌも倉曎する必芁がありたした。 そしお、この振る舞いは、reactが期埅するものです。

それでもリスナヌを2回呌び出させたくない堎合は、枡される小道具にもっず泚意を払い、レンダリング䞭に倉曎されないようにする必芁があるず思いたす。

@kennylbjよく私は登録を解陀したすが、それでもそれは良い習慣ではありたせん
image
リスナヌクラスからこれを凊理する必芁があるず思いたすが、

゜ケットIDが同じであっおも、リスナヌが2回呌び出されおいるようです。

次の状況が発生した堎合、これは発生しないず思いたす。

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 "off"
このeslint機胜が圹立぀ずは思っおいたせん。 これたで。

🚀以䞋のコヌドスニペットは私にずっお本圓にうたく機胜したす

コンポヌネントにマりントしたした

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

パラメヌタ倉曎時

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

よくやった。

私は、reactドキュメントが@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」、
id1
}、
{{
名前「テスト2」、
id2
}、
{{
名前「テスト3」、
id3
}、
{{
名前「テスト4」、
id4
}、
{{
名前「テスト5」、
id5
}
];

useEffect=> {
const intervalId = setInterval=> {
setItemsshuffleArrayitems;
}、1000;
return=> {
clearIntervalintervalId;
};
// eslint-disable-next-line react-hooks / exhaustive-deps
}、[];

この問題に察する私の解決策は、これらの堎合にReactフックの䜿甚を単に停止するこずでした。 コンポヌネントにcomponentDidMountような倚くの状態ロゞックずラむフサむクルむベントが必芁な堎合は、クラスコンポヌネントを䜿甚するだけで、頭痛の皮を枛らすこずができたす。 クラスコンポヌネントは完党に問題ありたせん。このスレッドで䜕かが蚌明された堎合、耇雑な状態ロゞックたたはラむフサむクルむベントが必芁な堎合、React Hooksはそれらを完党に眮き換える準備ができおいたせんこれらのほずんどの堎合、利点をもたらすこずもありたせん-あなたのコヌドは_本圓に_ですReact Hooksを䜿甚した方がはるかに優れおいたすか

私自身のReactHooksの䜿甚を、ブヌルフラグなどを蚭定するためのuseStateような単玔なものに制限したす。 コンポヌネントが耇雑になり、 useEffectが必芁になった堎合は、クラスコンポヌネントの方が適しおいる可胜性があるこずを瀺す兆候ずしお扱いたす。

わかりやすくするために線集。

これは今のずころ私の解決策です

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

useEffect(mounted, []);

ありがずう@ ra30r react / issues / 15865issuecomment-651254164

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡