- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想构建一个钩子(Hook)来改变 mousemove
和 mousedown
事件中元素的宽度。
我正在使用以下代码(实际上有效):
import React, { useState, useCallback, useEffect, useRef } from "https://cdn.skypack.dev/react";
import ReactDOM from "https://cdn.skypack.dev/react-dom";
const useMouseDelta = (initialWidth) => {
const [dragging, setDragging] = useState(false);
const [result, setResult] = useState(initialWidth);
const origin = useRef(initialWidth);
const handleMouseDown = useCallback((e) => {
origin.current = e.clientX;
setDragging(true);
}, []);
const handleMouseUp = useCallback((e) => {
setDragging(false);
}, []);
const handleMouseMove = useCallback((e) => {
if (!dragging) {
return;
}
setResult(result + (e.clientX - origin.current));
},
[dragging]
);
useEffect(() => {
window.addEventListener('mousedown', handleMouseDown);
window.addEventListener('mouseup', handleMouseUp);
window.addEventListener('mousemove', handleMouseMove);
return () => {
window.removeEventListener('mousedown', handleMouseDown);
window.removeEventListener('mouseup', handleMouseUp);
window.removeEventListener('mousemove', handleMouseMove);
};
}, [dragging]);
return result;
};
const Test = () => {
const width = useMouseDelta(400);
return (
<div className="container" style={{width: width}}>
<div className="resize"></div>
</div>
)
}
ReactDOM.render(<Test />, document.getElementById('root'));
但是,我在 ESLint 中看到了这个警告:
React Hook useCallback 缺少依赖项:'result'。包括它或删除依赖项数组。如果您只需要“setResult”调用中的“结果”,您还可以进行功能更新“setResult(r => ...)”
所以我把它改成:
setResult(r => r + (e.clientX - origin.current));
现在拖动不再按预期工作。
可以在这里找到一个例子: CodePen example
最佳答案
origin
,但是你需要用useRef()
存储previousClientX
并添加一个 clientX
的变化在两个事件之间。useState()
存储拖动
, useRef()
就够了。useEffect()
中的依赖项列表中.改进后的代码:
import React, {
useState,
useCallback,
useEffect,
useRef
} from "https://cdn.skypack.dev/react";
import ReactDOM from "https://cdn.skypack.dev/react-dom";
const useMouseDelta = (initialWidth) => {
const [result, setResult] = useState(initialWidth);
const dragging = useRef(false);
const previousClientX = useRef(0);
const handleMouseMove = useCallback((e) => {
if (!dragging.current) {
return;
}
setResult((result) => {
const change = e.clientX - previousClientX.current;
previousClientX.current = e.clientX;
return result + change;
});
}, []);
const handleMouseDown = useCallback((e) => {
previousClientX.current = e.clientX;
dragging.current = true;
}, []);
const handleMouseUp = useCallback((e) => {
dragging.current = false;
}, []);
useEffect(() => {
window.addEventListener("mousedown", handleMouseDown);
window.addEventListener("mouseup", handleMouseUp);
window.addEventListener("mousemove", handleMouseMove);
return () => {
window.removeEventListener("mousedown", handleMouseDown);
window.removeEventListener("mouseup", handleMouseUp);
window.removeEventListener("mousemove", handleMouseMove);
};
}, [handleMouseDown, handleMouseUp, handleMouseMove]);
return result;
};
const Test = () => {
const width = useMouseDelta(400);
return (
<div className="container" style={{ width }}>
<div className="resize" />
</div>
);
};
ReactDOM.render(<Test />, document.getElementById("root"));
关于javascript - 在 React 中更改 mousedown 和 mousemove 的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68395228/
当我使用 resharper 时,他总是说 有什么区别? 任何细节都会很好 谢谢大家。 最佳答案 较短的语法已在 C# 2.0 中引入,它只是较长形式的语法糖。 无论你写什么,结果总是一样的。但是,更
我需要在网页中捕获一些数据,然后用户创建 mousedown 事件或在用户按页面元素上的 TAB 键时模拟它。对于 mousedown 我使用标准代码,例如: $('*').on('mousedown
我有一个 html 表格,其中包含拖放列、可调整大小的行以及根据 mousedown、mousemove 和 mouseup 进行更改的可调整大小的列。为了获得更好的性能,我应该让文档在鼠标移动期间不
所以我还没有开始写这些,所以为了清楚起见,我会尽我最大的努力把一些伪代码放在一起——但这里的想法是用户会点击并按住一个“按钮” (最终可能不会成为一个实际的按钮),然后生成一个可移动的 DIV。一旦创
如何在 JQuery 中创建鼠标按下并移动时触发的事件?并且每次 mousedown + mousemove 只触发一次? 最佳答案 更新: 因此,看起来如果您的鼠标不再位于绑定(bind) onmo
我正在使用 NSView 进行拖放操作。 在要拖动的对象(NSView 的子类)中,我实现了 mouseDown: 方法,如下所示: @try { NSPoint location;
我有一个包含 2 个事件的 TPanel: procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shif
我的应用程序一直表现不佳。在删除越来越多的代码后,我设法找到了问题的核心,但这对我来说毫无意义。 一点背景。我的网络编辑器应用程序对击键使用react,例如当按下 Alt 时,调整大小的处理程序将被隐
我希望按钮在单击时更改其颜色(鼠标按下时颜色较深,鼠标松开时原始颜色)并且它可以工作,但仅在第二次单击时有效。这是为什么?我该如何解决这个问题? 按钮 ID 为 1 到 10(按钮 1、按钮 2...
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 3 年前。 有没有办法在动态添加的元素上使用 mouse
我正在尝试向 DIV 添加一个简单的 mousedown 事件监听器。 DIV 有一个子节点,即 IMG。但是,当 mousedown 事件触发时,该事件的 target 和 srcElement 属
嗨,我有这个 HTML 代码 Passengers 并且有这个JS代码 $("Table tr th").mousedown(function (e) { /*mouse
我有一个 mousedown 事件可以更改 Canvas 中对象的图像。但是,在第一次单击期间,除非我添加超时,否则更新功能不会更新图像。此外,我什至尝试 promise 在新图像链接之后等待,然后再
我已经创建了过渡链接,但是当应该使用 onmousedown 事件调用该函数时,我得到了一个未捕获的未定义函数。显然我的功能已定义。我还在学习代码,所以我看不到或不明白它是什么。任何提示将不胜感激。
我正在使用一个名为 circliful 的 jquery 库: https://github.com/pguso/jquery-plugin-circliful 我用它来创建“触觉加载”效果。 在这个
在下面的代码片段中,只有“mousemove”事件有效。 'mousedown' 没有效果,我无法解释为什么会这样。如果我将“mousedown”替换为“click”,它确实有效,但是我想使用 mou
当你使用方法的时候 public boolean mouseDown(Event e, int x, int y) 在Java中,Event对象是干什么的,有什么用?我正在尝试编写一个程序,让某人点击
我正在尝试像这样加载我的导航栏: $.get("nav.html",function(menuData){ $("body").html(menuData); )}; 在“nav.html”中我们
我的问题是,当右键发生 mousedown 事件时,我需要检查是否有 div 如果没有,那么我的 flag 全局 variable 变为 false 但我没有得到该条件。 我的 jQuery 脚本如下
我正在尝试编写一个可移动的对话框,但出现问题。有时当我想通过移动对话框上方的某个位置来移动对话框时,而不是对话框本身,标题文本正在移动,如下所示: 标题文本的 CSS: .arg-dialog-tit
我是一名优秀的程序员,十分优秀!