首页 > 其他分享 >关于为什么监听effect时开启immediate第一次会返回undefined

关于为什么监听effect时开启immediate第一次会返回undefined

时间:2024-08-27 20:27:16浏览次数:8  
标签:onInvalidate 异步 const 请求 effect immediate watchEffect 点击 undefined

说白了就是源码这样写的,这里再科普下WatchEffect

WatchEffect和Watch不同之处:

  1. 进入页面马上就回调用一下
  2. 有许多变体,WatchEffectSync等,都是WatchEffectOption下面的属性flush?: 'pre' | 'post' | 'sync';

当然可以帮你理解 watchEffect 的用法和场景。

场景描述

你提到的场景涉及到一个页码组件,用户可以点击页码来请求数据。如果用户快速点击多个页码,会导致多个异步请求并且可能出现数据错乱的问题。

问题分析

  1. 请求错乱:如果用户快速点击,从1到5连续请求,最终显示的内容可能不是用户想要的最后一页(例如第5页),而是第1页的响应最先返回,导致页面显示不准确。

  2. 带宽浪费:快速点击导致的多次请求,前几次的请求可能是用户并不关心的,造成了不必要的带宽浪费。

解决方案

为了处理这些问题,watchEffect 提供了一个 onInvalidate 的回调函数,可以用来取消之前的异步请求。

使用 watchEffect

下面是如何使用 watchEffectonInvalidate 的示例代码:

import { ref, watchEffect } from 'vue';

const currentPage = ref(1);

watchEffect(onInvalidate => {
  const token = performAsyncOperation(currentPage.value);

  // 注册失效回调
  onInvalidate(() => {
    // 取消之前的请求
    token.cancel();
  });
});

function performAsyncOperation(page) {
  // 这里是你异步请求的逻辑
  const controller = new AbortController();
  const signal = controller.signal;

  fetch(`/api/data?page=${page}`, { signal })
    .then(response => response.json())
    .then(data => {
      // 处理数据
    });

  return {
    cancel: () => controller.abort() // 取消请求
  };
}

解释

  • watchEffect:当 currentPage 变化时,它会重新执行传入的函数。
  • onInvalidate:每次 watchEffect 被重新执行时,都会调用这个回调来清理之前的请求。
  • token.cancel():通过调用这个方法来取消之前的请求,避免了不必要的带宽浪费和数据错乱。

总结

使用 watchEffectonInvalidate 可以有效地管理异步请求,确保只有最新的请求被处理,避免了由于快速点击导致的请求错乱和资源浪费。这种方式使得你的组件更加高效和响应迅速。

标签:onInvalidate,异步,const,请求,effect,immediate,watchEffect,点击,undefined
From: https://www.cnblogs.com/HugoKwong/p/18383451

相关文章

  • [C++ Error] f0202.cpp(13): E2268 Call to undefined function 'system'
    system('pause');解决方法,修改代码:system("pause");[C++Error]f0202.cpp(13):E2268Calltoundefinedfunction'system'错误解释:这个错误表明您在C++代码中尝试调用了一个未定义的函数system。system函数是C标准库中的函数,用于执行一个字符串中给出的命令。在C++中,......
  • YOLOv8改进 | 融合改进 | C2f融合EffectiveSE-Convolutional【完整代码 + 小白必备】
     秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转......
  • vue3 响应式 API:watch()、watchEffect()
    watch()基本概念watch()用于监视响应式数据的变化,并在数据变化时执行相应的回调函数。可以监视单个响应式数据、多个响应式数据的组合,或者一个计算属性。返回值返回一个函数,调用这个函数可以停止监视。特点watch()默认是懒侦听的,即仅在侦听源发生变化时才执行回调函......
  • Effective-Java-Chapter9-通用程序设计
    https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/blob/dev/Chapter-9/Chapter-9-Introduction.md准则一将局部变量的作用域最小化不要在变量使用之前就申明,在需要使用的时候进行申明。当然这条准则不是那么绝对,大部分时候遵守就好。......
  • 021、Vue3+TypeScript基础,使用watchEffect全自动监视修改的对象
    01、App.vue代码如下:<template><divclass="app"><h2>{{title}}</h2><!--使用了ref来获取子组件的属性--><Person/></div></template><scriptlang="ts"setupname="App"......
  • 对C工程使用GTest与Gmock函数未定义(undefined reference)排错记录
    在使用Gtest过程中出现了一些被测参数和函数未定义的问题调了三天很是头疼1、对象只申明未定义在配置文件中该结构体数组已经被定义完成,错误排除2、使用对象的错误定义(签名不匹配)  C++提供了函数重载,当函数的声明与调用时,输入参数与声明是不同时会报undefinedrefer......
  • python系列&deep_study系列:TOCH_npu不适配报错packages/torchaudio/lib/libtorchaudio
    TOCH_npu不适配报错packages/torchaudio/lib/libtorchaudio.so:undefinedsymbol:_ZNK5torch8autograd4Node4nTOCH_npu不适配报错packages/torchaudio/lib/libtorchaudio.so:undefinedsymbol:_ZNK5torch8autograd4Node4n报错:背景:解决办法:TOCH_npu不......
  • useEffect
    useEffect完整的执行过程创建effect和保存effect首先在render阶段的beginWork方法中根据workInProgress.tag为FunctionComponent类型的组件会调用renderWithHooks方法执行组件然后拿到组件的执行结果创建workInProgressfiber。而在执行组件的过程中遇到useEffe......
  • 论文笔记:GeoShapley: A Game Theory Approach toMeasuring Spatial Effects in Machin
    (GeoShapley:机器学习模型中测量空间效应的博弈论方法)话题点:geoshapley、XAI、空间效应、非线性一、引言机器学习和人工智能(AI)越来越多地用于模拟地理空间现象,在各个领域都有很好的表现。可解释人工智能(XAI)领域的最新进展为解释黑箱机器学习提供了一种解决方案。排列特征......
  • 004.Vue3入门,使用绑定属性时undefined和disabled用法
    1、代码如下:<template><divv-bind:id="myId1"v-bind:class="testCls">测试1</div><divv-bind:id="myId2"v-bind:title="testTitle">测试2</div><div:id="myId3":class="te......