询问有关在动态react 组件中添加和删除事件侦听器的建议.

所以,我有一个功能组件,它有一个对象列表.

它是这样呈现的:

objectList.map( (item) => {
return ( 
    <div>
        <some-component with props.id = item.id>
        <some-bootstrap-icon>
    <div>
    )
            }

我的目标是在用户单击图标并拖动鼠标时执行一些操作,并在鼠标打开后停止这些操作.在这些操作中,我需要了解鼠标移动了多少,列表中的哪个对象被"touch "了.

我现在有什么?

const some_action = (event, id) => { 
    ... using event.movementX and id for some actions
}


const rendering_func = () => {
    return ( {
        objectList.map( (item) => {

            const wrapper = (event) => {
                some_action(event, item.id);
                }       

            return <...>
                <bootstrap-icon 
                onMouseDown={()=>
                    {window.addEventListener("mousemove", wrapper)}
                        }
                onMouseUp={()=>
                    {window.removeEventListener("mousemove", wrapper)}
                        }
                />
                <...>
                    } )

    } )
}

事件监听器被成功添加,"some_action"函数完成了它的工作. 问题是:事件侦听器在鼠标朝上时未被删除.

Edit: Imagine the rotate icon in MS PowerPoint. When you click it, you can drag your mouse and the object will rotate. When you let go, the rotation stops. Basically I am trying to recreate the same functionality in terms of clicking, dragging and letting go of the icon. powerpoint example

推荐答案

你正在做的是:注册一个全局(!)鼠标移动事件监听器,当你开始开始"点击"对象,并取消注册时,你再次释放鼠标.你可以直接将包装器作为参数传递给bootstrap-icon的onMouseDown/onMouseMove/onMouseUp props,如下所示:

const some_action = (id) => (event) => { 
    ... using event.movementX and id for some actions
}


const rendering_func = () => {
    return ( {
        objectList.map( (item) => {    
            const moveHandler = some_action(item.id);
            return <... key={item.id}>
                <bootstrap-icon 
                    onMouseDown={() => {
                        window.addEventListener("mousemove", moveHandler);
                        window.addEventListener("mouseup", () => window.removeEventListener("mousemove", moveHandler));
                    }}
                />
                <...>
         } )

    } )
}

上一篇:误解我身边鼠标应该可以在整个屏幕上移动(即离开图标的边界).mousemove事件处理程序仍然在onMouseDown事件处理程序中注册,但mouseup事件处理程序现在也是全局注册的.

Reactjs相关问答推荐

如何将google地址lat收件箱设置为输入值?

运行 node server.js会导致以下错误:Route.post()需要回调函数,但在Route.&处得到了[对象Undefined] lt;计算>

LocalStore未存储正确的数据

为什么我无法访问窗口事件处理程序中的状态?

URL参数和React路由中的点

如何在react组件中使用formik进行验证

如何在重新图表中更改悬停时的条形填充 colored颜色 ?

如何在React中的textarea中显示字符数?

如何将图像(在代码中称为自己)定位在蓝色圈内的点上?我正在使用material UI和Reaction

CORS策略:对预检请求的响应未通过访问控制判断:没有Access-Control-Allow-Origin

如何在 React 过滤器中包含价格过滤器逻辑?

React - 添加了输入数据但不显示

在 React JS 中编辑表格数据

为什么接受 useState 返回的函数的 setter 在使用 React 的单个调用中执行两次?

Reactjs 表单未反映提交时的更改

useState 在生命周期中的位置

.filter() 函数在删除函数中创建循环 - React

设置 Material UI 表格默认排序

如何通过 Material Ui 设计将 Accordion 添加到您的 React 项目中?

ClearInterval 在 React 中的 useRef 没有按预期工作