useEffect - 生命周期

2021-01-23  本文已影响0人  bestCindy

在 React 中,function component 和 class component 相比较,function component 是没有生命周期的

我们可以用 useEffect 来代替在 class component 中,一些有关生命周期的操作

我们用一个例子来说明 useEffect 的一些用法和作用

首先有一个 Example 组件,组件里面有一个 button,当点击 button 的时候,可以进行计数

在这个组件里面还有两个 link,Index 和 List

function Example() {
    const [count, setCount] = useState(0);

    return (
        <div>
            <p>You clicked {count} times</p>
            <button onClick={() => { setCount(count + 1) }}>click me</button>

            <Router>
                <ul>
                    <li><Link to="/">Index</Link></li>
                    <li><Link to="/list/">Link</Link></li>
                </ul>
                <Route path="/" component={Index} exact></Route>
                <Route path="/list/" component={List} exact></Route>
            </Router>
        </div>

    )
}

export default Example;
function Index() {
    return (
        <p>this is Index</p>
    )
}
function List() {
    return (
        <p>this is List</p>
    )
}

现在页面上是这样子的

现在给 Index 和 list 分别加上 useEffect

function Index() {
    useEffect(() => {
        console.log("this is Index");
    })
    return (
        <p>this is Index</p>
    )
}
function List() {
    useEffect(() => {
        console.log("this is Link");
    })
    return (
        <p>this is List</p>
    )
}

当页面第一次渲染的时候

点击 Link

可以看出此时 useEffect 有类似 componentDidMount 的作用

现在点击两次 button

可以看到 “this is Link” 又多打印了两次,可以看出 useEffect 有类似 componentDidUpdate 的作用

注意:

现在,我们给 useEffect 加上一个 return 函数

function Index() {
    useEffect(() => {
        console.log("this is Index");
        return () => {
            console.log("you have leaved Index");
        }
    })
    return (
        <p>this is Index</p>
    )
}
function List() {
    useEffect(() => {
        console.log("this is Link");
        return () => {
            console.log("you have leaved Link");
        }
    })
    return (
        <p>this is List</p>
    )
}

当初次渲染,然后点击 Link 的时候

再切换回 Index

可以看到在组件 unmount 的时候, useEffect 里面的 return 函数被触发了

所以 useEffect 也可以实现 componentWillUnmount 的功能

但是!

当我们点击 button 的时候

可以看到 useEffect 里面的 return 也执行了

但是我们不想让它执行,只是实现 componentWillUnmount 的功能

这时候可以设置 useEffect 的第二个参数

function Index() {
    useEffect(() => {
        console.log("this is Index");
        return () => {
            console.log("you have leaved Index");
        }
    }, [])
    return (
        <p>this is Index</p>
    )
}

这时候点击 button

切换

关于 useEffect 的第二个参数

我们现在给 Example 加一个 useEffect

useEffect(()=>{
  console.log(`useEffect=>You clicked ${count} times`)

   return ()=>{
      console.log('====================')
    }
},[count])

第一次渲染的时候

点击 button 的时候

总结:

上一篇下一篇

猜你喜欢

热点阅读