Blog
  • README
  • Daily-life
    • 关于简历
    • 如何做好劳逸结合
    • 探索历程
    • 如何走出个人舒适圈
    • 怎样提升领导能力
    • 个人装换机之 Windows 系列
    • 工作之余 - 技能修炼
    • Search: 业余的专业搜索技能
    • 自我迭代
    • 优秀的自我介绍很重要
    • 工作心得
  • Checklist
    • 开发自检清单
    • 代码教鞭:不值得犯第二次的错
  • Docs
    • Bash: 入门重点
    • CSS 特殊用法
    • ChatGPT 使用总结
    • Console
    • Corn 表达式
    • DOS command
    • Emoji: 供日常学习、查询及使用
    • Git 命令集
    • GitBook
    • Github Action
    • Github
    • HTTP: 小知识巧总结
    • JS 精选
    • Jest learning manual
    • License: 解说
    • Mac
    • Markdown
    • 小程序
    • NPM and Plugin Guide
    • 渐进式 Web 应用(PWA)
    • Regexp
    • Rollup
    • SEO
    • SQL
    • 专业名词
    • Testing
    • TypeScript
    • Vue - fragment knowledge
    • Web API
    • 站点:那些可以经常逛逛的开发工具网站
    • Webpack
    • Windows 之路遇精彩
  • Project
    • README 模板:Project Name
    • 借鉴-项目规范
  • React
    • Antd typescript
    • React: 总结整理
    • React Hook - 速览
    • React-生命周期方法转 Hooks-1
    • React: 生命周期方法转 Hooks-2
    • Redux
    • React router
    • useEffect
  • Share
    • StartToGit
    • 3步自动同步你的 Github 仓库到 Gitee 仓库
    • 软考高级“信息系统项目管理师”考试忠告
    • 轻松使用WebWorker,解放耗时较大的算法代码
  • Tool
    • 最好的工具: 理解并使用那些耳目一新的巧工具
    • IntelliJ IDEA
    • VS Code:发挥应有的效率
  • Office
    • Excel 常用操作
    • Word: 文档操作精选技巧
由 GitBook 提供支持
在本页
  • 常用示例
  • 在 useEffect 内部使用异步 Function
  • 在 useEffect 中使用 setInterval/setTimeout, clearInterval/clearTimeout,无需将 id 转换为 useState
  • 使用 useReducer 解救 useEffect 无法去除的依赖
  • 如何去除 ESLint 提示的组件内常量依赖

这有帮助吗?

  1. React

useEffect

常用示例

在 useEffect 内部使用异步 Function

  • 不用改写 fetchData 为 useCallback;

  • 当副作用无法在 return 中消除的时候,如下异步请求(回调)中调用声明周期的方法 setState,则需要判断 isMounted 的值后再进行执行;

  • 是否销毁的状态 isMounted,写在 useEffect 内部,减少 useState 依赖; (注意方案可能有问题,待求证)

useEffect(() => {
    let isMounted = true;

    const fetchData = async () => {
        const article = await API.fetchArticle(id);
        if (!isMounted) {
          // check isMounted for async action which may have side effect
          setArticle(article);
        }
    };

    fetchData().then();

    return () => {
        isMounted = false;
    };
}, [id]);
useEffect(() => {
  async function fetchData() {
    // fetch your data
  }
  fetchData()

  return () => {
    // unbind/off event
  }
}, [])

在 useEffect 中使用 setInterval/setTimeout, clearInterval/clearTimeout,无需将 id 转换为 useState

function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const id = setInterval(() => {
      setCount(prevCount => prevCount + 1);
    }, 1000);
    return () => clearInterval(id);
  }, []);

  return <h1>{count}</h1>;
}

使用 useReducer 解救 useEffect 无法去除的依赖

  1. 以 setCount 为例:

useEffect(() => {
  const id = setInterval(() => {
    setCount(c => c + step);
  }, 1000);
  return () => clearInterval(id);
}, [step]);
  1. 将 setCount 转换成 reducer 事件 action :

const initialState = () => ({
  count: 0,
  step: 1,
});
const ACTIONS = {
  INCREMENT: 'INCREMENT',
  DECREMENT: 'DECREMENT',
};
const countReducer = ({count, step}, action) => {
  const {INCREMENT, DECREMENT} = ACTIONS;
  switch (action.type) 
  {
    case INCREMENT: 
      return {
        count: count + step,
      };
    case DECREMENT: 
      return {
        count: count - step,
      };
    default:
      return state;
  }
};

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

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

return (<div><span>{count}</span><span>{step}</span></div>);

如何去除 ESLint 提示的组件内常量依赖

示例:

function Video() {
    const {PLAYLIST_UPDATED} = EVENT_TYPES;
    useEffect(() => {
        const updatedCallback = () => {
          //...
        };
        event.on(PLAYLIST_UPDATED, updatedCallback);
        return () => {
            event.off(PLAYLIST_UPDATED, updatedCallback);
        };
    }, []);
  return (<div>...</div>)
}
// Line 166:5:  React Hook useEffect has a missing dependency: 'PLAYLIST_UPDATED'. Either include it or remove the dependency array  react-hooks/exhaustive-deps

方法:将对应常量移出组件内,放置在组件外部或单独的配置文件中。

import event from 'Event';
const {PLAYLIST_UPDATED} = EVENT_TYPES;

function Video() {
    useEffect(() => {
        const updatedCallback = () => {
          //...
        };
        event.on(PLAYLIST_UPDATED, updatedCallback);
        return () => {
            event.off(PLAYLIST_UPDATED, updatedCallback);
        };
    }, []);
  return (<div>...</div>)
}
上一页React router下一页StartToGit

最后更新于3年前

这有帮助吗?