Skip to content

Commit dc592c5

Browse files
authored
Merge pull request #50 from LeetCode-OpenSource/reduce-rerender
Reduce rerender
2 parents 1ce822d + 5337fc2 commit dc592c5

File tree

3 files changed

+1815
-1688
lines changed

3 files changed

+1815
-1688
lines changed

package.json

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,39 @@
2121
"url": "git@github.com:LeetCode-OpenSource/rxjs-hooks.git"
2222
},
2323
"devDependencies": {
24-
"@types/jest": "^24.0.6",
25-
"@types/lodash": "^4.14.121",
26-
"@types/react-dom": "^16.8.2",
24+
"@types/jest": "^24.0.13",
25+
"@types/lodash": "^4.14.133",
26+
"@types/react-dom": "^16.8.4",
2727
"@types/react-test-renderer": "^16.8.1",
28-
"@types/sinon": "^7.0.6",
28+
"@types/sinon": "^7.0.12",
2929
"@types/sinon-chai": "^3.2.2",
30-
"@types/webpack": "^4.4.24",
30+
"@types/webpack": "^4.4.32",
3131
"coveralls": "^3.0.3",
32-
"fork-ts-checker-webpack-plugin": "^1.0.0",
32+
"fork-ts-checker-webpack-plugin": "^1.3.4",
3333
"happypack": "^5.0.1",
3434
"html-webpack-plugin": "^3.2.0",
35-
"husky": "^2.0.0",
36-
"jest": "^24.1.0",
37-
"lint-staged": "^8.1.4",
38-
"prettier": "^1.16.4",
35+
"husky": "^2.3.0",
36+
"jest": "^24.8.0",
37+
"lint-staged": "^8.1.7",
38+
"prettier": "^1.17.1",
3939
"react": "16.8.6",
4040
"react-dom": "16.8.6",
4141
"react-test-renderer": "16.8.6",
42-
"rxjs": "^6.4.0",
43-
"sinon": "^7.2.4",
42+
"rxjs": "^6.5.2",
43+
"sinon": "^7.3.2",
4444
"source-map-loader": "^0.2.4",
4545
"standard": "^12.0.1",
46-
"ts-jest": "^24.0.0",
47-
"ts-loader": "^5.3.3",
48-
"tslint": "^5.13.0",
46+
"ts-jest": "^24.0.2",
47+
"ts-loader": "^6.0.2",
48+
"tslint": "^5.17.0",
4949
"tslint-config-prettier": "^1.18.0",
5050
"tslint-eslint-rules": "^5.4.0",
5151
"tslint-react": "^4.0.0",
5252
"tslint-sonarts": "^1.9.0",
53-
"typescript": "^3.3.3",
54-
"webpack": "^4.29.5",
55-
"webpack-cli": "^3.2.3",
56-
"webpack-dev-server": "^3.2.1"
53+
"typescript": "^3.5.1",
54+
"webpack": "^4.32.2",
55+
"webpack-cli": "^3.3.2",
56+
"webpack-dev-server": "^3.5.0"
5757
},
5858
"dependencies": {
5959
"tslib": "^1.9.3"

src/use-event-callback.ts

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
1-
import { useEffect, useState } from 'react'
2-
import { Observable, BehaviorSubject, Subject, noop } from 'rxjs'
1+
import { useEffect, useState, useCallback } from 'react'
2+
import { Observable, BehaviorSubject, Subject } from 'rxjs'
33

44
import { RestrictArray, VoidAsNull, Not } from './type'
55

6-
// https://stackoverflow.com/questions/55541275/typescript-check-for-the-any-type
7-
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N
8-
9-
type IsAny<T> = IfAny<T, true, false>
10-
11-
type IsVoid<T> = IsAny<T> extends true ? false : [T] extends [void] ? true : false
12-
13-
type VoidableCallback<EventValue> = IsVoid<EventValue> extends true ? () => void : (val: EventValue) => void
14-
156
export type EventCallbackState<EventValue, State, Inputs = void> = [
16-
VoidableCallback<EventValue>,
7+
(e: EventValue) => void,
178
[State extends void ? null : State, BehaviorSubject<State | null>, BehaviorSubject<RestrictArray<Inputs> | null>]
189
]
1910
export type ReturnedState<EventValue, State, Inputs> = [
@@ -53,9 +44,11 @@ export function useEventCallback<EventValue, State = void, Inputs = void>(
5344
const inputSubject$ = new BehaviorSubject<RestrictArray<Inputs> | null>(typeof inputs === 'undefined' ? null : inputs)
5445
const stateSubject$ = new BehaviorSubject<State | null>(initialValue)
5546
const [state, setState] = useState(initialValue)
56-
const [returnedCallback, setEventCallback] = useState<VoidableCallback<EventValue>>(
57-
() => noop as VoidableCallback<EventValue>,
58-
)
47+
const [event$] = useState(new Subject<EventValue>())
48+
function eventCallback(e: EventValue) {
49+
return event$.next(e)
50+
}
51+
const returnedCallback = useCallback(eventCallback, [])
5952
const [state$] = useState(stateSubject$)
6053
const [inputs$] = useState(inputSubject$)
6154

@@ -64,12 +57,7 @@ export function useEventCallback<EventValue, State = void, Inputs = void>(
6457
}, inputs || [])
6558

6659
useEffect(() => {
67-
const event$ = new Subject<EventValue>()
68-
function eventCallback(e: EventValue) {
69-
return event$.next(e)
70-
}
7160
setState(initialValue)
72-
setEventCallback(() => eventCallback as VoidableCallback<EventValue>)
7361
let value$: Observable<State>
7462

7563
if (!inputs) {

0 commit comments

Comments
 (0)