I am using ReactJS and it's SyntheticEvent to track the event and it's target DOM node.
I am creating a few mutable components and I want them to fire SyntheticEvent to track the DOM and to track the changed value using e.target
and e.target.value
.
How can I instantiate SyntheticEvent and assign them DOM and it's target value?
I've created a helper function to make SyntheticEvent from Event:
export const createSyntheticEvent = <T extends Element, E extends Event>(event: E): React.SyntheticEvent<T, E> => {
let isDefaultPrevented = false;
let isPropagationStopped = false;
const preventDefault = () => {
isDefaultPrevented = true;
event.preventDefault();
}
const stopPropagation = () => {
isPropagationStopped = true;
event.stopPropagation();
}
return {
nativeEvent: event,
currentTarget: event.currentTarget as EventTarget & T,
target: event.target as EventTarget & T,
bubbles: event.bubbles,
cancelable: event.cancelable,
defaultPrevented: event.defaultPrevented,
eventPhase: event.eventPhase,
isTrusted: event.isTrusted,
preventDefault,
isDefaultPrevented: () => isDefaultPrevented,
stopPropagation,
isPropagationStopped: () => isPropagationStopped,
persist: () => {},
timeStamp: event.timeStamp,
type: event.type,
};
}
That's an example of how I use it. I need to fire a change event, providing new value for the target. You can use it like this:
const target = document.createElement('input');
target.value = newValue;
const event = new Event('change', { bubbles: true });
Object.defineProperty(event, 'target', { writable: false, value: target })
const syntheticEvent = createSyntheticEvent(event) as React.ChangeEvent<typeof target>;
onChange(syntheticEvent);
Saying that, please also consider "classic" way of triggering events by creating new Event
and dispatching it to the HTML element (which you can access with
inputRef.current
, where inputRef is defined as inputRef = useRef()
and used as <input ref={inputRef}
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With