react hooks 闭包陷阱

简介: react hooks 闭包陷阱

react Hooks 陷阱

  • react 函数组件 + hook 为我们带来了,很多的方便,但同时也会遇到一些陷阱
  • hooks必须在函数顶层 ,不能在条件分支内 ,那么你踩到了那些坑 ?

1、useState 陷阱

陷阱:【异步陷阱】

function Index() {
  const [count, setCount] = useState(0);
  
  function add(){
      setCount( count + 1 );
      console.log(count);  // 0
  }
  return (
      <div>
        <span>{count}</span>
        <button @click=()=>{ add() }> + </button>
     </div>
  );
}
  • 点击添加按钮,发现值更新了,打印的值却还是上次的
  • 什么 useState 修改状态 是异步

解决方法:

  • 所以我们不能修改后,把值去拿去其他操作 (应该拿 count+1)
  • 可以通过 promise 来 .then 获取 最新 👇
new Promise((resolve) => {
    setCount((count) => {
        resolve(count + 1);
        return count + 1;
    });
}).then((res) => {
    // 下一步操作
    console.log(res)
});

陷阱:【只更新最后1个】

function Index() {
  const [count, setCount] = useState(0);
  
  function add(){
      setCount( count + 1 );
      setCount( count + 2 );
      setCount( count + 3 );
  }
  return (
      <div>
        <span>{count}</span>
        <button @click=()=>{ add() }> + </button>
     </div>
  );
}
  • 此时 只执行了 最后一个 setCount , 导致数据不是部分逻辑未执行
  • 如果出现这种 判断条件多次 操作 useState 怎么解决 👇
  function add(){
      let num = count;
      if(...) { num += 1; }
      if(...) { num += 2; }
      if(...) { num += 3; }
      setCount( num );
  }

2、useEffect 陷阱

陷阱:【过期闭包】

function Index() {
  const [count, setCount] = useState(0);
  
  useEffect(()=>{
    setInterval(() => {   console.log(`Count: ${count}`)  }, 1000);
  }, []);
 
  return (
      <div>
        <span>{count}</span>
        <button @click=()=>{ setCount(count+1) }> + </button>
     </div>
  );
}
  • 通过计时器,每 1 秒 打印下 count
  • 点击按钮,count 已增加 ,打印的值一直不变
  • 说明此时的 useEffect 中的 count ,还是取的 过期的值

解决方法:

  • 需要,添加依赖项 count ,
  • 并且每次更新,添加计时器,结束改变计时器
function Index() {
  const [count, setCount] = useState(0);
  
  useEffect(()=>{
       const time = setInterval(() => {   console.log(`Count: ${count}`)  }, 1000);
      return () => { clearInterval(time) };
  }, [count]);
 
  return (
      <div>
        <span>{count}</span>
        <button @click=()=>{ setCount(count+1) }> + </button>
     </div>
  );
}

3、useCallback 陷阱

  • useCallback 本来拿来优化性能,当依赖变化不用重新注册该函数
  • 使用不当也会,出现一定的问题

陷阱:【获取父组件的值,不是最新】

function Parent() {
  let [count, setCount] = useState(0);
  return (
    <div>
      <button onClick={() => setCount(count+1)}> +1 </button>
      // 子组件
      <Child count={count} />
    </div>
  );
}

function Child(props){
  let log = useCallback(() => {  console.log(props.count)  }, [])
  return (
    <div>
      count: {props.count}
      <button onClick={() => log()}> 打印 </button>
    </div>
  );

}
  • 此时我们在 父组件点击 增加按钮
  • 子组件的 count 发生改变 ,我们在点击打印按钮,发现count 一直是0
  • 说明useCallback 依赖为【】数组,取到count 已经过期了 ,

解决方法:

  • 方法1 :等于没有优化 (依赖更新,useCallback重写一次)
  let log = useCallback(() => {  console.log(props.count)  }, [props.count])
  • 方法2 :将获取 count 的方法 创建到父组件,子组件调用父组件方法
function Parent() {
  let [count, setCount] = useState(0);
  let log = useCallback(() => {  console.log(count)  }, [])
  return (
    <div>
      <button onClick={() => setCount(count+1)}> +1 </button>
      // 子组件
      <Child count={count} log={log} />
    </div>
  );
}

function Child(props){
  return (
    <div>
      count: {props.count}
      <button onClick={() => props.log()}> 打印 </button>
    </div>
  );
}
相关文章
|
2天前
|
前端开发 测试技术 开发工具
探索前端框架React Hooks的优势与应用
本文将深入探讨前端框架React Hooks的优势与应用。通过分析React Hooks的特性以及实际应用案例,帮助读者更好地理解和运用这一现代化的前端开发工具。
|
2天前
|
前端开发 JavaScript
react常用的hooks有哪些?
react常用的hooks有哪些?
15 0
|
2天前
|
前端开发 JavaScript UED
使用React Hooks优化前端应用性能
本文将深入探讨如何使用React Hooks来优化前端应用的性能,重点介绍Hooks在状态管理、副作用处理和组件逻辑复用方面的应用。通过本文的指导,读者将了解到如何利用React Hooks提升前端应用的响应速度和用户体验。
|
2天前
|
缓存 前端开发
Web开发:深入探讨React Hooks的使用和最佳实践
Web开发:深入探讨React Hooks的使用和最佳实践
10 0
|
2天前
|
存储 前端开发 JavaScript
React Hooks实战:从useState到useContext深度解析
React Hooks 深度解析:useState用于函数组件的状态管理,通过初始化和更新状态实现渲染控制;useContext则提供跨组件数据传递。useState的状态更新是异步的,不支持浅比较,可结合useEffect处理副作用。useContext在多层组件间共享状态,但可能导致不必要的渲染。两者结合可创建复杂应用场景,如带主题切换的计数器。了解其工作原理和优化策略,能有效提升React应用性能。
|
2天前
|
前端开发 API 开发者
React Hooks API:自定义Hooks的创建与使用
【4月更文挑战第25天】本文介绍了React自定义Hooks的创建与使用。自定义Hooks是提升React开发效率的关键工具。
|
2天前
|
前端开发
探索React Hooks:一种全新的组件逻辑管理方式
React Hooks是React 16.8版本引入的一项新功能,它改变了我们编写React组件的方式。本文将从Hooks的起源讲起,逐步分析Hooks的优势,并通过具体示例展示Hooks在组件逻辑管理中的应用,旨在帮助读者更好地理解和运用React Hooks。
|
2天前
|
前端开发 JavaScript
使用React Hooks实现简单的计数器应用
使用React Hooks实现简单的计数器应用
|
2天前
|
前端开发 JavaScript
【边做边学】React Hooks (二)——useEffect Hook
【边做边学】React Hooks (二)——useEffect Hook
|
2天前
|
前端开发
【边做边学】系统解读一下React Hooks
【边做边学】系统解读一下React Hooks

热门文章

最新文章