material-ui 滑块标记点击不准确

vnjpjtjt  于 4个月前  发布在  其他
关注(0)|答案(9)|浏览(50)

重复问题

  • 我已搜索现有的问题

最新版本

  • 我已测试了最新版本

重现步骤 🕹

链接到实时示例:
步骤:

  1. 点击标记的文本
  2. 滑块移动到点击位置,但不是标记的精确值

当前行为 😯

  • 无响应*

预期行为 🤔

  • 无响应*

上下文 🔦

  • 无响应*

你的环境中 🌎

  • 无响应*
carvr3hs

carvr3hs1#

屏幕录制从01-18-2023.05.52.41.PM开始。

shstlldc

shstlldc2#

标记标签上没有任何点击事件。点击发生在滑块上(作为拖动的起始事件)。你是如何得出这是你期望的行为的结论的?你是否对其他UI库进行了基准测试,行为有所不同?

z4iuyo4d

z4iuyo4d3#

因为它是可点击的,当我将鼠标悬停在上面时,它会变成指针。我希望能够像快速选择一样工作,而不是移动鼠标去找到正确的位置,对于大多数用途来说。
我在noUiSlider中看到了这个功能。

iyr7buue

iyr7buue4#

当我点击标记时,我希望滑块的值被设置为与marks数组中的对象中的value完全相等。我认为这只是可拖动区域的一部分,有点奇怪。
例如:marks = [{value:maxVal/4, label:'25%'}, {value:maxVal/2, label:'50%'} ....]
当我点击标记时,我希望得到精确的百分比。点击50%后,值范围从47-53%,这取决于你点击了50%的哪个位置,这是一个奇怪的用户体验!有没有办法我们可以直接将滑块的值设置为marks中传递的值?

xnifntxz

xnifntxz5#

我认为相关的代码片段更改可以在这里找到:
https://github.com/mui/material-ui/blob/master/packages/mui-base/src/SliderUnstyled/SliderUnstyled.tsx#L236
我对MUI的内部结构并不熟悉,所以我认为这比活跃的贡献者花费的时间要长得多。然而,这非常烦人,所以如果一段时间内没有被采纳,我可能会回来解决这个问题。

dfty9e19

dfty9e196#

我认为这应该被视为一个错误。实际上,它完全使滑块标记对我的任务(在回放时间轴上显示书签)毫无用处,我无法想象当前行为在任何其他任务中都是可取的。

ccrfmcuu

ccrfmcuu7#

我可以确认这个问题存在于MUI滑块上,标签应该在点击它们时移动到给定的位置。其他所有库都有类似的实现。

disbfnqx

disbfnqx8#

这也是我项目的一个问题。绝对同意,在当前状态下,这些标记除了视觉装饰之外毫无用处。如果用户点击它们,说实话,用户体验比没有它们还要差。如果这个问题不解决,我至少希望有一个切换按钮,使这些标记不可选,纯粹只起到视觉辅助作用。

elcex8rz

elcex8rz9#

可以使用以下方法解决:

const ClickableSliderMarkLabel = (props: any) => {
  const { labelOnChange, ownerState, ...restProps } = props;

  const markValue = ownerState?.marks[props?.["data-index"]]?.value;

  const noop = useCallback((e: React.SyntheticEvent) => {
    e.stopPropagation();
  }, []);

  const onClick = useCallback(
    (e: React.SyntheticEvent) => {
      e.preventDefault();
      e.stopPropagation();

      if (markValue != null) {
        labelOnChange(e, markValue);
      }
    },
    [labelOnChange, markValue],
  );

  return (
    <SliderMarkLabel
      onMouseDown={noop}
      onTouchStart={noop}
      onClick={onClick}
      sx={useMemo(() => ({
        ...props?.sx,
        userSelect: "none",
      }), [props?.sx])}
      ownerState={ownerState}
      {...restProps}
    />
  );
};

export const MySlider = (props: React.ComponentProps<typeof Slider>) => {
  return (
    <Slider
      slotProps={{
        markLabel: {
          // @ts-ignore
          labelOnChange: props.onChange,
        },
      }}
      slots={{
        markLabel: ClickableSliderMarkLabel,
      }}
      {...props}
    />
  );
};

相关问题