内置Hooks(2):useEffect

useEffect:执行副作用

useEffect,顾名思义,用于执行一段副作用。
通常来说,副作用是指一段和当前执行结果的无关的代码。

useEffect的具体用法:useEffect(callback, dependencies);
第一个为执行的函数callback,第二个是可选的依赖项数组dependencies。其中依赖项是可选的,如果不指定,那么callback就会在每次函数组件执行完后都执行;如果指定了,那么只有依赖项中的值发生变化的时候,它才会执行。

注意的是:useEffect是每个组件render完后判断依赖并执行的。

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

function BlogView({id}) {
  // 设置一个本地 state 用于保存 blog 内容
  const [blogContent, setBlogContent] = useState(null);

  useEffect(() => {
      // useEffect 的 callback 要避免直接的 async 函数,需要封装一下
      const doAsync = async () => {
          // 当 id 发生变化时,将当前内容清楚以保持一致性
          setBlogContent(null);
          // 发起请求获取数据
          const res = await fetch(`/blog-content/${id}`);
          // 将获取的数据放入 state
          setBlogContent(await res.text());
      };
      doAsync();
  }, [id]); // 使用 id 作为依赖项,变化时则执行副作用

  // 如果没有 blogContent 则认为是在 loading 状态
  const isLoading = !blogContent;
  return (
      <div> {isLoading ? "Loading..." : blogContent} </div>
  )
}

export default BlogView();

useEffect还有两个特殊的用法:没有依赖项,以及依赖项作为空数组

  1. 没有依赖项,则每次render后都会重新执行。例如:
useEffect(() => {
	//每次render完一定执行
	console.log('re-rendered');
})
  1. 空数组作为依赖项,则只在首次执行时触发,对应到Class组件就是componentDidMount。例如:
useEffect(() => {
	//组件首次渲染时执行,等价于class组件中的componentDidMount
	console.log('re-rendered');
}, [])

除了这些机制之外,useEffect还允许你返回一个函数,用于在组件销毁的时候做一些清理的操作。比如移除事件的监听。这个机制等价于类组件中的componentWillUnmount。举个例子,在组件中,我们需要监听窗口的大小变化,以便做一些布局上的调整:

// 设置一个 size 的 state 用于保存当前窗口尺寸
const [size, setSize] = useState({});
useEffect(() => {
  // 窗口大小变化事件处理函数
  const handler = () => {
    setSize(getSize());
  };
  // 监听 resize 事件
  window.addEventListener('resize', handler);
  
  // 返回一个 callback 在组件销毁时调用
  return () => {
    // 移除 resize 事件
    window.removeEventListener('resize', handler);
  };
}, []);

总结一下,useEffect让我们能够在下面四种时
机去执行一个回调函数产生副作用:

  1. 每次render后执行:不提供第二个依赖项参
    数。比如useEffect(() => {})。
  2. 仅第一次render后执行:提供一个空数组作
    为依赖项。比如useEffect((0)=>{},[])。
  3. 第一次以及依赖项发生变化后执行:提供依
    赖项数组。比如useEffect(() => {}, [deps])。
  4. 组件unmount后执行:返回一个回调函数。比如useEffect(() =>{return() => {}},[])。
React Hooks是React 16.8版本引入的新特性,用于函数组件中管理状态和生命周期。它的主要特点有:没有组件实例、没有生命周期、没有state和setState,只能接收props。通过使用Hooks,我们可以在函数组件中使用状态和其他React特性,而无需将其转换为类组件。 React Hooks的一些重要知识点包括: 1. useState:useState是一个Hooks函数,用于在函数组件内部声明和管理状态。它接收一个初始值,并返回一个包含当前状态值和更新状态值的数组。可以通过数组解构来获取状态值和更新状态的函数。 2. useEffectuseEffect是另一个Hooks函数,用于在函数组件中执行副作用操作,比如数据获取、订阅事件、修改DOM等。它接收两个参数,第一个参数是一个回调函数,用于执行副作用操作;第二个参数是一个依赖数组,用于指定在什么情况下重新运行副作用操作。如果依赖为空数组,表示只运行一次,类似于componentDidMount;如果没有依赖,表示每次渲染都运行,类似于componentDidUpdate;如果依赖数组中包含某个值,表示该值发生变化时才重新运行,类似于componentDidUpdate。 3. 自定义Hook:自定义Hook是一种将逻辑进行封装和复用的方式。它可以将状态和副作用逻辑抽离出来,在多个组件之间进行共享。自定义Hook的命名一般以"use"开头,可以使用useState、useEffect内置Hooks函数。 4. 注意事项:在使用useState时要注意初始化值只有在第一次渲染时有效,之后的重新渲染不会再重新设置新的值,而是恢复初始值。在使用useEffect时要注意避免出现死循环的情况,使用正确的依赖数组来控制effect的执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值