写的 React 组件有 bug,知道原因但不会解决,求教

19 小时 40 分钟前
 lisianthus

完整代码: https://codesandbox.io/p/sandbox/d8kjg2

最近自娱自乐时,写了一个类似高中物理的木板-滑块组件,可以根据木板的角度来控制小球的位置,见图: https://imgur.com/a/Eo2briC

组件有个问题,在旋转到 90 度附近时,值会突然从 0 跳到 100: https://imgur.com/a/kWmm3I4

我知道问题出在 handleMouseMove 函数里,斜率 k 在 90 度附近发生了跳变,但不会解决,求教

987 次点击
所在节点    React
11 条回复
MozzieW
19 小时 10 分钟前
准确的说法是: 垂直后,继续往左右两边旋转的正负值导致的。
考虑到另外一点,放开后回归到水平的位置时数值要保留一致,就是 0 位置松开鼠标后还是 0 ,100 位置松开鼠标后还应该是 100 ,我认为这个算正常效果,不是 Bug 。
yanxin1111
19 小时 8 分钟前
90 度顺时针再旋转是 0 ,逆时针再旋转就是 100
我感觉逻辑没问题
chairuosen
19 小时 5 分钟前
好家伙,用这个滑块调整音量,人都要疯
1L 说得对,feature
lisianthus
18 小时 30 分钟前
@MozzieW 其实这个也是斜率跳变导致的。rotate 角度从正跳到负,看起来 0 的位置没变,但实际上原先 0 的位置变成了 100 ,所以过渡动画看起来奇怪
tutouguai
17 小时 58 分钟前
不能过中线就重置为 100 得滑块重置下滑动作的时候才重置 value value 值一定要跟滑块重置进行绑定
zivW
17 小时 45 分钟前
现在这样旋转好像有点问题。 用 Math.atan2(dy , dx) 试试呢

> atan2 方法返回一个 -pi 到 pi 之间的数值,表示点 (x, y) 对应的偏移角度。这是一个逆时针角度,以弧度为单位
lanced
17 小时 30 分钟前
5L 说的对,旋转角度从正到负时 value 的值不更新,滑块重置时再去更新 Value
h1298841903
17 小时 20 分钟前
你这个木板是不是要控制旋转角度啊?都能倒过来,这样也不知道,哪边是音量大,哪边是音量小。
caocong
17 小时 4 分钟前
把 op 的稍微改了一下 https://codesandbox.io/p/sandbox/d8kjg2

mousedown 的时候加个变量判断是从前半开始拖动还是后半开始拖动:

const { x } = centerPointRef.current;
isEnd = evt.clientX - x > 0;

mouseover 里判断是否拖动到反向位置,如果反向了加 180 度:

const isReverse =
(isEnd && evt.clientX - x < 0) || (!isEnd && evt.clientX - x > 0);
const deg = Math.atan(k) + (isReverse ? Math.PI : 0);

slopeRef.current = isReverse ? -k : k;
el.style.transform = `rotate(${deg}rad)`;
caocong
17 小时 0 分钟前
lisianthus
16 小时 39 分钟前
@caocong 牛的,完美解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1103933

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX