官方文档

布尔值的优雅操作

用来控制模态框的显示,隐藏很优雅。

  1. import { useBoolean } from 'ahooks';
  2. const [
  3. modalVisible,
  4. {setFalse: hideModal, setTrue: showModal, toggle: toggleModal}
  5. ] = useBoolean(false);
  6. <button onClick={showModal}>显示</button>
  7. <Modal visible={modalVisible} onClose={hideModal} />
  8. <button onClick={toggleModal}>Toggle</button>

useUnmount & useUnmountedRef & useSafeState

常用来防止组件 unmount 后,仍然去改 state,导致内存泄露。

  1. useUnmount(() => {
  2. message.info('unmount');
  3. })
  4. const unmountRef: { current: boolean } = useUnmountedRef();
  5. const doSth = async () => {
  6. await fetchSth();// 一些异步
  7. !unmountRef.current && setText('I am unmounted');
  8. }
  9. const [value, setValue] = useSafeState<string>()
  10. const doSth2 = async () => {
  11. await fetchSth();// 一些异步
  12. setValue('I am unmounted'); // unmount 后,不会执行。
  13. }

useDebounce

防抖。

  1. const [value, setValue] = useState<string>();
  2. const debouncedValue = useDebounce(value, { wait: 500 });
  3. useEffect(() => {/* doSth */}, [debouncedValue])
  4. return <input onChange={() => {(e) => setValue(e.target.value)}} />

usePrevious

  1. const [count, setCount] = useState(0)
  2. const previous = usePrevious(count)

useEventListener

优雅使用 addEventListener 的 Hook。内部做了解绑事件。

  1. const ref = useRef();
  2. useEventListener('click', clickHandler, { target: ref });
  3. return <button ref={ref} type="button">...</button>

useClickAway

优雅的管理目标元素外点击事件。一般处理点击元素外侧,元素消失。

  1. import { useClickAway } from 'ahooks'
  2. const ref = useRef<HTMLSpanElement>();
  3. useClickAway(() => {
  4. // doSth
  5. }, ref);
  6. return <span ref={ref}>...</span>

useHover

追踪 dom 元素是否有鼠标悬停。

  1. const ref = useRef();
  2. const isHovering = useHover(ref);
  3. return <div ref={ref}>{isHovering ? 'hover' : 'leaveHover'}</div>;

useSetState

与 class 组件的 this.setState 基本一致。

  1. const [state, setState] = useSetState<State>({
  2. hello: '',
  3. count: 0,
  4. })
  5. setState({ hello: 'world' })
  6. setState((prev) => ({ count: prev.count + 1 }))

useLocalStorageState & useSessionStorageState

将状态持久化存储在 localStorage 中的 Hook 。

  1. const [message, setMessage] = useLocalStorageState('user-message', 'Hello~')

useWhyDidYouUpdate

帮助开发者排查是什么改变导致了组件的 rerender。

  1. const [randomNum, setRandomNum] = useState(Math.random());
  2. useWhyDidYouUpdate('useWhyDidYouUpdateComponent', { ...props, randomNum })

其他

  • useHistoryTravel: 优雅的管理状态变化历史,可以快速在状态变化历史中穿梭 - 前进跟后退。
  • useLockFn: 用于给一个异步函数增加竞态锁,防止并发执行。
  • useReactive: 提供一种数据响应式的操作体验,定义数据状态不需要写useState , 直接修改属性即可刷新视图。