Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Svelte Store中使用Throttle

在Svelte Store中使用Throttle
EN

Stack Overflow用户
提问于 2021-03-30 12:02:07
回答 1查看 108关注 0票数 0

我正在尝试在Svelte中throttle一个函数的执行。然而,在自动订阅中使用throttle似乎会打破它。考虑以下示例(REPL):

代码语言:javascript
运行
AI代码解释
复制
<script>
  import throttle from 'lodash.throttle';
  import { writable } from 'svelte/store';
    
  const arr = writable(['A', 'B', 'C']);
    
  function foo(val) {
    console.log('foo: ', val);
  }
</script>

{#each $arr as a}
  <button on:click={throttle(() => { foo(a); }, 1000)}>
    Button {a}
  </button>
{/each}

foo(a)的执行完全没有节流。如果删除{#each $arr as a}块并仅将一个字符串传递给foo,您将看到它按预期工作。

我假设这与事件循环和Svelte自动订阅的工作方式有关,但不知道确切的原因。想知道是否有人知道a)为什么会发生这种情况,b)可能的解决方案是什么?

EN

回答 1

Stack Overflow用户

发布于 2021-03-30 15:42:02

如果您查看Svelte为此生成的代码,您可以看到,当您传递一个存储值时,它会在每次单击时重新生成节流函数。这将在每次单击时重置限制器计时器。

代码语言:javascript
运行
AI代码解释
复制
dispose = listen(button, "click", function () {
    if (is_function(throttle(click_handler, 1000))) 
        throttle(click_handler, 1000).apply(this, arguments);
});

无论出于什么原因,在传递常规字符串时都不会发生这种情况。

代码语言:javascript
运行
AI代码解释
复制
dispose = listen(button, "click", throttle(click_handler, 1000));

这可能是Svelte中的一个bug,但我不确定。在GitHub repo上打开一个问题可能是值得的。

我可以通过提前生成限制函数来解决这个问题:

代码语言:javascript
运行
AI代码解释
复制
<script>
    import throttle from 'lodash.throttle';
    import { writable } from 'svelte/store';
    
    const arr = writable(['A', 'B', 'C']);
    
    function foo(val) {
        console.log('foo: ', val);
    }
    
    $: throttledFns = $arr.map(val => getThrottled(val));
    
    function getThrottled(val) {
        console.log('getting throttled');
        return throttle(() => { foo(val); }, 1000);
    }
</script>

{#each $arr as a, idx}
    <button on:click={throttledFns[idx]}>
        Button {a}
    </button>
{/each}

这将在存储数组更改时重新生成限制函数,但不是在每次单击时。

你也可以生成foo的一个限速版本并使用它,但这会限制所有对按钮的点击(例如,如果你点击A,然后点击B,那么点击B也会被限流)。

代码语言:javascript
运行
AI代码解释
复制
<script>
    // as before
    
    const throttledFoo = throttle(foo, 1000);
</script>

{#each $arr as a, idx}
    <button on:click={() => throttledFoo(a)}, 1000)}>
        Button {a}
    </button>
{/each}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66870585

复制
相关文章
使用Svelte开发Chrome Extension
起因 最近Chrome浏览器升级到96大版本后,二维码入口从地址栏移动至二级菜单。这对H5前端开发来说不太友好,每次需要页面二维码时都需要多点两下(* ̄︿ ̄)。
程序猿川子
2022/05/28
8740
使用Svelte开发Chrome Extension
开发中使用throttle和debounce
上面的两个问题解决后能大大提升用户体验 解决它们就用到了throttle和debounce
码客说
2019/10/22
1.7K0
svelte
我宁肯忘掉亏欠自己的而不愿忘掉亏欠别人的。——贝多芬 分享一个前端框架svelte 官网:https://svelte.dev/ 仓库链接:https://github.com/sveltejs/svelte 语法非常的简单容易上手 <script> let name = 'world'; </script> <h1>Hello {name}!</h1> 同样是响应式 非常的有意思 使用也很简单 npm create svelte@latest myapp cd myapp npm insta
阿超
2023/03/23
4340
svelte
React Js 中创建和使用 Redux Store
本文,我们将学习在 React 应用中怎么创建 Redux Store。同时,我们将分享怎么使用 Redux store 去管理复杂的 states。
Jimmy_is_jimmy
2023/08/11
3460
React Js 中创建和使用 Redux Store
JS:debounce、throttle
如果我们监听这些事件,并按浏览器的触发频率响应,极可能造成页面卡顿、抖动,甚至浏览器崩溃。
WEBJ2EE
2019/07/19
1.2K0
JS:debounce、throttle
使用 requestAnimationFrame 替代 throttle 优化页面性能
前面的文章《函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用》中讲过,对于 mousemove, scroll 这类事件,一般的解决方法是使用 throttle 节流函数,但是节流函数解决这类问题并不完美,存在两点缺陷:
CS逍遥剑仙
2020/04/12
2.4K0
taro中创建store
上一篇文章,我们教大家创建了reducers,本次内容教大家用reducers创建store。
挥刀北上
2022/05/11
4670
taro中创建store
React vs Svelte
在 JavaScript 前端开发框架中,Svelte 算是一个新来的搅局者,在网上我们已经听到很多关于 Svelte 的哔哔。因此我决定试试这个家伙,顺便跟 React 做个简单的比较。
Nealyang
2022/03/17
3.1K0
React vs Svelte
ENVI中App Store插件的安装与使用
  本文介绍在ENVI软件中,App Store这一拓展工具的下载、安装与使用方法。
