F L*_*has 7 javascript events reactjs
使用 vanilla JS 可以像这样克隆一个事件实例:
const cloneEvent = event => new event.constructor(event.type, event);
Run Code Online (Sandbox Code Playgroud)
可用于将事件事件从一个 DOM 元素转发到另一个元素。例如,
const buttonA = document.querySelector('#a');
const buttonB = document.querySelector('#a');
const clickHandler = (type, forwardTo) => event => {
console.log(type, 'was clicked');
if (forwardTo) forwardTo.dispatchEvent(cloneEvent(event));
};
buttonA.addEventListener('click', clickHandler('A', buttonB));
buttonA.addEventListener('click', clickHandler('B'));
Run Code Online (Sandbox Code Playgroud)
当您单击 A 时,您还将看到两个按钮的 2 个日志记录。
我想用 React 的SyntheticEvent实现同样的效果,但我遇到的问题大概是因为 SyntheticEvent 的实例化方式与本机事件不同。这是说明问题的现场演示:https : //jsfiddle.net/2Lhsfceu/2/(请参阅开发控制台日志)
我目前的解决方案是克隆本机事件 ( SyntheticEvent.nativeEvent) 如下(更新和工作现场演示:https : //jsfiddle.net/2Lhsfceu/1/)
const cloneEvent = event => {
const nativeEvent = event.nativeEvent || event;
new nativeEvent.constructor(nativeEvent.type, nativeEvent);
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更清洁的方法,或者这是我们能做的最好的方法吗?
我担心的是,通过仅克隆本机事件,代码库正在处理两种不同类型的事件:由源事件(来自 React)调度的 SyntheticEvent 和来自转发的本机事件。
一旦在 DOM 上分派本机事件就像手动滚动一样,就应该没问题了。
我担心的是,通过仅克隆本机事件,代码库正在处理两种不同类型的事件:由源事件(来自 React)调度的 SyntheticEvent 和来自转发的本机事件。
React 所做的是监听根上的所有本机事件(在<div id="#root"/>这里,它们通过冒泡到达那里),然后每次接收到一个事件时,它都会创建一个等效的 SyntheticEvent,并在 React 代码中传递。
因此,如果您手动触发本机事件,React 将像往常一样创建其 SyntheticEvent 等效项,并且应该没问题。
在极少数情况下,在 Javascript 中手动调度事件会产生与真实用户触发事件不同的效果。请参阅此示例。
| 归档时间: |
|
| 查看次数: |
647 次 |
| 最近记录: |