react学习—Effect Hook

一、Effect Hook

Effect Hook:用于在函数组件中处理副作用

副作用:

  1. ajax请求
  2. 计时器
  3. 其他异步操作
  4. 更改真实DOM对象
  5. 本地存储
  6. 其他会对外部产生影响的操作
import React,{useState,useEffect} from 'react'

export default function App() {
  const [n,setN] = useState(0);
  //改变网页标题就属于副作用,所以在Effect函数中执行
  useEffect(() => {
    document.title=`计数器:${n}`
  })
  return (
    <div>
      <span>{n}</span>
      <button onClick={()=>{
        setN(n+1)
      }}>+</button>
    </div>
  )
}

函数:useEffect,该函数接收一个函数作为参数,接收的函数就是需要进行副作用操作的函数

2、细节

  1. 副作用函数的运行时间点,是在页面完成真实的UI渲染之后。因此它的执行是异步的,并且不会阻塞浏览器
    1. 与类组件中componentDidMount和componentDidUpdate的区别
    2. componentDidMount和componentDidUpdate,更改了真实DOM,但是用户还没有看到UI更新,同步的。
    3. useEffect中的副作用函数,更改了真实DOM,并且用户已经看到了UI更新,异步的。
  2. 每个函数组件中,可以多次使用useEffect,但不要放入判断或循环等代码块中(同useState)。
  3. useEffect中的副作用函数,可以有返回值,返回值必须是一个函数,该函数叫做清理函数
    1. 该函数运行时间点,在每次运行副作用函数之前
    2. 首次渲染组件不会运行
    3. 组件被销毁时一定会运行
function stop() {
    clearInterval(window.timer); //清空之前的计时器
    window.timer = null;
}
/**
 * 一个可移动的块,该组件每次渲染完成后,始终从0,0坐标在10秒钟内,移动到目标点坐标
 * @param {*} props 
 * props.left,要移动到的目标点横坐标
 * props.top,要移动到的目标点纵坐标
 */
function MovableBlock(props) {
    useEffect(() => {
        //渲染完成后
        const div = ref.current;
        let curTimes = 0; //当前移动的次数
        const disX = props.left / 1000; //横坐标上每次移动的距离
        const disY = props.top / 1000; //纵坐标上每次移动的距离
        window.timer = setInterval(() => {
            curTimes++;//移动次数+1
            const newLeft = curTimes * disX;
            const newTop = curTimes * disY;
            div.style.left = newLeft + "px";
            div.style.top = newTop + "px";
            if (curTimes === 1000) {
                stop();
            }
        }, 10)
        return stop; //直接使用stop作为清理函数
    })

    return <div ref={ref} style={{
        width: 100,
        height: 100,
        left: 0,
        top: 0,
        position: "fixed",
        background: "#f40"
    }}>

    </div>
}
  1. useEffect函数,可以传递第二个参数
    1. 第二个参数是一个数组
    2. 数组中记录该副作用的依赖数据
    3. 当组件重新渲染后,只有依赖数据与上一次不一样的时,才会执行副作用
    4. 所以,当传递了依赖数据之后,如果数据没有发生变化(可以利用空数组)
      1. 副作用函数仅在第一次渲染后运行
      2. 清理函数仅在卸载组件后运行
function Test() {
    useEffect(() => {
        console.log("副作用函数,仅挂载时运行一次")
        return () => {
            console.log("清理函数,仅卸载时运行一次")
        };
    }, []); //使用空数组作为依赖项,则副作用函数仅在挂载的时候运行
    console.log("渲染组件");
    const [, forceUpdate] = useState({})

    return <h1>Test组件 <button onClick={() => {
        forceUpdate({})
    }}>刷新组件</button></h1>
}
  1. 副作用函数中,如果使用了函数上下文中的变量,则由于闭包的影响,会导致副作用函数中变量不会实时变化。
import React,{useState,useEffect} from 'react'
export default function App() {
  const [n,setN] = useState(0);
  useEffect(() => {
    setTimeout(()=>{
      console.log(n);//每次渲染都会执行
    },5000)
  })
  return (
    <div>
      <span>{n}</span>
      <button onClick={()=>{
        setN(n+1)
      }}>+</button>
    </div>
  )
}

在这里插入图片描述

  1. 副作用函数在每次注册时,会覆盖掉之前的副作用函数,因此,尽量保持副作用函数稳定,否则控制起来会比较复杂。

博主开始运营自己的公众号啦,感兴趣的可以关注“飞羽逐星”微信公众号哦,拿起手机就能阅读感兴趣的博客啦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞羽逐星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值