疯狂学习GIS
2023/06/26
7770
ENVI中App Store插件的安装与使用
开箱Svelte
Svelte基本使用方式上和Vue很相似,组件的HTML,CSS,JS写在一个.svelte的文件中。
小刀c
2022/08/16
1K0
基于Svelte.js弹窗插件svelte-popup
前段时间有分享一个svelte自定义导航条+菜单栏(Tabbar/Navbar)组件。这次分享一个svelte开发自定义弹框sveltePopup插件。
andy2018
2022/03/19
7.9K0
JS 手写: 节流 (throttle)
# 思路 节流函数原理:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效 # 场景 拖拽 固定时间内只执行一次,防止超高频次触发位置变动 缩放 监控浏览器 resize 动画 避免短时间内多次触发动画引起性能问题 # 实现 /** * @param {Function} fn * @param {Number} delay */ function throttle (fn, delay = 50) { let lastTime = 0; return
Cellinlab
2023/05/17
5370
electron-store在webpack打包中的Cannot find module "." 问题
之前项目中遇到一个问题,使用了脚手架,并且引入了electron-store这个包。在开发模式下是能正常运行的,但是打包后却会包Cannot find module “.” 的问题,类似的issue在github的electron的上也有很多人提到,最终,在那个脚手架的issue下找到了答案
ACK
2020/01/14
3K0
有关于store的使用
文件目录.png import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) import user from './modules/user' import permission from './modules/permission' import money from './modules/money' import menu from './modules/menu' /// 在一个index.js 中引入多个js文件 export
用户4344670
2019/09/27
6090
有关于store的使用
vueX中store对象准备
用户10781437
2023/10/10
1440
使用腾讯云开发来部署Svelte Sapper应用
Svelte是前端框架界新秀,以小巧、响应式、无virtual Dom著称,就像React有对应的SSR框架Next.js一样,Svelte也有自己官方的SSR 框架Sapper,也是小巧,灵活。
腾讯云开发TCB
2020/06/03
1.6K0
debounce与throttle区别
在2011年,Twitter网站曾爆出一个问题:在主页往下滚动时,页面会变得缓慢以致没有响应。John Resig发表了一篇文章《 a blog post about the problem》指出直接在scroll事件上面绑定高消耗的事件是一个多么愚蠢的想法。现在项目中大家都会对类似的scroll或者resize事件都进行了节流控制,下述是我们经常用到,也是《JavaScript高级程序设计》- JavaScript高级技巧中提及的节流方式。
奋飛
2019/08/15
6340
‘underscore系列之throttle“‘
在说underscore函数节流之前, 还是明确概念, 什么是函数节流。函数节流简单来说就是'开源节流', 什么意思呢?就是减少某个函数调用的太频繁, 降低频次。一般来讲, 对于dom的频繁操作会引起浏览器的重绘或者重排, 这个时候我们就可以来使用节流不要让他过快的操作dom, 从而页面渲染起来也会更加流畅。 举个场景: dom元素的移动与拖拽, 我默认都做过这个功能。对于dom元素的频繁拖拽, 对于一些性能不太好的浏览器(说的就是你IE)会有很大的损耗, 这个时候我们就可以适当的去降低这个事件的调用频次。 当然调用的频次也要有一个合适的阈值。不然也会引出意外的问题。。。
用户9298250
2022/01/10
3660
vuex使用 store.js
store.js 状态汇总文件 暴露 import Vue from 'vue' import Vuex from 'vuex' import createPersistedState from 'vuex-persistedstate' //存储插件 import actions from './store/actions' import mutations from './store/mutations' import state from './s
yangdongnan
2019/03/28
1.2K0
Svelte3-Admin基于svelte-ui管理后台系统
前几天有给大家分享一个 svelte-ui 桌面pc组件库。今天再来分享一个基于svelte ui 开发的中后台管理前端解决方案。
andy2018
2022/09/18
2.5K1

相似问题

键入svelte $store变量

10

订阅svelte store中特定对象更改

226

从Svelte Store获取/读取值

125

Svelte未能解析导入"svelte-persistent-store/dist/local“

112

在ReactJS中使用Lodash _.throttle()

146
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档