React中函数式Hooks之useEffect的使用

简介: 本文通过示例代码讲解了React中`useEffect` Hook的用法,包括模拟生命周期、监听状态和清理资源。

useEffect

useEffect总的来讲,是为了模拟class类组件的生命周期,同时也完成了一项功能,那就是数据的监听:

最下方有总结

我们首先看第一个例子:

import React from 'react'

function Dome() {
   
    let [num, setNum] = React.useState(0)
    React.useEffect(()=>{
   
        console.log("num的数值为:"+num)
    })
    const changeNumFun =()=>{
   
        setNum(++num)
    }
    return (
        <div onClick={
   changeNumFun}>
           当前的num数值为: {
   num}
        </div>
    )
}
export default Dome

在这里插入图片描述
在上述代码中我们可以发现,在我们页面挂载的时候,和更改num状态的时候都执行了useEffect中的回调函数中的打印。
所以在useEffect这个hook目前已经有了两个作用:页面挂载执行(DidMount),页面更新执行(DidUpdate),这种情况我们很少用,应为我们每必要更新一下useState的状态你就给我走一遍这个函数,除非你在监听所有的状态,那怎么只监听某个数据的状态呢,或者只让他在挂载的时候执行一次。

我们看第二个例子:

import React from 'react'

function Dome() {
   
    let [num, setNum] = React.useState(0)
    React.useEffect(()=>{
   
        console.log("num的数值为:"+num)
    },[])
    const changeNumFun =()=>{
   
        setNum(++num)
    }
    return (
        <div onClick={
   changeNumFun}>
           当前的num数值为: {
   num}
        </div>
    )
}
export default Dome

和第一个例子的唯一差距就是useEffect函数的参数个数不同,第二个参数传入一个空数组,我们看执行结果:
在这里插入图片描述
发现useEffect中的打印只执行了一次,所以当我们传入一个空数组的时候表示,可以当做执行了挂载钩子函数,那我们第二个参数传入参数呢?

我们看第三个例子:

import React from 'react'

function Dome() {
   
    let [num, setNum] = React.useState(0)
    React.useEffect(()=>{
   
        console.log("num的数值为:"+num)
    },[num])
    const changeNumFun =()=>{
   
        setNum(++num)
    }
    return (
        <div onClick={
   changeNumFun}>
           当前的num数值为: {
   num}
        </div>
    )
}
export default Dome

在这里插入图片描述
就目前来看和不传第二个参数一样,都是更新和挂载都打印useEffect中的打印,其实差别在于目前只监听第二个参数数组中含有的变量的状态,本来我们不传入数组的话,就会监听所有的变量的状态,无论谁在改变都会打印,这样我们传入[num],这样的话,只会在页面挂载的时候打印和num变量改变的时候才会改变。

我们看第四个例子:

import React from 'react'

function Dome() {
   
    let [num, setNum] = React.useState(0)
    React.useEffect(()=>{
   
        console.log("num的数值为:"+num)
        return ()=>{
   
            console.log("页面销毁")
        }
    },[num])
    const changeNumFun =()=>{
   
        setNum(++num)
    }
    return (
        <div onClick={
   changeNumFun}>
           当前的num数值为: {
   num}
        </div>
    )
}
export default Dome

会发现我在useeFFECT的函数中的第一个参数加了个返回值,并且返回值是个函数,这个时候我们切换路由,就会打印 页面销毁 这段话,说明如果在useEffect的第一个参数中加一个返回值并且这个返回值是一个函数的话,那么就会在页面销毁的时候执行,等同于我们class类组件的卸载组件生命周期钩子。
在这里插入图片描述

我们看第五个例子:

function Counter() {
   
  const [count, setCount] = useState(0);
  const [count1, setCount1] = useState(0);
  const [count2, setCount2] = useState(0);

  useEffect(() => {
   
    setCount(1);
    setCount1(2);
    setCount2(2);
    setTimeout(() => {
   
      setCount2(333);
    });

    console.log(222222222);
  }, []);
  console.log(33333333333);
  return <h1>{
   count}</h1>;
}

在这里插入图片描述

setCount(1);
setCount1(2);
setCount2(2);
多次set只会render一次。

我们看第六个例子:

function Counter() {
   
  let [num, setNum] = React.useState(0)
  React.useEffect(()=>{
   
      console.log("num的数值为:"+num)
      return ()=>{
   
          console.log("页面销毁")
      }
  },[num])
  const changeNumFun =()=>{
   
      setNum(++num)
  }
  return (
      <div onClick={
   changeNumFun}>
         当前的num数值为: {
   num}
      </div>
  )
}

在这里插入图片描述

num的每一次改变都会触发effect,同时对应的销毁周期的函数也会执行。

总结:

1.Effect Hook可以在函数组件中执行类似class类组件中的声明周期操作;
2.比如:发送网络请求,开启定时器等操作;
3.语法:

    React.useEffect(()=>{
   
        // 在此可以执行请求 定时器等操作
        console.log("开启网络请求")
        return ()=>{
    
            // 返回值这个函数会在页面卸载的时候调用
            // 可以取消定时器等操作
            console.log("页面销毁")
        }
    },[StateValue])//指定要监听的变量,发生变化后会执行第一个参数(函数)
                    //什么也不传的话,每一个useState变量变化都会执行
                    //传入空数组[]的话,只会在页面挂载的时候执行

4.可以把useEffect看成下面三个声明周期函数的整合:

    componentDidMount
    componentDidUpdate
    componentWillUnmount

区别主要在于useEffect的第二个参数和第一个参数的返回值(函数)

目录
相关文章
|
27天前
|
前端开发 JavaScript
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
59 4
|
30天前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
5天前
|
前端开发 JavaScript
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
|
15天前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
28 2
|
20天前
|
前端开发 开发者
React 提供的其他重要 Hooks
【10月更文挑战第20天】React 提供了一系列强大的 Hooks,除了 `useRef` 之外,还有许多其他重要的 Hooks,它们共同构成了函数式组件开发的基础。
34 6
|
27天前
|
前端开发 JavaScript 开发者
React Hooks
10月更文挑战第13天
33 1
|
1月前
|
前端开发 JavaScript API
自定义React Hooks综合指南
本文介绍了React Hooks及其在组件开发中的作用,重点讲解了自定义Hook的创建和使用方法。通过实例展示了如何创建`useWindowWidth`、`useFetch`和`useForm`等自定义Hook,并分享了使用自定义Hook的最佳实践。文章强调了自定义Hook在提高代码复用性和组件可维护性方面的重要性。
49 0
|
1月前
|
前端开发 JavaScript 开发者
深入理解React Hooks:提升前端开发效率的关键
【10月更文挑战第5天】深入理解React Hooks:提升前端开发效率的关键
|
8天前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
33 9
|
1月前
|
前端开发 JavaScript API
探索React Hooks:前端开发的革命性工具
【10月更文挑战第5天】探索React Hooks:前端开发的革命性工具