React: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдПрдХ рд▓рд╛рдкрддрд╛ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ: 'xxx'?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдЬреВрди 2019  ┬╖  69рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдирдорд╕реНрддреЗ, рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдкрд░ рд╢реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдкреНрд░рд▓реЗрдЦрди рдФрд░ Google рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдЙрддреНрддрд░ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рдЬрдм рдореИрдВрдиреЗ useEffect рдФрд░ function рдХреЙрдореНрдкреЛрдиреЗрдиреНрдЯ рдореЗрдВ рдПрдХ рд╕рд╛рде рдПрдХ рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХрд┐ рдореИрдВрдиреЗ 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>
  );
}

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЬрдм рд╣рдЬрд╛рд░реЛрдВ рджреЗрд╡ рдЗрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдПрдХреНрдЯ рджреЗрд╡ рдЯреАрдо рдзрд╛рдЧреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреА рд╣реИ рдФрд░ рд╕рднреА рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИ:
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
рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реБрдЖ, рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдореЗрд░рд╛ рд░рди рдлрдВрдХреНрд╢рдирд╕реЗрдЯрдПрд▓реЗрдкреЛрд╕рд┐рд╢рдирдЕрд░ рдШрдЯрдХрдбрд┐рдбрдорд╛рдЙрдВрдЯ рдФрд░ рд╣реИрдВрдбрд▓рдХреНрд▓рд┐рдХ рдкрд░ рдЖрдЧ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рд╣реИ: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рд╕реЗрдЯрд╕реНрдЯреЗрдЯ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИя╝Я

рдЦреБрд▓рд╛ рдЫреЛрдбрд╝рдирд╛ рддрд╛рдХрд┐ рд╣рдо рджреВрд╕рд░реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХреЗрдВред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА 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 рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХреНрдпрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред

рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдПрдХ рд▓рд╛рдкрддрд╛ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ: 'рдкреНрд░реЗрд╖рдг'ред

  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 рдФрд░ рдкреНрд░реЗрд╖рдг рдореВрд▓реНрдп рдмрджрд▓ рдЧрдпрд╛, рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд╣ рдПрдХ рдмрд╛рд░ рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ

@shkyung рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, initFetch рдХрд╛рд░рдг рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ (рд╕реНрдЯреЛрд░ред) рдкреНрд░реЗрд╖рдг рдпрд╛ рддреЛ рдирд╣реАрдВ рд╣реИ

рд╢рд╛рдпрдж рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

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

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

рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдереЛрдбрд╝рд╛ рдмреЗрддреБрдХрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐-рдЙрддреНрдкрд╛рджрдХ рд▓рдЧрддрд╛ рд╣реИред рдмрд▓реНрдХрд┐ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд░реЛрд▓рдмреИрдХ рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рджреЗрдВред

рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд╣реЛред рдореИрдВ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХрдбрд┐рдорд╛рдЙрдВрдЯ рдкрд░ рдЖрдЧ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕рд░рдгреА рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдкрд░ рд╣рд┐рдЯ рд╣реЛрддреА рд╣реИред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдПрдХ рд▓рд╛рдкрддрд╛ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ: 'рдкреНрд░реЗрд╖рдг'ред

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 ,
рд▓рд╛рдЗрдирд┐рдВрдЧ рдирд┐рдпрдо рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ - рдПрдХ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЪрд▓рд╛рдпрд╛ рд╣реИред

рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдПрдХ рдкреНрд░рднрд╛рд╡ рд╣реБрдХ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
// eslint-disable-next-line react-hooks/exhaustive-deps ,
рд▓рд╛рдЗрдирд┐рдВрдЧ рдирд┐рдпрдо рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдХреНрд▓реЛрдЬрд┐рдВрдЧ рд▓рд┐рдВрдЯ рд╕рд┐рд░реНрдл рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдХреБрдВрдЬреА рд╣реБрдХ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдБ рд╡рд╣реА рдореБрджреНрджрд╛ред рдореИрдВ рд╕рд┐рд░реНрдл useEffect() рдХреЗ рдЕрдВрджрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдЧ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, [] рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд░рд╣рддрд╛ рд╣реИред

