其他分享
首页 > 其他分享> > ReactHooks专题-useEffect

ReactHooks专题-useEffect

作者:互联网

链接: 文档地址.

Effect Hook

目前我们已经通过hook函数式组件中定义state,那么类似于生命周期这些呢?

Effect的基本使用

假如我们现在有一个需求:页面的title总是显示counter数字
使用class组件如何实现呢?

import React, { Component } from 'react';

class ClassCom extends Component {
  state={
    counter:96
  }
  componentDidMount(){
    document.title=this.state.counter
  }
  componentDidUpdate(){
    document.title=this.state.counter
  }
  render() {
    return (
      <div>
        <p>当前counter的是{this.state.counter}</p>
        <button onClick={()=>{
          this.setState({
            counter:this.state.counter+1
          })
        }}>+</button>
        <button onClick={()=>{
          this.setState({
            counter:this.state.counter-1
          })
        }}>-</button>
      </div>
    );
  }
}

export default ClassCom;

这个时候,我们可以使用useEffectHook来完成;

import React, { useEffect, useState } from 'react';

export default function About() {
  let [counter,setCounter]=useState(66)

  useEffect(()=>{
    document.title=counter;
  })
  
  return (
    <div>
      <p>当前counter的计数是{counter}</p>
      <button onClick={()=>{
        setCounter(counter+1)
      }}>+</button>
      <button onClick={()=>{
        setCounter(counter-1)
      }}>-</button>
    </div>
  );
}

useEffect的解析;

需要清除useEffect

class组件在编写的过程中,某些副作用代码,我们需要在componentWillUnmount中进行清除;

useEffect传入的回调函数A本身可以有一个返回值,这个返回值是另外一个回调函数B

type EffectCallback = () => (void | (() => void | undefined));

我们可以这样来编写Effect Hook

import React, { useEffect, useState } from 'react';

export default function About() {
  let [counter,setCounter]=useState(66)

  useEffect(()=>{
    document.title=counter;
    console.log('每次DOM更新时会回调')
    return ()=>{
      console.log('DOM被移除时会回调');
    }
  })
  
  return (
    <div>
      <p>当前counter的计数是{counter}</p>
      <button onClick={()=>{
        setCounter(counter+1)
      }}>+</button>
      <button onClick={()=>{
        setCounter(counter-1)
      }}>-</button>
    </div>
  );
}

为什么要在effect中返回一个函数

React何时清除effect

使用多个Effect

使用Hook的其中一个目前就是解决class中生命周期经常将很多的逻辑放在一些的问题

使用Effect Hook,我们可以将它们分离到不同的useEffect中;

import React, { useEffect } from 'react';

export default function MultiUseEffect() {
  useEffect(() => {
    console.log("网络请求");
  });

  useEffect(() => {
    console.log("修改DOM");
  })

  useEffect(() => {
    console.log("事件监听");

    return () => {
      console.log("取消监听");
    }
  })

  return (
    <div>
      <h2>MultiUseEffect</h2>
    </div>
  )
}

Hook允许我们按照代码的用途分离它们,而不是像生命周期函数那样;

Effect性能优化

默认情况下,useEffect的回调函数都会在每次渲染的时候都重新执行,但是这会导致两个问题;

我们如何决定useEffect在什么时候应该执行和什么时候不应该执行呢?

我们来看下面一个案例:

import React, { useState, useEffect } from 'react';

export default function EffectPerformance() {
  const [count, setCount] = useState(0);
  const [show, setShow] = useState(true);

  useEffect(() => {
    console.log("修改DOM");
  }, [count])

  return (
    <div>
      <h2>当前计数: {count}</h2>
      <button onClick={e => setCount(count + 1)}>+1</button>
      <button onClick={e => setShow(!show)}>切换</button>
    </div>
  )
}

但是,如果一个函数我们不希望依赖任何的内容时,也可以传入一个空数组[]

useEffect(() => {
  console.log("监听事件");

  return () => {
    console.log("取消监听");
  }
}, [])

标签:专题,console,Hook,counter,Effect,React,ReactHooks,useEffect
来源: https://blog.csdn.net/big_sun_962464/article/details/122767913