javascript - 如何将事件监听器分配给 React.useRef
问题描述
我需要使用句柄元素滚动 div。我将功能包装在一个钩子中。我为句柄元素创建了一个引用,但它不允许为它分配事件侦听器。我想避免使用元素内联事件侦听器,这可能吗?
import React from "react";
export default function useScrollOnDrag() {
const refX = React.useRef(null);
const refY = React.useRef(null);
const [scrollState, setScrollState] = React.useState({
isScrolling: false,
clientX: 0,
scrollX: 0,
clientY: 0,
scrollY: 0,
});
refX.current.onmousedown((e) => {
setScrollState({ ...scrollState, isScrolling: true, clientX: e.clientX });
});
refX.current.onmousemp(() => {
setScrollState({ ...scrollState, isScrolling: false });
});
refX.current.onmousemove((e) => {
const { clientX, scrollX, isScrolling } = scrollState;
if (isScrolling) {
refX.current.parentElement.scrollLeft = scrollX + e.clientX - clientX;
setScrollState({ ...scrollState, scrollX: scrollX + e.clientX - clientX, clientX: e.clientX });
}
});
return [refX];
}
然后导入钩子并像这样使用它:
const [scrollHandle] = useScrollOnDrag()
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2 ref={scrollHandle}>Start editing to see some magic happen!</h2>
</div>
);
运行示例:https ://codesandbox.io/s/boring-haze-lzfxm?file=/src/index.js
我要避免的是创建这样的听众
<div
ref={ref}
onMouseDown={onMouseDown}
onMouseUp={onMouseUp}
onMouseMove={onMouseMove}
>
解决方案
首先,您应该将事件侦听器包装起来useEffect
并使用addEventListener
如下:
React.useEffect(() => {
refX.current.addEventListener("mousedown", e => {
setScrollState(prevState => ({
...prevState,
isScrolling: true,
clientX: e.clientX
}));
});
}, []);
在此处阅读有关 mousedown 事件的更多信息。你也可以搜索其他事件,我只是想指出正确的方向。
推荐阅读
- javascript - 根据关键字对字符串进行分类
- html - .NET core asp-for 单选按钮绑定到带有可点击标签的模型?
- asp.net-web-api - 导致 Web API 操作返回 404 的新参数
- r - 在创建多个图时使用波浪号、~ 和点
- node.js - 通过 AWS EC2 Ubuntu 实例上的 iptables 重定向端口
- powershell - Add-SBHost : 系统找不到指定的文件
- java - Java C# 的 goto 等价物
- polymorphism - rails中的多态关联
- java - gradle:从 5005 更改默认端口
- java - 如何解码`javax.ws.rs.core.Cookie`中的客户端Cookie字符串