All files / react useStaged.ts

100% Statements 9/9
100% Branches 0/0
100% Functions 3/3
100% Lines 9/9

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38                                    9x 9x 9x 9x 9x 1x   9x 1x   9x                  
import { useCallback } from 'react'
import { useLatest } from 'react-use'
import { useStateWithDeps } from './useStateWithDeps'
 
/**
 * 暂存状态。
 */
export function useStaged<T>(
  value: T,
  setValue: (value: T) => void,
): [
  T,
  {
    set: (value: T) => void
    commit: () => void
    reset: () => void
  },
] {
  const [stagedState, setStagedState] = useStateWithDeps(value, [value])
  const valueRef = useLatest(value)
  const setValueRef = useLatest(setValue)
  const stagedStateRef = useLatest(stagedState)
  const commitStagedState = useCallback(() => {
    setValueRef.current(stagedStateRef.current)
  }, [])
  const resetStagedState = useCallback(() => {
    setStagedState(valueRef.current)
  }, [])
  return [
    stagedState,
    {
      set: setStagedState,
      commit: commitStagedState,
      reset: resetStagedState,
    },
  ]
}