typescript - TypeScript DOM 引用类型
问题描述
我想使用 React 包装一个事件监听器。我将如何引用 DOM 引用?我目前收到此错误:
无法调用可能是“未定义”的对象。
import { useEffect, useRef } from 'react'
export function useEventListener(
eventNames: string|string[], handler: any, element = global.globalThis
) {
// First, create a reference that stores the handler.
const savedHandler = useRef()
if( !Array.isArray( eventNames ) ) eventNames = [eventNames]
// Save the handler to ref.current on the initial call to useEventListener
// and then update ref.current whenever the handler changes. This allows the
// useEffect below to get the latest handler without needing to store it in
// the hooks dependency array (causing it to re-run).
useEffect( () => ( savedHandler.current = handler ), [handler] )
useEffect( () => {
if ( element === undefined ) { return }
// When the element does not support an event listener, return.
if ( !element.addEventListener ) return
// Create an event listener that calls the handler function stored in the
// reference.
const listener = (event: any ) => savedHandler.current( event ) // <- Error here
for ( const e of eventNames ) element.addEventListener( e, listener )
return () => {
for ( const e of eventNames ) element.removeEventListener( e, listener )
}
}, [element, eventNames] )
}
解决方案
推荐阅读
- ios - 无法将“__NSDictionaryM”(0x1f0c63860)类型的值转换为“NSString”(0x1f0c70290)Swift
- docker - 在 Windows 上,“docker network create”出现错误“hnsCall 在 Win32 中失败:系统找不到指定的文件”
- python - Tkinter 页面未加载
- alexa-skills-kit - 有谁知道如何在不离开播放屏幕的情况下暂停亚马逊 Alexa 音频播放器?
- python-3.x - 如何在 discord.py 库中设置多个前缀或使前缀不区分大小写?
- tensorflow - tf.TensorArray 允许从未写入的索引中读取?
- bitbucket - Bitbucket Pipelines - 构建不输出构建文件?
- css - 如何在嵌套元素中使用 flexbox 自动边距?
- vue.js - Vue.js 切换类失败
- ios - 提示iOS用户选择要由应用处理的JPEG