React hooks文档笔记(五)useEffect——解决异步操作竞争问题

这篇具有很好参考价值的文章主要介绍了React hooks文档笔记(五)useEffect——解决异步操作竞争问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.开发环境下组件加载两次?

React hooks文档笔记(五)useEffect——解决异步操作竞争问题
非bug,重新安装组件仅在开发过程中发生,帮助找到需要清理的效果。在生产环境中只会加载一次。

  • React 将在 Effect 下次运行之前以及卸载期间调用您的清理函数。return () => {};

2. 🌰订阅事件情况,清除订阅:

useEffect(() => {
  function handleScroll(e) {
    console.log(window.scrollX, window.scrollY);
  }
  window.addEventListener('scroll', handleScroll);
  return () => window.removeEventListener('scroll', handleScroll);
}, []);

在开发中, Effect call addEventListener(),然后立即callremoveEventListener(),然后再次calladdEventListener()。因此一次只有一个活动订阅。这与在生产中调用一次addEventListener()具有相同的用户可见行为。

3. 🌰接口获取,异步操作“竞争”,清除事件:

如果快速切换select选项,会造成fetchBio会同时请求多个,但是可能以意想不到的顺序到达

原代码:

import { useState, useEffect } from 'react';
import { fetchBio } from './api.js';

export default function Page() {
  const [person, setPerson] = useState('Alice');
  const [bio, setBio] = useState(null);
  
  useEffect(() => {
    setBio(null);
    fetchBio(person).then(result => {
        setBio(result);
    });
  }, [person]);

  return (
    <>
      <select value={person} onChange={e => {
        setPerson(e.target.value);
      }}>
        <option value="Alice">Alice</option>
        <option value="Bob">Bob</option>
        <option value="Taylor">Taylor</option>
      </select>
      <hr />
      <p><i>{bio ?? 'Loading...'}</i></p>
    </>
  );
}

select框依次点击顺序:alice->bob->taylor

发现执行出来是错误结果,taylor选项下对应的页面中竟然显示的是“bob”
React hooks文档笔记(五)useEffect——解决异步操作竞争问题

修改代码:

 useEffect(() => {
    let ignore = false;
    setBio(null);
    fetchBio(person).then(result => {
      if (!ignore) {
        setBio(result);
      }
    });
    return () => {
      ignore = true;
    }
  }, [person]);

select框依次点击顺序:alice->bob->taylor,结果显示正确
React hooks文档笔记(五)useEffect——解决异步操作竞争问题

解析

每个渲染器的 Effect 都有自己的ignore变量。最初,ignore变量设置为false
但是,如果 Effect 被清除(例如当您选择不同的人时),它的ignore变量将变为true

请求完成的顺序并不重要。

只有最后一个人的 Effect 会ignore设置为false,所以它会调用setBio(result)。过去的影响已被清除,因此if (!ignore)检查将阻止他们调用setBio:文章来源地址https://www.toymoban.com/news/detail-510012.html

  • 选择’Bob’触发器fetchBio('Bob')
  • 选择’Taylor’触发器fetchBio('Taylor') 并清除之前的(Bob 的)效果
  • 抓取’Taylor’完成前抓取’Bob’
  • 'Taylor’渲染调用的效果setBio('This is Taylor’s bio')
  • 抓取’Bob’完成
  • 'Bob’渲染的效果不做任何事情,因为它的ignore标志被设置为true

到了这里,关于React hooks文档笔记(五)useEffect——解决异步操作竞争问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React hooks文档笔记(四) useRef

    当想让组件记住一些信息,又不想触发新的渲染,可以使用ref:总是返回同一个对象。 1. state 和 refs 的比较 refs(普通的 JavaScript 对象) state 更改时 不触发重新渲染 更改时 触发重新渲染 可变的——修改/更新 current ’s value (修改完立即生效  ref.current = 5;    console.log(ref

    2024年02月12日
    浏览(42)
  • react之Hooks的介绍、useState与useEffect副作用的使用

    Hooks 是 React v16.8 中的新增功能 为函数组件提供状态、生命周期等原本 class 组件中提供的 React 功能 可以理解为通过 Hooks 为函数组件钩入 class 组件的特性 注意:Hooks 只能在函数组件中使用,自此,函数组件成为 React 的新宠儿 可以在项目中同时使用hooks和class 一个 Hook 就是一

    2024年02月12日
    浏览(41)
  • react的严格模式 和 解决react useEffect执行两次

    这个问题,主要是刚接触react的时候发的问题,当时也没总结。现在回过头来再总结一次!!! 能发现这个问题的👨‍🎓,一定是一名细心并且有一颗求知的❤️。 因为我当时接触React的时候就是这样的想法。 为什么会触发两次?按照正常的声明周期应该执行一次的!!!

    2024年02月04日
    浏览(38)
  • 【实战】 JWT、用户认证与异步请求(1) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(四)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月10日
    浏览(49)
  • 【实战】 四、JWT、用户认证与异步请求(上) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(四)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月11日
    浏览(44)
  • React笔记(五)hook

    一、函数组件 1、函数组件的创建 函数组件:使用JS的函数(或箭头函数)创建的组件称为函数组件,函数组件有如下约定 函数名称必须以大写字母开头 函数组件必须有返回值,返回JSX表达式 渲染函数组件:用函数名作为组件标签名 组件名称可以是单标签也可以是双标签

    2024年02月10日
    浏览(38)
  • React18 hook学习笔记

    useState useState用于在函数组件中声明和管理状态 它接受初始状态,并返回一个状态变量和一个更新状态的函数 通过调用更新状态的函数,可以改变状态的值并触发组件的重新渲染 useEffect React的useEffect钩子可以让开发者在函数组件中管理副作用。 副作用操作是指那些与组件渲

    2024年02月14日
    浏览(40)
  • react实现对数组做增删改操作自定义hook

    实现对数组的增删改操作。 React好玩的自定义hook-useArray_哔哩哔哩_bilibili

    2024年02月12日
    浏览(34)
  • React 应用 Effect Hook 函数式中操作生命周期

    React Hook入门小案例 在函数式组件中使用state响应式数据给大家演示了最简单的 Hook操作 那么 我们继续 首先 Hook官方介绍 他没有破坏性是完全可选的 百分比兼容 也就说 我们一起的 类 class的方式也完全可以用 只要 react 16,8以上就可以使用 Hook本身不会影响你的react的理解 恰恰

    2024年02月09日
    浏览(48)
  • 解决useState 异步回调useGetState自定义hooks获取不到最新值

    1、直接传入新值 setState(options); 2、传入回调函数 setState(callBack); 通常情况下 setState 直接使用上述第一种方式传参即可,但在一些特殊情况下第一种方式会出现异常; 例如希望在异步回调或闭包中获取最新状态并设置状态,此时第一种方式获取的状态不是实时的,React 官方文

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包