рдРрд╕реА рдЕрдЬреАрдм рдЪреЗрддрд╛рд╡рдиреА рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдЬ рддрдХ рдХрд┐рд╕реА рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдкрд╣рд▓реЗ рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛ред рдпрд╣ рдШрдЯрдХ рдХреЗ рдорд╛рдЙрдВрдЯ рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреБрдЫ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрддрд╛ рд╣реИред рд▓рд┐рдВрдЯ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдХрд╛рдордХрд╛рдЬ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣рд╛рдВ рдЕрдкрдиреЗ рджреЛ рд╕реЗрдВрдЯ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рдеред рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рд▓рдЧрд╛ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдиреЗ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдЦреБрдж рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рддреЛ рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдПрдкреАрдЖрдИ рд╣реБрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ -

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()
  };
};

рдПрдХ рдШрдЯрдХ рдХреЗ рднреАрддрд░ рдЗрд╕ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕реЗ рдиреАрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдЙрдВрдЯ рдкрд░, рдЙрдкрдпреЛрдЧ рдХреЗ рднреАрддрд░, рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдЖрджрд┐ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдорд╛рдгрд┐рдд рдФрд░ рдЕрдирдзрд┐рдХреГрдд рдХреЙрд▓ рджреЛрдиреЛрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдЕрджреНрд╡рд┐рддреАрдп рд░рджреНрдж рдЯреЛрдХрди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдШрдЯрдХ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ "рд▓рд╛рдиреЗ" axios рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

const { cancelRequest, fetch } = useApi();

рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдШрдЯрдХ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

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

рдЕрдм рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреЗрддрд╛рд╡рдиреА, рдЬрдм рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИ (рдХреИрдВрд╕рд▓ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЛ рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реБрдП) рддреБрд░рдВрдд рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬрдм рдлрд╝реЗрдЪ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╕рд▓рд╛рд╣ рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ рдХрд┐ рдЯреАрдПрд╕-рд▓рд┐рдВрдЯ рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрдЧрд╛ ...

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдореБрджреНрджрд╛ рдЙрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рд╣реБрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВред @luojinghui рдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЖрдВрдЦ рд╕реЗ рдорд┐рд▓рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ? рдореИрдВ рдХреБрдЫ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдПрдХ рд╣реБрдХ рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдЗрд╕рдиреЗ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛, @ рд╕реНрдЯреЛрдирд░609 рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕рдХреЗ рдареАрдХ рдКрдкрд░, рдЯрд╛рдЗрдорд┐рдВрдЧ рдХреЛрдб 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]);

рдпрд╣ рдПрдкреАрдЖрдИ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрдореЛрд░реА рд▓реАрдХ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХреЙрд▓ рдХреЛ рдЕрдирдВрдд рд▓реВрдк рдкрд░ рдХрд░ рджреЗрдЧрд╛ред

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд┐рдХреНрд╕ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреЗрддрд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ useEffect() рдЕрдВрджрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдЧ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ -

рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдПрдХ рд▓рд╛рдкрддрд╛ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ: 'рдкреНрд░реЙрдкреНрд╕'ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдХреЛрдИ рдкреНрд░реЛрдк рдмрджрд▓рддрд╛ рд╣реИ рддреЛ 'рдкреНрд░реЙрдкреНрд╕' рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкрд╕рдВрджреАрджрд╛ рдлрд┐рдХреНрд╕ 'рдкреНрд░реЙрдкреНрд╕' рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдпреВрдЬрдЗрдлреЗрдХреНрдЯ рдХреЙрд▓ рдХреЗ рдмрд╛рд╣рд░ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдпреВрдЬрдЗрдлреЗрдХреНрдЯ рд░рд┐рдПрдХреНрдЯ-рд╣реБрдХ/рдПрдЧреНрдЬреЙрд╕реНрдЯ-рдбрд┐рдкреНрд╕ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦреЗрдВред

рдХреЛрдб -

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

@luojinghui : рдЕрдЧрд░ рдЖрдкрдиреЗ рд▓рд┐рдВрдЯ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ

рд╡рд╣реА рддреНрд░реБрдЯрд┐

рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ред рдореИрдВ рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдорд╛рдЙрдВрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирдХрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ; рдореБрдЭреЗ рдЪреЗрддрд╛рд╡рдиреА рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ; рдЬрдм рдХреБрдЫ рднреА рдмрджрд▓рддрд╛ рд╣реИ рддреЛ рдореИрдВ рд╣реБрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛

