您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在useEffect第二参数中使用对象,而不必将其字符串化为JSON

在useEffect第二参数中使用对象,而不必将其字符串化为JSON

您可以创建一个自定义钩子,该钩子跟踪a中的先前依赖项数组,ref并与对象(例如Lodash)进行比较,isEqual并且仅在它们不相等时才运行提供的函数

const { useState, useEffect, useRef } = React;

const { isEqual } = _;



function useDeepEffect(fn, deps) {

  const isFirst = useRef(true);

  const prevDeps = useRef(deps);



  useEffect(() => {

    const isSame = prevDeps.current.every((obj, index) =>

      isEqual(obj, deps[index])

    );



    if (isFirst.current || !isSame) {

      fn();

    }



    isFirst.current = false;

    prevDeps.current = deps;

  }, deps);

}



function App() {

  const [state, setState] = useState({ foo: "foo" });



  useEffect(() => {

    setTimeout(() => setState({ foo: "foo" }), 1000);

    setTimeout(() => setState({ foo: "bar" }), 2000);

  }, []);



  useDeepEffect(() => {

    console.log("State changed!");

  }, [state]);



  return <div>{JSON.stringify(state)}</div>;

}



ReactDOM.render(<App />, document.getElementById("root"));


<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

<script src="https://unpkg.com/react@16/umd/react.development.js"></script>

<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>



<div id="root"></div>
其他 2022/1/1 18:17:17 有592人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