Skip to content

useToggle

作用

用于在两个状态值间切换的 Hook。

原理

通过函数的重载,实现了三种不同的传参方式,返回一个元组,元组的第一个元素是状态,第二个元素是一个对象,对象中有四个方法,分别是 togglesetsetLeftsetRight

源码

typescript
import { useMemo, useState } from 'react'

// 设置值的方法的接口
export interface Actions<T> {
  setLeft: () => void
  setRight: () => void
  set: (value: T) => void
  toggle: () => void
}

// 函数重载
// 如果第一个参数是 boolean 类型,默认值false,返回一个元组,而且返回值的第一个元素也是 boolean 类型,
function useToggle<T = boolean>(): [boolean, Actions<T>]

// 一个参数是默认值,返回一个元组,而且返回值的第一个元素T类型
function useToggle<T>(defaultValue: T): [T, Actions<T>]

// 两个参数,第一个参数是默认值,第二个参数是反转默认智能,返回一个元组,而且返回值的第一个元素T | U类型
function useToggle<T, U>(defaultValue: T, reverseValue: U): [T | U, Actions<T | U>]

// 实现函数,第二个参数可以传入一个反转值,也可以不传
function useToggle<D, R>(defaultValue: D = false as unknown as D, reverseValue?: R) {
  // 状态默认为第一个参数
  const [state, setState] = useState<D | R>(defaultValue)

  const actions = useMemo(() => {
    // 如果第二个参数没有传入,那么反转值就是第一个参数的反值,如果传入了,那么反转值就是第二个参数
    const reverseValueOrigin = (reverseValue === undefined ? !defaultValue : reverseValue) as D | R

    // 返回一个对象,对象中有四个方法,分别是toggle,set,setLeft,setRight

    // toggle方法,如果状态是第一个参数,那么就设置为第二个参数,如果状态是第二个参数,那么就设置为第一个参数
    const toggle = () => setState((s) => (s === defaultValue ? reverseValueOrigin : defaultValue))

    // set方法,设置状态
    const set = (value: D | R) => setState(value)

    // setLeft方法,设置状态为第一个参数
    const setLeft = () => setState(defaultValue)

    // setRight方法,如果传入了 reverseValue, 则设置为 reverseValue。 否则设置为 defautValue 的反值
    const setRight = () => setState(reverseValueOrigin)

    return {
      toggle,
      set,
      setLeft,
      setRight
    }
    // useToggle ignore value change
    // }, [defaultValue, reverseValue]);
  }, [])

  return [state, actions]
}

export default useToggle

如有转载或 CV 的请标注本站原文地址