рдореИрдВ рдЗрд╕ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреВрдВрдЧрд╛ рдЬрдм useEffect() рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ [] , b/c рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рднрд╛рд╡ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП _wants_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░реЛрдк рдорд╛рди рдФрд░ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдк рдмрд╛рдж рдХреЗ рд░реЗрдВрдбрд░ рдкрд░ рдмрджрд▓рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдорд╛рдорд▓рд╛ рдПрдХ:
рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкрд░ рдЪрд▓реЗ рдФрд░ рд╕рд╛рде рд╣реА рдЬрдм рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдВрдЯ рдЪреЗрддрд╛рд╡рдиреА рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ), рддреЛ рд╣рдо рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рд░рдгреА рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдХреЗрд╕ 2:
рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЖрд░рдВрднреАрдХрд░рдг рдкрд░ рдареАрдХ рдПрдХ рдмрд╛рд░ рдЪрд▓реЗ , рддреЛ рд╣рдо рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рднрд╛рд╡ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЯреНрд░рд┐рдЧрд░ рд╣реЛред

рдХреЗрд╕ 2 рдореЗрдВ, рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдкреНрд░рд▓реЗрдЦрди рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдорд╛рдЙрдВрдЯ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрди рд░рд╣реЗ рд╣реИрдВред рд▓рд┐рдВрдЯ рддреНрд░реБрдЯрд┐ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред

рдпрд╣ рдмрдВрдж рдХреНрдпреЛрдВ рд╣реИ?

рдХреЛрдИ рдЙрдкрд╛рдп?

@kennylbj

рд╡рд┐рднрд┐рдиреНрди рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЦрд┐рд░рдХрд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ред рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдПрд╕реНрд▓рд┐рдВрдЯ-рдЕрдХреНрд╖рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЗрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрдкрдпреЛрдЧ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрдореНрдореАрдж рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛ред

```рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
// ... рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЗ рдЕрдВрджрд░
рдХреЙрдиреНрд╕реНрдЯ {рдбрд┐рд╕реНрдкреИрдЪрдлрдВрдХ} = рдХрд╕реНрдЯрдорд╣реБрдХ ();
const memoizeDispatchFunc = useCallback(dispatchFunc, []);

рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ (() => {
memoizeDispatchFunc ();
}, [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]);

рдбреИрди рдХрд╛ рдпрд╣ рд▓реЗрдЦ рдореЗрд░реА рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рдЯрд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдлрд╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдШрдЯрдХ рдХреЗ рдмрд╛рд╣рд░ рдкреНрд░реЙрдкреНрд╕ рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛, рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ рдЬрд╣рд╛рдВ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@kennylbj

рд╡рд┐рднрд┐рдиреНрди рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЦрд┐рд░рдХрд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ред рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдПрд╕реНрд▓рд┐рдВрдЯ-рдЕрдХреНрд╖рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЗрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрдкрдпреЛрдЧ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрдореНрдореАрдж рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛ред

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

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

рдореЗрд░реЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
TypeError: Cannot destructure property 'dispatchFunc' of 'componentDidMount(...)' as it is undefined.

@ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЯреАрдо: рд╣реИрдкреНрдкреА рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдбред :) рдХреНрдпрд╛ рдпрд╣ рдХреГрдкрдпрд╛ рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ... рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП... рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреА 5+ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреА:

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

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдареАрдХ рдХрд┐рдпрд╛:

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

рдЬрдм рд╣рдЬрд╛рд░реЛрдВ рджреЗрд╡ рдЗрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдПрдХреНрдЯ рджреЗрд╡ рдЯреАрдо рдзрд╛рдЧреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреА рд╣реИ рдФрд░ рд╕рднреА рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИ:
8d6

рдореЗрд░рд╛ рдореБрджреНрджрд╛ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдЧрд░реАрдм рдЖрддреНрдорд╛ рдЦрд░рдЧреЛрд╢ рдХреЗ рдЫреЗрдж рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рддреА рд╣реИ рддреЛ рдореИрдВ рдЕрднреА 1 1/2 рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рд╣реВрдВ

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 рджреЗрдЦреЗрдВ рдпрд╛ рдЖрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП

рдпрд╣рд╛рдБ рдореИрдВ рд╕рд┐рд░реНрдл рд╡рд╣реА рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реВрдБ рдЬреЛ рдбреИрди рдиреЗ рдХрд╣рд╛ рдерд╛:

рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдбрд┐рд╕реНрдкреИрдЪ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреВрд░реЗ рдШрдЯрдХ рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рд╕реНрдерд┐рд░ рд░рд╣рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рддреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкреНрд░реЗрд╖рдг рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд╕реНрдерд┐рд░ рд░рд╣рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ

рдЕрдЪреНрдЫрд╛ рд╣реИ рдзрдиреНрдпрд╡рд╛рдж!

рдЬрдм рд╣рдЬрд╛рд░реЛрдВ рджреЗрд╡ рдЗрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдПрдХреНрдЯ рджреЗрд╡ рдЯреАрдо рдзрд╛рдЧреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреА рд╣реИ рдФрд░ рд╕рднреА рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИ:
8d6

рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдпрд╣ред рдпрд╣рд╛рдВ рдореИрдВ рд╣реБрдХ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЗрд╕ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рдмрдзрд╛рдИ рджреА рдЧрдИ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдХ рдЧрдВрднреАрд░ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рдЬрдм "рдХреГрдкрдпрд╛ рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓рд╛рдПрдВ" рдЬреИрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрддрдиреА рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрддреА рд╣реИред

рдЦреИрд░, рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдирд╣реАрдВ, рдЗрд╕ рддрдереНрдп рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдХрд┐ рдзрд╛рдЧрд╛ рдмрдВрдж рд╣реИ smhред

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ!

рд╕рдорд╛рдзрд╛рди,
(рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛):

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

useEffect(onInit, []);

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд▓рд╛рдЗрдирд┐рдВрдЧ рд╕рд╛рдЗрдб рдкрд░ рддрдп рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╣реЗ ...

@ ra30r рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд▓реЗрдХрд┐рди рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? :рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛:

рдЕрдм рддрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ? рдореИрдВ

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдорд╛рдорд▓рд╛ рдерд╛ рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдЙрджрдореА рдкрд░ рдПрдХ рдХреЛрд░реНрд╕ рд╕реЗ рдлреЙрд░реНрдо рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рд╕реАрдЦрд╛ред

рдЗрд╕рдиреЗ рд▓рд╛рдкрддрд╛ рдирд┐рд░реНрднрд░рддрд╛ "рдкреНрд░реЗрд╖рдг" рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХрд╛рдо рдХрд┐рдпрд╛:

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

рддреЛ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк userStatus рдореВрд▓реНрдп рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдм userData рдореЗрдВ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрджрд┐ рдЖрдк 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]);

рдФрд░ рдЗрд╕реЗ рддрдерд╛рдХрдерд┐рдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЕрджреНрдпрддрди рдХрд╣рддреЗ

рд╕рдорд╛рдзрд╛рди -> рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╕ рдкреНрд░реЗрд╖рдг рдЬреЛрдбрд╝реЗрдВ
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдПрдХ рд▓рд╛рдкрддрд╛ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ: 'рдкреНрд░реЗрд╖рдг'ред

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

@kennylbj рдЬрдм рдЖрдк рдПрдХ рд░рд╛рдЬреНрдп рд╕реЗ

@spmsupun рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╢реНрд░реЛрддрд╛ рдХреЛ рдЕрдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдФрд░ рдПрдХ рдирдпрд╛ рд╢реНрд░реЛрддрд╛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЬрдм рднреА рдирд┐рд░реНрднрд░рддрд╛ рд╕рд░рдгреА рдореЗрдВ рдЪрд░ рдмрджрд▓рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рдЬрдм тАЛтАЛрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢реНрд░реЛрддрд╛ рдХреЛ рднреА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред рдФрд░ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╣реА рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд╢реНрд░реЛрддрд╛ рдХреЛ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдкрд╛рд╕ рджрд┐рдП рдЧрдП рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕реЗ рд░реЗрдВрдбрд░ рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рдПрдЧрд╛ред

@kennylbj рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдореИрдВ рдЕрдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ
image
рдорд╛рди рд▓реАрдЬрд┐рдП рдореБрдЭреЗ рдЗрд╕реЗ рд╢реНрд░реЛрддрд╛ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ,

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реЙрдХреЗрдЯ рдЖрдИрдбреА рд╕рдорд╛рди рд╣реЛрдиреЗ рдкрд░ рднреА рдЖрдкрдХреЗ рд╢реНрд░реЛрддрд╛ рдХреЛ рджреЛ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд┐рддрд┐ рдорд┐рд▓рддреА рд╣реИ:

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

рд╕рд░реНрд╡реЛрддреНрддрдо рдХрд╛рд░реНрдп-рдЖрд╕рдкрд╛рд╕: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реБрдХ/рд╕рдВрдкреВрд░реНрдг-рдбрд┐рдкреНрд╕: "рдмрдВрдж"
рдореБрдЭреЗ рдпрд╣ рдПрд╕реНрд▓рд┐рдВрдЯ рдлреАрдЪрд░ рдХрднреА рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрд╛ред рдХрднреАред

ЁЯЪА рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рдиреАрдЪреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдШрдЯрдХ рдкрд░ рдорд╛рдЙрдВрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

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 рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреЗрддрд╛рд╡рдиреА рдмреВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдкреНрд░рднрд╛рд╡ // eslint-disable-next-line react-hooks/exhaustive-deps рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ

`рдХреЙрдиреНрд╕реНрдЯ [рдЖрдЗрдЯрдо, рд╕реЗрдЯ рдЗрдЯрдореНрд╕] = рдпреВрдЬрд╝рд╕реНрдЯреЗрдЯ ([
{
рдирд╛рдо: "рдЯреЗрд╕реНрдЯ 1",
рдЖрдИрдбреА: 1
},
{
рдирд╛рдо: "рдЯреЗрд╕реНрдЯ 2",
рдЖрдИрдбреА: 2
},
{
рдирд╛рдо: "рдЯреЗрд╕реНрдЯ 3",
рдЖрдИрдбреА: 3
},
{
рдирд╛рдо: "рдЯреЗрд╕реНрдЯ 4",
рдЖрдИрдбреА: 4
},
{
рдирд╛рдо: "рдЯреЗрд╕реНрдЯ 5",
рдЖрдИрдбреА: 5
}
]);

