-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unmount check #433
Unmount check #433
Conversation
Currently, the pre-commit hooks script is broken
need to upgrade Typescript to support import type { xxx } from 'xxx' |
730315a
to
6589e6a
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you @promer94 for working on this!
I think it's a good chance to refactor these handlers to event emitters:
callbacksRef.current.onLoadingSlow(...args)
→ eventsRef.current.emit('onLoadingSlow', ...args)
So we don't need to implement every method inside callbacksRef
, and it will be more flexible in the future.
eventsRef = useRef({
emit: (event, ...args) => {
if (unmounted) return
config[event](...args)
}
})
refactor handlers to event emitters do unmount check for all events Closes: vercel#286
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code looks good, thank you @promer94 (also appreciate the tests)!
@@ -215,6 +215,18 @@ function useSWR<Data = any, Error = any>( | |||
const unmountedRef = useRef(false) | |||
const keyRef = useRef(key) | |||
|
|||
// do unmount check for callbacks | |||
const eventsRef = useRef({ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why not use useMemo
in here, no reference scene
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@thoamsy useMemo is more like to use for recalculation when deps changed.
for the events trigger, the refer here is just creating an object which is never changed during renders, without any deps required. so I feel ref is more proper for this case : )
* type: extends useConfig cache interface (#1938) * remove mount check for react18 (#1927) reactwg/react-18#82 related pr #787 #433 * lint: dont check unused vars with underscore prefix (#1939) * test: upgrade to jest 28 (#1942) * Upgrade to jest 28 * Upgrade to jest 28 * feat: useSyncExternalStoreWithSelector * refactor: remove stateUpdate and boardcast state update should be handled by uSESW * type: fix test type error * remove pnpm.lock * fix: import cjs for codesanbox * refactor: add selector * refactor: add cachestate interface and try fix custom cache * fix: custom cache init * refactor: remove useless flag * chore: codesanbox ci * refactor: remove force render in infinite * build: add _internal * chore: mark warning test * fix: dts generation * codesanbox ci * chore: rename swr folder to core Co-authored-by: Jiachi Liu <inbox@huozhi.im>
* type: extends useConfig cache interface (vercel#1938) * remove mount check for react18 (vercel#1927) reactwg/react-18#82 related pr vercel#787 vercel#433 * lint: dont check unused vars with underscore prefix (vercel#1939) * test: upgrade to jest 28 (vercel#1942) * Upgrade to jest 28 * Upgrade to jest 28 * feat: useSyncExternalStoreWithSelector * refactor: remove stateUpdate and boardcast state update should be handled by uSESW * type: fix test type error * remove pnpm.lock * fix: import cjs for codesanbox * refactor: add selector * refactor: add cachestate interface and try fix custom cache * fix: custom cache init * refactor: remove useless flag * chore: codesanbox ci * refactor: remove force render in infinite * build: add _internal * chore: mark warning test * fix: dts generation * codesanbox ci * chore: rename swr folder to core Co-authored-by: Jiachi Liu <inbox@huozhi.im>
* update state in a transition * support snapshotting external state * wip * move types:check to pre-commit * refactor: switch to useSyncExternalStoreWithSelector (#1953) * type: extends useConfig cache interface (#1938) * remove mount check for react18 (#1927) reactwg/react-18#82 related pr #787 #433 * lint: dont check unused vars with underscore prefix (#1939) * test: upgrade to jest 28 (#1942) * Upgrade to jest 28 * Upgrade to jest 28 * feat: useSyncExternalStoreWithSelector * refactor: remove stateUpdate and boardcast state update should be handled by uSESW * type: fix test type error * remove pnpm.lock * fix: import cjs for codesanbox * refactor: add selector * refactor: add cachestate interface and try fix custom cache * fix: custom cache init * refactor: remove useless flag * chore: codesanbox ci * refactor: remove force render in infinite * build: add _internal * chore: mark warning test * fix: dts generation * codesanbox ci * chore: rename swr folder to core Co-authored-by: Jiachi Liu <inbox@huozhi.im> * chore: useSES should be external (#1960) * rename type * types: update cache types * chore: move @types/useSES to devDependencies Co-authored-by: Shu Ding <g@shud.in> Co-authored-by: Jiachi Liu <inbox@huozhi.im>
No description provided.