React中useEffect用法
# UseEffect用法
# 1. useEffect中触发更新
示例1 : 当我们在组件创建的过程,自动执行某些操作的时候 , 那我们可以在函数式组件中这样 错误示例
import { useEffect } from 'react'
function App () {
const [ count , setCount] = useState(0)
useEffect(()=> {
initData()
})
const initData = () => {
setCount(count + 1)
}
return ( <div> {count} </div> )
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
如果你这种用 useEffect 你会发现 什么问题 ? 当我们组件 渲染完成去执行 useEffect 调用 initData 函数 函数通过 setCount 设置值触发更新,一旦更新 useEffect 又会在渲染的最后执行,这样就照成了 死循环 所以 你应该这样写 ,传入 useEffect 第二个参数 空数组,代表组件渲染过程中只执行一次 正确示例
import { useEffect } from 'react'
function App () {
const [ count , setCount] = useState(0)
useEffect(()=> {
initData()
}, [])
const initData = () => {
setCount(count + 1)
}
return ( <div> {count} </div> )
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2. 重复的 useEffect
示例2 : 当我们在组件渲染的过程中 ,如果你写了多个useEffect 它会怎么做 ?
import { useEffect, useState } from 'react';
function Effect() {
const [count, setCount] = useState(0)
useEffect(() => {
console.log('111');
})
useEffect(() => {
console.log('222');
})
return (<div> {count} </div>)
}
export default Effect
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
想当然 , 它不会覆盖前面的 useEffect ,会根据你的 编写顺序进行收集,然后循环执行
# 3. 依赖值触发回调
当你想去依赖某些变量的时候去触发回调函数,你可以这样。
import { useEffect, useState } from 'react';
function Effect() {
const [count, setCount] = useState(0)
useEffect(() => {
console.log('count发生了变化最新值为' + count);
}, [count])
return (<div>
<div>
{count}
</div>
<button onClick={() => setCount(count + 1)}>加1</button>
</div>)
}
export default Effec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
当你的第二个参数是数组,并且是依赖项,组件初次渲染也会执行,这是为什么呢 ?
解答 : 如果从 react useState Hook 来说,也就是 react 将你传入的 默认值 给你重新赋值了,所以发生了变化,因此 useEffect 发生了更新
# 4. useEffect 的返回值
当useEffect 传入的 回调函数有返回值时并且为一个 函数的时候,它会怎么做?
import { useEffect, useState } from 'react';
const Room = () => {
useEffect(() => {
console.log("子组件渲染完成")
return () => {
console.log("子组件useeffect 回调函数执行")
}
}, [])
return (<div>
这是我的房间 , 大家一起来玩呀
</div>)
}
function Effect() {
const [show, setShow] = useState(true)
return (<div>
<div>
{show && <Room></Room>}
</div>
<button onClick={() => setShow(!show)}>加1</button>
</div>)
}
export default Effect
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
解答 : useEffect函数 的返回值 如果是函数时 它会在组件销毁的时候自动回调该函数,你可以在该函数中做一些清理操作,等等
上次更新: 2024/04/14, 17:23:46