React-hooks中的useEffect使用步骤

 更新时间:2022年05月06日 17:19:28   作者:前端卡卡西呀  
这篇文章主要介绍了React-hooks中的useEffect,对于React组件来说,主作用是根据数据(state/props)渲染UI,除此之外都是副作用(比如手动修改DOM、发送ajax请求),本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧

useEffect 永远是在 DOM渲染完成之后执行

1.理解函数副作用

什么是副作用?

对于React组件来说,主作用是根据数据(state/props)渲染UI,除此之外都是副作用(比如手动修改DOM、发送ajax请求)。

常见的副作用

  • 数据请求(发送ajax)
  • 手动修改 DOM
  • localstorage操作

useEffect 函数的作用就是为react函数组件提供副作用

2.基础使用

使用步骤

  • 导入 useEffect 函数
  • 调用 useEffect 函数,并传入回调函数
  • 在回调函数中编写副作用处理
  • 修改数据状态
  • 检测副作用是否生效

示例代码

import {useState, useEffect} from 'react';
function App() {
	const [count, setCount] = useState(0);
	useEffect(() => {
		console.log("触发副作用");
		document.title = `点击了${count}次`;
	});
	return (
		<div>
			<button onClick={() => setCount(count + 1)}>点击{count}次</button>
		</div>
	)
}

3.依赖项控制

副作用执行时机

1.默认状态(无依赖项)

上边的示例中,组件初始化时先触发一次(console出内容),之后每次点击按钮,都会触发 副作用。
useEffect 可执行多次

2.依赖项 为空

useEffect 函数还可以接收第二个参数,作为该副作用的依赖项,当第二个参数 传入一个空数组[] 时,表明只有 组件初始化的时候执行一次
咱们对上边的案例做下 微调

function App() {
	const [count, setCount] = useState(0);
	useEffect(() => {
		console.log("触发副作用");
		document.title = `点击了${count}次`;
	}, []); // 注意这里,传入 []
	return (
		<div>
			<button onClick={() => setCount(count + 1)}>点击{count}次</button>
		</div>
	)
}

可以看到当点击按钮时,title 不再改变。

3.依赖特定项

当依赖项数组中传入值时,那么该副作用会在 组件初始化的时候执行一次,依赖的特定项变化时会再次执行

function App() {
  const [count, setCount] = useState(0);
  const [name, setName] = useState('李白');
  useEffect(() => {
    console.log('触发渲染')
    document.title = `clicked ${count} times`;
    console.log('name: ', {name});
  },[count]) // 这里我们传入 count,不传name
  return (
    <>
      <p>当前次数:{count}</p>
      <p><button onClick={() => setCount(count + 1)}>累计</button></p>
      <p><button onClick={() => setName("杜甫")}>改名{name}</button></p>
    </>
  )
}

如上,当我们点击 “累计” 按钮时,会console内容,title也会改变,但是我们点击 “改名”时,不会发生变化,就是因为我们在依赖项数组中传入了 “count” 而没有 “name”。

4.注意事项

只要在 useEffect 回调函数中用到的数据状态就应该出现在依赖项数组中声明,否则可能会有bug。

5.清除副作用

在组件被销毁时,如果有些副作用操作需要被清理,比如常见的定时器等,可通过useEffect return回调函数 的方式清理副作用。

语法如下:

useEffect(() => {
	console.log('副作用函数执行');
	return () => {
		console.log('清理副作用的函数执行');
		// 这里执行 清理副作用的代码
	}
})

示例:

function Test() {
  useEffect(() => {
    let timer = setInterval(() => {
      console.log('this is effect');
    }, 1000)
    // 这里return 一个回调函数,在函数中清除副作用
    return () => {
      clearInterval(timer);
    }
  })
  return (
    <div>Test</div>
  )
}
function App() {
  const [flag, setFlag] = useState(true);
  return (
    <div>
      {flag ? <Test/> : null}
      <div>
        <button onClick={() => setFlag(!flag)}>点击</button>
      </div>
    </div>
  )
}

6.发送网络请求

不可以直接在 useEffect 的回调函数外层直接包裹await,因为异步会导致清理函数无法立即返回
❌错误示例:

useEffect(async () => {
	const res = await getData('url');
	console.log(res);
})

可在 useEffect 中定义一个请求数据方法,调用。

正确示例

useEffect(() => {
	async function initData() {
		const res = await getData('url');
		console.log(res);
	}
	initData()
}, []) // 仅组件初始化时调用

到此这篇关于React-hooks中的useEffect的文章就介绍到这了,更多相关React-hooks useEffect内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React forwardRef的使用方法及注意点

    React forwardRef的使用方法及注意点

    React.forwardRef的API中ref必须指向dom元素而不是React组件,通过一段示例代码给大家介绍了React forwardRef使用方法及注意点还有一些特殊情况分析,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • react-router v6实现权限管理+自动替换页面标题的案例

    react-router v6实现权限管理+自动替换页面标题的案例

    这篇文章主要介绍了react-router v6实现权限管理+自动替换页面标题,这次项目是有三种权限,分别是用户,商家以及管理员,这次写的权限管理是高级权限能访问低级权限的所有页面,但是低级权限不能访问高级权限的页面,需要的朋友可以参考下
    2023-05-05
  • 深入了解React中的合成事件

    深入了解React中的合成事件

    React 中的事件,是对原生事件的封装,叫做合成事件。这篇文章主要通过几个简单的示例为大家详细介绍一下React中的合成事件,感兴趣的可以了解一下
    2023-02-02
  • React如何使用sortablejs实现拖拽排序

    React如何使用sortablejs实现拖拽排序

    这篇文章主要介绍了React如何使用sortablejs实现拖拽排序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • React进行路由变化监听的解决方案

    React进行路由变化监听的解决方案

    在现代单页应用(SPA)中,路由管理是至关重要的一部分,它不仅决定了用户如何在页面间切换,还直接影响到整个应用的性能和用户体验,这些看似不起眼的问题,往往会导致功能错乱和性能下降,本篇文章将深入探讨在 React 中如何高效监听路由变化,需要的朋友可以参考下
    2025-01-01
  • react中使用redux-persist做持久化储存的过程记录

    react中使用redux-persist做持久化储存的过程记录

    这篇文章主要介绍了react中使用redux-persist做持久化储存的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • ReactRouterV6如何获取当前路由参数

    ReactRouterV6如何获取当前路由参数

    这篇文章主要介绍了ReactRouterV6如何获取当前路由参数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 解决React报错You provided a `checked` prop to a form field

    解决React报错You provided a `checked` prop&n

    这篇文章主要为大家介绍了React报错You provided a `checked` prop to a form field的解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 详解React setState数据更新机制

    详解React setState数据更新机制

    这篇文章主要介绍了React setState数据更新机制的相关资料,帮助大家更好的理解和学习使用React框架,感兴趣的朋友可以了解下
    2021-04-04
  • React中使用async validator进行表单验证的实例代码

    React中使用async validator进行表单验证的实例代码

    react上进行表单验证是很繁琐的,在这里使用async-validator处理起来就变的很方便了,接下来通过本文给大家介绍React中使用async validator进行表单验证的方法,需要的朋友可以参考下
    2018-08-08

最新评论