mirror of
https://github.com/zhigang1992/react.git
synced 2026-01-31 09:08:41 +08:00
feat: support for functional initializer mode
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
Reference in New Issue
Block a user