返回顶部
首页 > 资讯 > 精选 >vue使用节流函数会遇到什么问题
  • 855
分享到

vue使用节流函数会遇到什么问题

2023-06-15 03:06:07 855人浏览 八月长安
摘要

小编给大家分享一下Vue使用节流函数会遇到什么问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!举一个? 业务场景概念:关于防抖函数的介绍关于addEventLi

小编给大家分享一下Vue使用节流函数会遇到什么问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

举一个? 业务场景

vue使用节流函数会遇到什么问题

概念:

关于防抖函数的介绍

关于addEventListener

使用示例:

function debounce(fn) {        let timeout = null; // 创建一个标记用来存放定时器的返回值        return function () {            clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉            timeout = setTimeout(() => {                // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的                // interval 间隔内如果还有字符输入的话,就不会执行 fn 函数                fn.apply(this, arguments);            }, 500);        };    }    function sayHi() {        console.log('防抖成功');    }    var inp = document.getElementById('inp');    inp.addEventListener('input', debounce(sayHi)); // 防抖

在vue中使用?

首先说一下之前的踩坑行为

下面的代码为简易版的一个场景

function debounce(fn) {        let timeout = null; // 创建一个标记用来存放定时器的返回值        return function () {            clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉            timeout = setTimeout(() => {                // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的                // interval 间隔内如果还有字符输入的话,就不会执行 fn 函数                fn.apply(this, arguments);            }, 500);        };   }

错误的使用方式

<template>    <div class="search-view">        <div class="header">            <Search                 class="search-box"                 v-model='searchValue'                 @input='getSearchResult'                 placeholder='搜索想要的好物' />            <span @click="GoBack" class="cancel">取消</span>        </div>        <div class="serach-view-content" />    </div></template><script>import Search from './components/Search';import debounce from './config';export default {    name: 'SearchView',    components: {        Search    },    data() {        return {            searchValue: ''        };    },    methods: {        getSearchResult() {            debounce(function() {                console.log(this.searchValue);            })();        }    }};</script>

为什么错误?

源码层级分析

vue模板编译 的解析事件

export const onRE = /^@|^v-on:/export const dirRE = /^v-|^@|^:/function processAttrs (el) {  const list = el.attrsList  let i, l, name, value, modifiers  for (i = 0, l = list.length; i < l; i++) {    name  = list[i].name    value = list[i].value    if (dirRE.test(name)) {      // 解析修饰符      modifiers = parseModifiers(name)      if (modifiers) {        name = name.replace(modifierRE, '')      }      if (onRE.test(name)) { // v-on        name = name.replace(onRE, '')        addHandler(el, name, value, modifiers, false, warn)      }    }  }}

总结: 实例初始化阶段调用的初始化事件函数initEvents实际上初始化的是父组件在模板中使用v-on或@注册的监听子组件内触发的事件

vue的事件机制

Vue.prototype.$on = function(event, fn) {    const vm = this;    if (Array.isArray(event)) {        for (let i = 0; i < event.length; i++) {            this.$on(event[i], fn);        }    } else {        //这个_events属性就是用来作为当前实例的事件中心,所有绑定在这个实例上的事件都会存储在事件中心_events属性中。        (vm._events[event] || (vm._events[event] = [])).push(fn);    }    return vm;};Vue.prototype.$emit = function(event) {    const vm = this;    let cbs = vm._events[event];    if (cbs) {        cbs = cbs.length > 1 ? toArray(cbs) : cbs;        let args = toArray(arguments, 1);        for (let i = 0; i < cbs.length; i++) {            try {                cbs[i].apply(vm, args);            } catch (e) {                handleError(e, vm, `event handler for "${event}"`);            }        }    }    return vm;};

vue的initState中 调用了initMethods方法

initMethods中挂在methods方法到this上

for (const key in methods) {        if (process.env.node_ENV !== 'production') {            if (methods[key] == null) {                warn(                    `Method "${key}" has an undefined value in the component definition. ` +                        `Did you reference the function correctly?`,                    vm                );            }            // 如果和props中某个属性名重名了 抛出异常            if (props && hasOwn(props, key)) {                warn(`Method "${key}" has already been defined as a prop.`, vm);            }                        if (key in vm && isReserved(key)) {                warn(                    `Method "${key}" conflicts with an existing Vue instance method. ` +                        `Avoid defining component methods that start with _ or $.`                );            }            // 将method绑定到实例 vm上  这样我们就可以通过this.xxx 来访问了            // 同时如果在vue中  let m1 = this.xxx  m1() this也指向vue            vm[key] = methods[key] == null ? noop : bind(methods[key], vm);        }

划重点:

  • 子组件$emit('input事件')

  • 父组件接收事件

getSearchResult.apply(this, agrs)<===>  apply的调用可以写成下面的形式this.getSearchResult(args)// 进而变成这种执行debounce(function() {      console.log(this.searchValue);})();// 这里的debounce 返回了一个函数 于是变成(function (fn) {      clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉      timeout = setTimeout(() => {          // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的          // interval 间隔内如果还有字符输入的话,就不会执行 fn 函数          fn.apply(this, arguments);      }, 500);})()// 到这里  其实就变成了匿名函数的自执行// 由于每次触发input都会返回一个新的匿名函数  生成一个新的函数执行栈  所以防抖失效~

那么应该如何调用

<template>    <div class="search-view">        <div class="header">            <Search                class="search-box"                v-model='searchValue'                @input='getSearchResult()'                placeholder='搜索想要的好物'            />            <span                @click="goBack"                class="cancel">取消</span>        </div>        <div class="serach-view-content">                    </div>    </div></template><script>import debounce from 'lodash.debounce';export default {    name: 'SearchView',    components: {        Search,    },    data() {        return {            searchValue: '',        };    },    methods: {        getSearchResult: debounce(function () {            console.log(this.searchValue);        }, 500),    },};</script>

分析执行过程

getSearchResult().apply(this, args)<===> 忽略参数行为 只关注执行栈let func = function () {    clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉    timeout = setTimeout(() => {        // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的        // interval 间隔内如果还有字符输入的话,就不会执行 fn 函数        fn.apply(this, arguments);    }, 500);};this.func(args)<===>

子组件触发input的行为  返回的始终是一个同一个函数体  防抖成功

Vue的优点

Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度快等优势,Vue中页面使用的是局部刷新,不用每次跳转页面都要请求所有数据和dom,可以大大提升访问速度和用户体验。

以上是“vue使用节流函数会遇到什么问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: vue使用节流函数会遇到什么问题

本文链接: https://lsjlt.com/news/277367.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue使用节流函数会遇到什么问题
    小编给大家分享一下vue使用节流函数会遇到什么问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!举一个 业务场景概念:关于防抖函数的介绍关于addEventLis...
    99+
    2023-06-15
  • vue里swiper会遇到什么问题
    这篇文章给大家分享的是有关vue里swiper会遇到什么问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实例: 错误(无法显示出分页器按钮,此功能不适用与for循环出来的图片,...
    99+
    2024-04-02
  • vuepress会遇到什么问题
    这篇文章主要为大家展示了“vuepress会遇到什么问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vuepress会遇到什么问题”这篇文章吧。以下是几个已知...
    99+
    2024-04-02
  • Ajax中get和post使用会遇到什么问题
    这篇文章将为大家详细讲解有关Ajax中get和post使用会遇到什么问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用get遇到的问题:1.问题一. 缓存:当每次访问...
    99+
    2024-04-02
  • Pureftpd中使用防火墙会遇到什么问题
    这篇文章主要介绍了Pureftpd中使用防火墙会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先,打开连向FTP服务器的21端口.此外,应该允许来自<=2...
    99+
    2023-06-16
  • 安装MySql8.0.19会遇到什么问题
    这篇文章主要介绍了安装MySql8.0.19会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、ERROR 1820 (HY00...
    99+
    2024-04-02
  • Gentoo中proftpd会遇到什么问题
    这篇文章主要介绍了Gentoo中proftpd会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我在使用proftpd中遇到了一些问题,并解决了它们。这些问题可能只...
    99+
    2023-06-16
  • VueTypeScript使用eval函数遇到的问题
    目录简单的代码实例问题解决方法问题的原理一劳永逸的方法正常情况下,项目里不会用eval函数,但是万一要调用一个全局的js库,就需要用eval做些骚操作,这个时候编译会提示:is st...
    99+
    2023-01-28
    Vue TypeScript eval函数 Vue eval函数
  • 使用ogg从oracle 同步mysql会遇到什么问题
    这篇文章主要介绍了使用ogg从oracle 同步mysql会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ORACLE ...
    99+
    2024-04-02
  • seata springcloud整合会遇到什么问题
    这篇文章给大家分享的是有关seata springcloud整合会遇到什么问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SEATA概要seata 是alibaba 出的一款分布式事务管理器,他有侵入性小,实现...
    99+
    2023-06-20
  • sqoop从hive导到mysql会遇到什么问题
    这篇文章主要介绍了sqoop从hive导到mysql会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。环境hive 版本hive-...
    99+
    2024-04-02
  • vue使用mui遇到的问题怎么办
    小编给大家分享一下vue使用mui遇到的问题怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用mui遇到的坑记录主要用到webpack打包工具与mui,mi...
    99+
    2023-06-29
  • React Native打包apk会遇到什么问题
    这篇文章给大家分享的是有关React Native打包apk会遇到什么问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。生成一个签名密钥在项目的目录下打开cmd命令窗口输入一下命令运行:keytool ...
    99+
    2023-05-30
    react native
  • SpringBoot定时任务会遇到什么问题
    这篇文章主要为大家展示了“SpringBoot定时任务会遇到什么问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot定时任务会遇到什么问题”这篇文章吧。前言springboot...
    99+
    2023-05-30
    spring boot
  • pyinstaller打包cx_Oracle库会遇到什么问题
    这篇文章主要介绍pyinstaller打包cx_Oracle库会遇到什么问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!pyinstaller打包cx_Oracle库问题处理记录下载cx_Oracle在window...
    99+
    2023-06-02
  • Java中使用Map会遇到哪些问题
    Java中使用Map会遇到哪些问题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下1、“你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的...
    99+
    2023-05-31
    java ava map
  • 使用taro开发微信小程序会遇到什么问题
    这篇文章主要介绍了使用taro开发微信小程序会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Taro,京东凹凸实验室出品的适配多...
    99+
    2024-04-02
  • springboot访问静态资源会遇到什么问题
    这篇文章主要介绍了springboot访问静态资源会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。访问静态资源遇到的坑及解决开始是以这种结构进行的,结果页面上一篇...
    99+
    2023-06-29
  • Spring延迟初始化会遇到什么问题
    本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。List<坑> 坑列表 = new ArrayList<>(2);首先,让我们回顾一下 Sp...
    99+
    2023-08-03
  • 使用http代理时会遇到哪些问题
    本篇内容主要讲解“使用http代理时会遇到哪些问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用http代理时会遇到哪些问题”吧!1、设置代理IP后,不及待地想要访问下浏览器查下IP,但发现...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作