- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何缓冲我的请求?
目前我在 React 项目中使用 Material UI 的 slider 。当我沿着 slider 移动时,我使用 onChange 属性触发 http post 请求。代码看起来像这样。
<Slider
onChange={handleChange}
valueLabelFormat={valueLabelFormat}
// aria-labelledby="discrete-slider"
aria-labelledby="non-linear-slider"
valueLabelDisplay="auto"
value={value}
min={1}
max={5}
step={0.05}
/>
但是,如果您可以想象,onChange 将会过于频繁,并且将会发送太多的 HTTP 请求。这绝对不推荐。我也不打算使用 onChangeCommited,因为它不是我想要的交互方式。
这就是我想做的:
如果我沿着 slider (或 onChange)移动,onChange 将不断更新该值,但 http 请求只会每 500 毫秒触发一次(使用 onChange 更新最新值)。而不是每次 onChange 都触发一次请求!
我完全不知道如何实现这个...... setInterval 或......?不太确定。我们将不胜感激。
谢谢!
更新
答案是使用 debounce(请看下面 k.s. 的答案)
然而,我的用例与通常的用例略有不同。我在去抖动中使用的函数需要输入。我在handleChange()函数中使用debounce,因为我需要handleChange来设置 slider 的值(以便它平滑滚动)并在执行http调用的函数上调用debounce。
<Slider
onChange={handleChange}
valueLabelFormat={valueLabelFormat}
// aria-labelledby="discrete-slider"
aria-labelledby="non-linear-slider"
valueLabelDisplay="auto"
value={value}
min={1}
max={5}
step={0.05}
/>
这就是我的handleChange()的样子
const boostedLabel ="some label"
const handleChange = (_event, newValue) => {
//Update value back to Slider
setValue(newValue);
const debouncedFunc = () => updateWeightValue(boostedLabel, newValue);
debounce(debouncedFunc, 300, {leading:false, trailing:true});
};
但是这不起作用! slider 移动,但似乎 debouncedFunc 根本没有被触发。
最佳答案
您的用例与其他去抖动用例没有明显不同,您只是还没有完全理解应该如何使用去抖动。调用 debounce 不会调用您的函数;相反,它返回函数的去抖版本,然后可以使用您需要的任意多个参数正常调用该函数。
您不应在 handleChange
中调用 debounce
。您只想在使用它的元素的生命周期内调用它一次 - 然后您在 handleChange
函数中使用该函数的去抖版本(由 debounce
返回)。
最简单的方法是在顶层(完全在组件之外)创建去抖函数。然而,如果页面上可能有多个该类型组件的元素,那么这并不完全安全。如果您有多个元素共享相同的去抖功能,则速度非常快的用户有可能(尽管不太可能)在延迟结束之前(例如 300 毫秒内)更改多个 slider ,在这种情况下,第一个元素更改将没有保存到后端。如果 debounced 函数实际上保存页面上所有可编辑元素的当前状态(而不仅仅是触发更改事件的元素),那么在顶层调用 debounce 就是您想要的。
为了避免顶级反跳的轻微危险,您可以在组件中调用反跳,确保只为元素调用一次。对于下面示例中的第三个 slider ,我在 lazy state initializer 中调用 debounce
并忽略 useState
返回的 setter。然后在每次重新渲染时,将使用相同的去抖函数。经过细微的改变,也可以利用 useRef
代替 useState
或 useCallback
或 useMemo
(尽管对于 useCallback
和 useMemo
来说,每个元素仅调用一次 debounce 的保证并不安全 - documentation 指出“您可以依赖 useMemo 作为性能优化,而不是作为语义保证。”)。
下面的示例显示了 3 个 slider (全部共享相同的状态)。您可以看到 callHttpRequest
只是将其参数记录到控制台。 3 个 slider 均在其 handleChange
函数中以不同的方式调用此函数。第一个根本没有去抖,因此当您移动 slider 时可以看到许多控制台日志。第二个是在顶层进行去抖的,因此当您停止移动 slider 至少 300 毫秒时,您只能看到控制台日志。第三个是在 lazy initializer 内的组件中去抖的。传递给 useState
,其行为与第二个 slider 相同。
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Grid from "@material-ui/core/Grid";
import Typography from "@material-ui/core/Typography";
import Slider from "@material-ui/core/Slider";
import VolumeDown from "@material-ui/icons/VolumeDown";
import VolumeUp from "@material-ui/icons/VolumeUp";
import debounce from "lodash/debounce";
const useStyles = makeStyles({
root: {
width: 300
}
});
const callHttpRequest = (eventSrcDesc, newValue) => {
console.log({ eventSrcDesc, newValue });
};
const topLevelDebounceCallHttpRequest = debounce(callHttpRequest, 300, {
leading: false,
trailing: true
});
export default function ContinuousSlider() {
const classes = useStyles();
const [value, setValue] = React.useState(30);
const handleChangeNoDebounce = (event, newValue) => {
setValue(newValue);
callHttpRequest("volume-no-debounce", newValue);
};
const handleChangeUsingTopLevelDebounce = (event, newValue) => {
setValue(newValue);
topLevelDebounceCallHttpRequest("volume-top-level", newValue);
};
const [stateDebounceCallHttpRequest] = React.useState(() =>
debounce(callHttpRequest, 300, {
leading: false,
trailing: true
})
);
const handleChangeUsingStateDebounce = (event, newValue) => {
setValue(newValue);
stateDebounceCallHttpRequest("volume-useState", newValue);
};
return (
<div className={classes.root}>
<Typography id="continuous-slider" gutterBottom>
Volume (No Debounce)
</Typography>
<Grid container spacing={2}>
<Grid item>
<VolumeDown />
</Grid>
<Grid item xs>
<Slider
value={value}
onChange={handleChangeNoDebounce}
aria-labelledby="continuous-slider"
/>
</Grid>
<Grid item>
<VolumeUp />
</Grid>
</Grid>
<Typography id="continuous-slider-top-level-debounce" gutterBottom>
Volume (Debounce called at top-level)
</Typography>
<Grid container spacing={2}>
<Grid item>
<VolumeDown />
</Grid>
<Grid item xs>
<Slider
value={value}
onChange={handleChangeUsingTopLevelDebounce}
aria-labelledby="continuous-slider-top-level-debounce"
/>
</Grid>
<Grid item>
<VolumeUp />
</Grid>
</Grid>
<Typography id="continuous-slider-useState-debounce" gutterBottom>
Volume (Debounce called in useState lazy initializer)
</Typography>
<Grid container spacing={2}>
<Grid item>
<VolumeDown />
</Grid>
<Grid item xs>
<Slider
value={value}
onChange={handleChangeUsingStateDebounce}
aria-labelledby="continuous-slider-useState-debounce"
/>
</Grid>
<Grid item>
<VolumeUp />
</Grid>
</Grid>
</div>
);
}
这是第二个沙箱,有助于演示顶级去抖与特定于元素的去抖之间的差异:https://codesandbox.io/s/debounce-slider-onchange-jimls?file=/demo.js 。在这个沙箱中,整个组件被渲染两次,延迟为 3 秒而不是 300 毫秒。这提供了充足的时间在延迟结束之前使用顶级去抖来移动两个不同的 slider ,并看到只有第二个 slider 产生控制台日志;而使用特定于元素的去抖函数(通过 useState 管理)对两个 slider 执行相同的操作,会从每个元素生成一个控制台日志。
Lodash 去抖文档:https://lodash.com/docs/4.17.15#debounce
关于javascript - 如何降低 Material UI Slider 因 onChange 触发的 http 请求率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62522994/
情况我想使用 ui-date 在我的应用程序中设置/编辑日期。我使用最新稳定版本的 Angular、Angular-UI、JQuery-UI 等。 问题一旦使用日期选择器选择了日期,我的模型中的日期将
编辑: jQuery UI 可选择小部件内置了一个回调,stop,我需要知道如何以编程方式触发此事件。 (措辞不佳)我已将事件监听器附加到 jQuery UI Selectable Widget 。如
我正在尝试建立一个下一个JS与尾风用户界面提供的反应组件的网络应用程序。顺风用户界面是在幕后使用无头用户界面。。默认情况下,Next JS将构建服务器端组件,除非您在页面顶部添加“使用客户端”。不幸的
我正在尝试建立一个下一个JS与尾风用户界面提供的反应组件的网络应用程序。顺风用户界面是在幕后使用无头用户界面。。默认情况下,Next JS将构建服务器端组件,除非您在页面顶部添加“使用客户端”。不幸的
我正在尝试应用这个 SlickGrid 示例: http://mleibman.github.com/SlickGrid/examples/example4-model.html 到我自己的网络项目。
我想整理我的 Schemas为我的实体类生成,DTO 类位于 Springdoc ui . 我可以对 tags 进行排序和 operations通过以下配置 yml文件,但我的模式不是按排序顺序排列的
有谁知道阻止 ui-sref 重新加载状态的方法吗? 我无法通过“$stateChangeStart”事件执行此操作,因为 ui-sref 仅更改参数而不更改状态名称。 我的左边是书单,左边是书的详细
我正在 jquery ui 对话框中使用 jquery ui 自动完成小部件。当我输入搜索文本时,文本框缩进(ui-autocomplet-loading)但不显示任何建议。 var availabl
我正在尝试将 Kendo UI MVVM 框架与 Kendo UI 拖放机制结合使用;但我很难找到如何将数据从 draggable 对象中删除。 我的代码是这样的...... var viewMode
Kendo UI Web 和 Kendo UI Core 之间有什么区别 https://www.nuget.org/packages/KendoUIWeb http://www.nuget.org/
我正在尝试将 Kendo UI MVVM 框架与 Kendo UI 拖放机制结合使用;但是我很难找到如何从 draggable 对象中删除数据。 我的代码是这样的…… var viewModel =
使用 Angular JS - UI 路由器,我需要从我的父 View project.details 到我的 subview project.details.tasks 进行通信。我的 subvie
KendoUI 版本 2013.3.1119使用 Kendo MVVM 我有一个我构建的颜色选择器,它使用平面颜色选择器和使用调色板的颜色选择器。它们都可以正常运行,但平面颜色选择器的布局已关闭, s
我在非 UI 线程上,我需要创建并显示一个 SaveDialog。但是当我尝试显示它时:.ShowDialog() 我得到: "An unhandled exception of type 'Syst
我正在试验 jquery-ui 并查看和克隆一些示例。在一个示例(自动完成的组合框)中,我看到一个带有 ui-widget 类的 anchor (a) 元素,它与包含的 css 文件中的 .ui-wi
我需要返回一个 UI 列表,我用这个方法: getList(): Observable { return this.httpClient.get("/api/listui").pipe
我有 ui-grids在 angular-ui-tabs ,它们位于 ng-if 中以避免呈现问题。如果有更多数据并且网格进入滚动模式,则单击选项卡时数据会完全消失。我相信这是一个 ui-grids-
这似乎是一个通用的问题,与其他几个 React 开源框架相比,我真的很喜欢 Material ui 的可扩展性。 问题 “@material-ui/core”和“@material-ui/lab”中的
我有一个根页面(index.html),带有侧边栏(“菜单”)和主要内容 div(“主”),因此有两个 ui-view div - 一个称为“菜单”,一个称为“主”。 当主要内容区域有网站列表 (/s
有人在http://jsfiddle.net/hKYWr/上整理了一个很好的 fiddle 。关于使用 angular-ui 和 jqueryui sortable 来获得良好的可排序效果。 如何在两
我是一名优秀的程序员,十分优秀!