40 lines
905 B
JavaScript
40 lines
905 B
JavaScript
module.exports = {
|
|
dispatch,
|
|
dispatcher,
|
|
setDispatch
|
|
}
|
|
|
|
const dispatchers = {}
|
|
let _dispatch = () => {}
|
|
|
|
function setDispatch (dispatch) {
|
|
_dispatch = dispatch
|
|
}
|
|
|
|
function dispatch (...args) {
|
|
_dispatch(...args)
|
|
}
|
|
|
|
// Most DOM event handlers are trivial functions like `() => dispatch(<args>)`.
|
|
// For these, `dispatcher(<args>)` is preferred because it memoizes the handler
|
|
// function. This prevents React from updating the listener functions on
|
|
// each update().
|
|
function dispatcher (...args) {
|
|
const str = JSON.stringify(args)
|
|
let handler = dispatchers[str]
|
|
if (!handler) {
|
|
handler = dispatchers[str] = e => {
|
|
// Do not propagate click to elements below the button
|
|
e.stopPropagation()
|
|
|
|
if (e.currentTarget.classList.contains('disabled')) {
|
|
// Ignore clicks on disabled elements
|
|
return
|
|
}
|
|
|
|
dispatch(...args)
|
|
}
|
|
}
|
|
return handler
|
|
}
|