javascript - 滚动事件无意中更改了 Material UI 滑块值
问题描述
我有一个使用 Material UI 的 React 应用程序。该应用程序在很多地方都实现了滑块组件(https://material.io/components/sliders)。使用触摸屏设备时,我在尝试向上或向下滚动页面时无意中影响了滑块组件(值正在更改)。其他页面组件不会发生这种情况,我怀疑这是因为滑块确实(并且应该)响应滑动事件。
Material UI 的文档暗示了一种区分“滚动”和“滑动”的方法(https://material.io/design/interaction/gestures.html#types-of-gestures)。有没有办法让我向我的滑块组件指示应该忽略“滚动”。或者,我可以区分垂直或水平滑动,告诉滑块忽略垂直滑动吗?
解决方案
我想出了一个相当优雅的解决方案,我相信它允许用户滚动,如果他们的滚动位置开始在轨道上而不是在拇指上。这复制了本机 HTML 范围输入,所以我觉得这是最好的解决方案。
这有两个部分
第 1 步,允许touch-action
滑块根元素,因为它默认被禁用并阻止用户在滑块上开始滚动
const useStyles = makeStyles({
sliderRoot: {
touchAction: "auto"
}
});
return (
<Slider
classes={{
root: classes.sliderRoot
}}
...
/>
第 2 步,使用 a 停止在根元素上的传播ref
const ref = useRef(null);
useEffect(() => {
if (ref.current) {
ref.current.addEventListener(
"touchstart",
(e) => {
const isThumb = e.target?.dataset.index;
if (!isThumb) {
e.stopPropagation();
}
},
{ capture: true }
);
}
});
return (
<Slider
ref={ref}
...
/>
这是一个关于 Codesandbox 的完整演示。
推荐阅读
- asp.net - WPF ManagementScope 访问被拒绝
- django - Django 多条删除记录
- android - 我在使用带有 CameraX 的 PreviewView 时遇到了问题?
- python - 有没有办法在 AWS Lambda 上使用 PyGithub
- node.js - 为 https 配置 nginx (docker) 后应用程序停止
- python - 训练精度高,验证精度低 CNN 二元分类 keras
- c++ - 类模板 - 如何编写构造函数
- typescript - 使用 express.Route() 部署 Firebase Cloud 函数时出错
- swift - 为什么在 swift 的 mac 命令行工具中使用 DispatchQueue.main.async 时需要运行循环?
- c# - 使用openxml的ppt中的段落没有更改为所需的格式