Skip to content

ahooks处理dom

ahooks也提供了不少操作原生DOM的钩子函数

1. 使用useEventListener

useEventListener和addEventListener不同点在于useEventListener不会向DOM重复注册事件:

jsx
import { Row, Col, Button } from 'antd'
import { useState,useRef  } from 'react'
import { useEventListener } from 'ahooks'

function App() {
  const [count, setCount] = useState(1)
  const ref = useRef(null)

  useEventListener(
    'click',
    () => {
      setCount(count + 1);
    },
    { target: ref },
  )

  return (
    <>
      <Row>
        <Col span={24}>
          {count}, {Date.now()}
        </Col>
        <Col span={24}>
          <Button type='primary' ref={ref} >点击</Button>
        </Col>
      </Row>
    </>
  )
}
export default App

运行效果:
Alt text 此外第二个参数还支持类似Vue中的事件修饰符:

参数说明类型默认值
targetDOM 节点或者 ref(() => Element)Element
capture可选项,listener 会在该类型的事件捕获阶段传播到该 EventTarget 时触发。booleanfalse
once可选项,listener 在添加之后最多只调用一次。如果是 true,listener 会在其被调用之后自动移除。booleanfalse
passive可选项,设置为 true 时,表示 listener 永远不会调用 preventDefault() 。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。booleanfalse
enable可选项,是否开启监听。booleantrue

2. 使用useEventTarget

常见表单控件(通过e.target.value获取表单值)的onChange跟value逻辑封装,支持自定义值转换和重置功能。

jsx
import React from 'react'
import { useEventTarget } from 'ahooks'

export default () => {
  const [value, { reset, onChange }] = useEventTarget({ initialValue: 'this is initial value' })

  return (
    <div>
      <input value={value} onChange={onChange} style={{ width: 200, marginRight: 20 }} />
      <button type="button" onClick={reset}>
        reset
      </button>
    </div>
  );
};