项目作者: foray1010

项目描述 :
React Hook for DOM event listeners with TypeScript supported
高级语言: JavaScript
项目地址: git://github.com/foray1010/use-typed-event-listener.git
创建时间: 2019-05-30T14:17:01Z
项目社区:https://github.com/foray1010/use-typed-event-listener

开源协议:MIT License

下载


use-typed-event-listener

Build Status
codecov.io

node
npm
npm

use-typed-event-listener is a React Hook for DOM event listeners with TypeScript supported

With TypeScript helps, this package can detect which event type the element supports, and automatically cast a correct typing for event

Installation

  1. npm install use-typed-event-listener
  2. # or
  3. yarn add use-typed-event-listener

Development Setup

We are using corepack to manage the yarn version

  1. corepack enable

Interface

  1. useEventListener(element, eventType, listener[, options])

Usage

  • listener typings will be automatically casted based on element and eventType

    1. import useEventListener from 'use-typed-event-listener'
    2. export default (props: Props) => {
    3. // typings for `event` will be `MouseEvent` as this package recognizes the `click` event type
    4. useEventListener(window, 'click', (event) => {
    5. console.log(event.buttons)
    6. })
    7. return <SomeComponent ></SomeComponent>
    8. }
  • No need to avoid passing new reference to listener or options, they are memorized and will not trigger the hook again

    1. import useEventListener from 'use-typed-event-listener'
    2. export default (props: Props) => {
    3. // this hook will only run once
    4. useEventListener(window, 'click', (event) => {}, {
    5. capture: true,
    6. })
    7. return <SomeComponent ></SomeComponent>
    8. }
  • Prevent casting eventType as string

    1. import useEventListener from 'use-typed-event-listener'
    2. export default (props: Props) => {
    3. const eventType: string = 'click'
    4. useEventListener(window, eventType, (event) => {
    5. // as `eventType` is a wild card string, `event` will fallback to general `Event` type
    6. // this line will throw `Property 'buttons' does not exist on type 'Event'.ts(2339)`
    7. console.log(event.buttons)
    8. })
    9. return <SomeComponent ></SomeComponent>
    10. }
  • Checks if element support this event type

    1. import useEventListener from 'use-typed-event-listener'
    2. export default (props: Props) => {
    3. // this pass as HTMLElement supports copy event
    4. useEventListener(document.body, 'copy', (event) => {
    5. console.log(event.clipboardData)
    6. })
    7. // as Window doesn't support copy event
    8. useEventListener(window, 'copy', (event) => {
    9. // this throws `Property 'clipboardData' does not exist on type 'Event'.ts(2339)`
    10. console.log(event.clipboardData)
    11. })
    12. return <SomeComponent ></SomeComponent>
    13. }