千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:重庆千锋IT培训  >  技术干货  >  react中遇到过那些过期闭包的坑吗?怎么解决?

react中遇到过那些过期闭包的坑吗?怎么解决?

来源:千锋教育
发布人:lxl
时间: 2023-05-17 11:04:50

react中遇到过那些过期闭包的坑吗

  1、useEffect中过期闭包的表现

import React, { useState, useEffect, useContext } from 'react';

export default function hook() {

const [count, setCount] = useState(0)
/**
* 每次点击都会调用,没切都是原来的值
*/

useEffect(() => {
// 是一个过时的闭包
setInterval(() => {
console.log(count)
}, 2000)
}, [])

return (
<div>
{count}
<button onClick={() => setCount(count + 1)}> 加1 </button>
</div>

)
}

   2、useEffect解决方案

  让useEffect()知道定时器的方法里面中的闭包依赖于count

import React, { useState, useEffect, useContext } from 'react';

export default function hook() {

const [count, setCount] = useState(0)
/**
* 每次点击都会调用,没切都是原来的值
*/

useEffect(() => {
// 是一个过时的闭包
const ter = setInterval(() => {
console.log(count)
}, 2000)

// 每次调用前先清空定时器,或者说重新创建
return () => {
clearInterval(ter)
}

// 这行是重点,count变化后重新渲染useEffect
}, [count])

return (
<div>
{count}
<button onClick={() => setCount(count + 1)}> 加1 </button>
</div>

)
}

   3、useState过期闭包的表现

  点击 +1 然后立即点击 +2,count 只更新到 1。这是因为 delay() 是一个过时的闭包

import React, { useState, useEffect, useContext } from 'react';

export default function hook() {

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

/**
*
* delay() 是一个过时的闭包,它使用在初始渲染期间捕获的过时的 count 变量
*/

function add() {
setTimeout(function delay() {
setCount(count + 1);
}, 1000);
}

const add2 = () => {
setCount(count + 2)
}

return (
<div>
{count}
<button onClick={() => add()}>+1 </button>
<button onClick={() => add2()}>+2</button>
</div>

)
}

   4、useState解决方案

import React, { useState, useEffect, useContext } from 'react';

export default function hook() {

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

/**
*
* delay() 是一个过时的闭包,它使用在初始渲染期间捕获的过时的 count 变量
*/

function add() {
setTimeout(function delay() {
setCount((a) => a + 1);
}, 1000);
}

const add2 = () => {
setCount(count + 2)
}

return (
<div>
{count}
<button onClick={() => add()}>+1 </button>
<button onClick={() => add2()}>+2</button>
</div>

)
}

   5 useCallback如果依赖项传一个空数组内部也会形成过期闭包

import React, { useState, useEffect, useContext } from 'react';

export default function hook() {

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

/**
*
* delay() 是一个过时的闭包,它使用在初始渲染期间捕获的过时的 count 变量
*/

function add() {
setTimeout(function delay() {
setCount((a) => a + 1);
}, 1000);
}

const add2 = () => {
setCount(count + 2)
}

useCallback(() => {
// 值永远不会更新
console.log(count)
}, [])

return (
<div>
{count}
<button onClick={() => add()}>+1 </button>
<button onClick={() => add2()}>+2</button>
</div>

)
}

 

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

如何进行mysql数据备份?

2023-05-30

从零开始学Java之Java中的内部类是怎么回事?

2023-05-29

什么是事件流以及事件流的传播机制 ?

2023-05-29

最新文章NEW

什么是servlet的生命周期?servlet请求处理流程是怎样的?

2023-05-30

在java中,super关键字怎样使用

2023-05-29

什么是JavaScript伪数组?

2023-05-25

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>