react Hooks :useEffect的使用
程序员文章站
2022-05-29 11:57:19
...
什么是副作用?
在特定的状态、节点、时机下,要做特定的行为,这些行为置身于组件渲染之后,通通称之为副作用,绑定事件,网络请求,访问DOM元素,通通称之为副作用,副作用时机在Mount之后,Update之后,Unmount之前,这三者分别是ComponentDidMount,componentDidUpdate,componentWillUnmount
useEffect怎么用?
useEffect在render之后调用,也可以通过自定义状态来决定调用和不调用,第一次调用相当于ComponentDidMount,之后调用相当于componentDidUpdate,useEffect的调用不仅仅代表一个函数的执行,还可以返回另一个回调函数,是清除上一次副作用遗留下来的状态,会在下一次渲染之前执行
react类组件 实现副作用
import React, { Component } from 'react'
class App extends Component {
state = {
count: 0,
size: {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
}
onResize = () => {
this.setState({
size: {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
})
}
componentDidMount() {
document.title = this.state.count;
window.addEventListener('resize', this.onResize, false);//监听resize事件绑定到onResize方法上
}
componentDidUpdate() {
document.title = this.state.count
}
componentWillUnmount() {
window.removeEventListener('resize', this.onResize, false);//解绑该resize事件
}
render() {
const { count, size } = this.state
return (
<div>
<button
type="button"
onClick={() => this.setState({ count: count + 1 })}
>
Click({count})
size:{size.width} | {size.height}
</button>
</div>
)
}
}
export default App
react函数组件 实现副作用
import React, { useState, useEffect } from 'react'
function APP(props) {
const [count, setCount] = useState(0)
const [size, setSize] = useState(
{
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
)
const onResize = () => {
setSize(
{
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
)
}
useEffect(() => {
document.title = count;
})
useEffect(() => {
window.addEventListener('resize', onResize, false);//监听resize事件绑定到onResize方法上
return () => {
window.removeEventListener('resize', onResize, false);//解绑该resize事件
};
//return出一个回调函数。回调函数在视图销毁之前,两种销毁原因,一是重渲染,二是组件卸载
}, [])
//useEffect第二个必须是一个数组,只有数组每一项都不变时候再能阻止Effect执行
//当useEffect第二个参数为空数组,Effect调用一次后就不再调用,回调函数也只有在组件卸载时候调用
return (
<div>
<button
type="button"
onClick={() => { setCount(count + 1) }}
>
Click({count})
size:{size.width} | {size.height}
</button>
</div>
)
}
export default APP