leiwuhen-67's blog leiwuhen-67's blog
首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)

我的公众号

首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)
  • React

    • 使用React脚手架快速搭建项目
    • hooks之useEffect
    • React之事件绑定及简写方式
    • React之props传值并对其进行限制
    • React之Refs的基本使用
    • React之生命周期钩子
    • React之key的使用
    • React之代理服务器配置
    • React之封装全局Loading组件
    • React之消息的发布-订阅(pubsub-js)
    • React之Redux的基本使用
    • React之react-redux的基本使用
    • React之redux的数据持久化存储
    • React之路由懒加载
    • React之Render Props的使用
    • React之createBrowserRouter
    • React之路径别名@配置
    • React之craco打包优化配置
    • React之项目国际化
    • React之postcss-pxtorem移动端适配
    • React之使用vite创建项目
    • React之ts类型标注汇总
    • React之使用 ant design搭建后台管理之踩坑
    • React之路由切换动画
    • React之使用vite创建组件库并发布到npm
    • React之项目打包部署到nginx
    • React之自定义组件添加className与style
  • React Native

  • 《React》笔记
  • React
心欲无痕
2022-03-21

hooks之useEffect

由于函数组件没有生命周期,可以使用 useEffect 来替代,他可以看做是 componentDidMount、componentDidUpdate、componentWillUnmount 这三个函数的组合。

/* 
	useEffect不传参数,相当于类式组件中的componentDidMount生命周期和componentDidUpdate生命周期,
	在挂载完成执行一次,任何状态更改时也会执行
*/
import React, { useState, useEffect } from 'react';
 
export default function Page2 () {
	const [count, setCount] = useState(0);

	useEffect(() => {
		getDatas ()
	})

	const getDatas = () => {
		let arr = [134,2345,355,46]
		console.log('arr', arr)
	}

	return(
		<div>
			<p>You clicked {count} times</p>
			<button onClick={() => setCount(count + 1)}>按钮</button>
			<div>This is Page2!</div>
		</div>
	);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

这里,在页面初次加载完会执行 getDatas 方法,控制台会打印出数据,每次点击按钮更新 count 后,控制台会依次执行 getDatas 方法打印出数据。

如果想通知 React 跳过对 effect 的调用,可以传一个空数组作为 useEffect 的第二个参数,这样就只会运行一次 effect。

/*
	此时,相当于类式组件中的componentDidMount生命周期,只会在挂载完成执行一次
 */
useEffect(() => {
	getDatas ()
}, [])
1
2
3
4
5
6

同样的,如果某些特定值在两次渲染之间没有发生变化,可以通知 React 跳过对 effect 的调用,比如只有 count 属性变化时才去调用 effect,其他情况下不调用 effect,此时相当于类式组件中的 componentDidMount 和 componentDidUpdate 生命周期。

// 组件挂载完会调用,,count更改后也会调用
useEffect(() => {
	getDatas ()
}, [count])
1
2
3
4

如果 useEffect 里返回一个回调,如下:

/*
	此时,useEffect相当于类组件中的componentDidMount、componentDidUpdate、componentWillUnmount生命周期,
	页面加载完会执行、组件状态更改后也会执行,在组件将要卸载时也会执行
 */
let listData = [
	{
		name: "张三",
		age: 34,
		id: 1
	}, {
		name: "李四",
		age: 23,
		id: 2
	}, {
		name: "王五",
		age: 45,
		id: 3
	}
]
let [list, setList] = useState(listData)

useEffect(() => {
	const timer = setInterval(() => {
		setList(list.map(item => {
			return {
				...item,
				age: item.age + 1
			}
		}))
	}, 1000)
	return () => {
		clearInterval(timer)
	}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
编辑 (opens new window)
上次更新: 7/1/2024, 4:56:33 PM
使用React脚手架快速搭建项目
React之事件绑定及简写方式

← 使用React脚手架快速搭建项目 React之事件绑定及简写方式→

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式