feat: support for functional initializer mode

This commit is contained in:
unix
2020-05-24 01:51:27 +08:00
parent 770ce39c95
commit cc60ca31da
2 changed files with 12 additions and 2 deletions

View File

@@ -13,6 +13,14 @@ describe('UseCurrentState', () => {
expect(result.current[2].current).toEqual('test')
})
it('functional initial mode should be supported', () => {
const { result } = renderHook(() => useCurrentState(() => 1 + 1))
expect(result.current[0]).toEqual(2)
act(() => result.current[1](0))
expect(result.current[0]).toEqual(0)
expect(result.current[2].current).toEqual(0)
})
it('functional update mode should be supported', () => {
const { result } = renderHook(() => useCurrentState(0))
expect(result.current[0]).toEqual(0)

View File

@@ -2,8 +2,10 @@ import { Dispatch, MutableRefObject, SetStateAction, useEffect, useRef, useState
export type CurrentStateType<S> = [S, Dispatch<SetStateAction<S>>, MutableRefObject<S>]
const useCurrentState = <S>(initialState: S): CurrentStateType<S> => {
const [state, setState] = useState<S>(initialState as S)
const useCurrentState = <S>(initialState: S | (() => S)): CurrentStateType<S> => {
const [state, setState] = useState<S>(() => {
return typeof initialState === 'function' ? (initialState as () => S)() : initialState
})
const ref = useRef<S>(initialState as S)
useEffect(() => {