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中的事件修饰符:

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

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>
  );
};

评论