рдЙрдкрдпреЛрдЧ рдкреНрд░рднрд╛рд╡ (() => {
рдХреЙрдиреНрд╕реНрдЯ рдЗрдВрдЯрд░рд╡рд▓ рдЖрдИрдбреА = рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ (() => {
setItems (рд╢рдлрд▓рдЕрд░реЗ (рдЖрдЗрдЯрдо));
}, 1000);
рд╡рд╛рдкрд╕реА () => {
рд╕реНрдкрд╖реНрдЯ рдЕрдВрддрд░рд╛рд▓ (рдЕрдВрддрд░рд╛рд▓ рдЖрдИрдбреА);
};
// рдПрд╕реНрд▓рд┐рдВрдЯ-рдЕрдХреНрд╖рдо-рдЕрдЧрд▓реА-рдкрдВрдХреНрддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реБрдХ/рд╕рдВрдкреВрд░реНрдг-рдбрд┐рдкреНрд╕
}, []);

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдШрдЯрдХ рдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░рд╛рдЬреНрдп рддрд░реНрдХ рдФрд░ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдЬреИрд╕реЗ componentDidMount рд╣реИ, рддреЛ рдмрд╕ рдПрдХ рд╡рд░реНрдЧ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рд┐рд░рджрд░реНрдж рд╕реЗ рдмрдЪрд╛рдПрдВред рдХрдХреНрд╖рд╛ рдХреЗ рдШрдЯрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рдзрд╛рдЧрд╛ рдХреБрдЫ рднреА рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдЯрд┐рд▓ рд░рд╛рдЬреНрдп рддрд░реНрдХ рдпрд╛ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ (рди рд╣реА рд╡реЗ рдЗрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдИ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ - рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдХреЛрдб _really_ рд╣реИ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ?)

рдореИрдВ рдмреВрд▓рд┐рдпрди рдЭрдВрдбреЗ рдФрд░ рдЙрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП useState рдЬреИрд╕реЗ рд╕рд░рд▓ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рджреВрдВрдЧрд╛ред рдпрджрд┐ рдХреЛрдИ рдШрдЯрдХ рдХрднреА рднреА useEffect рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╢рд╛рдпрдж рдПрдХ рд╡рд░реНрдЧ рдШрдЯрдХ рд╕рд┐рд░реНрдл рдПрдХ рдмреЗрд╣рддрд░ рдлрд┐рдЯ рд╣реИред

(рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд)ред

рдпрд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ:

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

useEffect(mounted, []);

рдзрдиреНрдпрд╡рд╛рдж @ra30r рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛/рдореБрджреНрджреЗ/15865#рдЗрд╢реНрдпреВ рдХрдореЗрдВрдЯ-651254164

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

krave1986 picture krave1986  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tleunen picture tleunen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bloodyowl picture bloodyowl  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

framerate picture framerate  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MoOx picture MoOx  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