React(精读官方文档) - Hook-使用 State Hook(useEffect、useLayoutEffect)

news/2024/6/15 18:46:18 标签: react.js, javascript, 前端

Effect Hook

  • 副作用: 数组获取、设置订阅、手动修改Reac组件中的DOM都属于副作用
  • 可以把 useEffect 看做 componentDidMount、componentDidUpdate 和 componentWillUnmount 这三个函数的结合
  • 简单示例:
import React, { useState, useEffect } from 'react';

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

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  });

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

useEffect 做了什么? 通过使用这个 Hook,你可以告诉 React 组件需要在渲染后执行某些操作。
**为什么在组件内部调用 useEffect?**为了直接访问 state变量 或其他 props,而不要调用其他API
useEffect 会在每次渲染后都执行吗? 默认情况下是的

  • 具体示例
//一、
import React, { useState, useEffect } from 'react';

function FriendStatus(props) {
  const [isOnline, setIsOnline] = useState(null);

  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    // Specify how to clean up after this effect:
    return function cleanup() {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}

//二、
useEffect(() => {
  document.title = `You clicked ${count} times`;
}, [count]); // 仅在 count 更改时更新
  • useEffect 第二个参数数组是可选的;
    • 没有数组:每次渲染都会执行
    • 空数组:只有挂载和销毁的时候执行
    • 数组有值:值(依赖)变化的时候执行;
  • useEffect return的函数 相当于componentWillUnMount,销毁的时候执行
  • 执行时机:传给 useEffect 的函数会在浏览器完成布局与绘制之后,在一个延迟事件中被调用。异步

useLayoutEffect

  • 与useEffect基本一致;但执行时机不同
  • 执行时机:它会在所有DOM变更之后 同步 调用effect。可以使用它来读取DOM布局并同步触发重新渲染。 在浏览器执行绘制之前,useLayoutEffect内部的更新计划将会被同步刷新;
  • 比如要更改关于布局或者样式的情况下,使用useEffect,由于其执行机制是异步的、可能会造成一闪而过的效果;换成使用useLayoutEffect 就不会有这样的问题

http://www.niftyadmin.cn/n/58325.html

相关文章

记录每日LeetCode 2335.装满杯子需要的最短总时长 Java实现

题目描述&#xff1a; 现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下标从 0 开始、长度为 3 的整数数组 amount &#xff0c;其中 amount[0]、amount[1] 和 amount[2] 分别表示需要…

JavaCollection集合

5 Collection集合 5.1 Collection集合概述 是单列集合的顶层接口&#xff0c;它表示一组对象&#xff0c;这些对象也称Collection元素JDK不提供此接口的直接实现&#xff0c;它提供更具体的子接口&#xff08;Set 和 List&#xff09;实现 package ceshi;import java.util.A…

hadoop高可用+mapreduce on yarn集群搭建

虚拟机安装 本次安装了四台虚拟机&#xff1a;hadoop001、hadoop002、hadoop003、hadoop004&#xff0c;安装过程略过 移除虚拟机自带jdk rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps关闭防火墙 systemctl stop firewalld systemctl disable firewalld.service给普…

安全渗透测试中的一款免费开源的超级关键词URL采集工具

安全渗透测试中的一款免费开源的超级关键词URL采集工具。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&#xff0c;支持研究学习&#xff0c;切勿用于非法犯罪活动&#xff0c;对于恶意使…

API 的安全性

大家好。今天聊一个很重要但是大部分人不重视的API安全问题。api固有的范围和风险意味着它们需要一种不同的安全方法。应用程序编程接口(api)是现代应用程序的构建模块&#xff0c;它们的使用正在以惊人的速度增长。然而&#xff0c;随着使用的增加&#xff0c;风险也会增加。。…

家政服务小程序实战教程08-宫格导航

小程序一般会在首页显示商品的分类&#xff0c;这类需求我们在微搭中是使用宫格导航组件来实现。 01 组件说明 宫格导航组件可以在导航配置里设置菜单&#xff0c;可以手动添加&#xff0c;也可以变量绑定 因为我们一般的分类是动态变化的&#xff0c;品类会不断的调整&#…

软件工程专业常去的网站有以下10个

1.CSDN开源社区 CSDN设计计算机很多领域&#xff0c;网络安全&#xff0c;软件&#xff0c;硬件等等。 2.Github-开源代码托管平台 面向开源及私有软件项目的托管平台。 因为经常登陆不进去的原因&#xff0c;我很少访问。 3.菜鸟教程 是一个入门学生学习的网站。我经常在…

【Python学习笔记】28.Python3 错误和异常

前言 作为 Python 初学者&#xff0c;在刚学习 Python 编程时&#xff0c;经常会看到一些报错信息&#xff0c;在前面我们没有提及&#xff0c;这章节我们会专门介绍。 Python3 错误和异常 Python 有两种错误很容易辨认&#xff1a;语法错误和异常。 Python assert&#xf…