-
-
Notifications
You must be signed in to change notification settings - Fork 2k
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
Unmounting a tree of components #47
Comments
@kruczy excellent catch, I don't know how I missed this! It'll need something more complicated than deepHook since there could be grandchild components. I'll get a fix out right away. |
@kruczy Sorry, I must have been tired earlier - you were exactly right, it just needed to be a |
Hey @developit, been testing this today and it seems |
@kruczy yeah deepHook only handles high-order components. You're seeing grandchild components not unmount?
|
From my observation that would work in my case the tree is 6 components deep I unmount the whole thing at once but unmount hook seems to be called only on the first 2 levels |
I modified your example to show the problem http://jsfiddle.net/orgkorjc/10/ Notice that C only logs on the first iteration and then does not log mounts or unmounts |
Perfect, that is immensely useful. Will get a fix out for this ASAP. |
@kruczy This was possibly the biggest rabbit hole I've encountered since adding support for High-Order components to Preact, but I think I've got it solved. The solution actually necessitated a slight change in how Preact mounts and re-mounts Components, but I think it's a better long-term approach: components will now own their rendered content. Unmounting a component now retains the most recently rendered snapshot ( With the new semantics for component mount/unmount, the second time you mount a component, it simply diffs against the most recent snapshot. I think this will help with use-cases like routers, where the DOM rendered by different child components of a router is expected to change by somewhere near 100%. It will incur a small overhead when swapping two components that render nearly identical DOM structures, but this can be avoided by serving that use-case using Pure Functions, which always diff against the previous render, even if the component/function is a different reference. Apologies for the long-winded and perhaps slightly unrelated comment - just useful for my own brain and to document this somewhere! Expect a release soon that fixes your issue. |
Thanks for support and explanation, always great to have a responsive maintainer 👍 |
@kruczy This is fixed in |
thanks, this is fixed: http://jsfiddle.net/z43dp0ok/1/ |
Thanks again for that JSFiddle demo - it's so much easier to diagnose issues with minimal examples. 👍 |
Validate the referential equality of the args to componentDidUpdate
Hi,
Today I came about an issue that if I remove a tree of components/elements only the top one will get the
componentWillUnmount
/componentDidUnmount
calledI guess this could happen because components get cached and reused later, tho because of this nested components cannot cleanup timers or dispose of unnecessary resources
maybe https://github.com/developit/preact/blob/5b2ba167cb4e9acc7c0d265358ad7bf056eb46e2/src/vdom/component.js#L235
should be
deepHook
instead of justhook
?Thanks for any help!
The text was updated successfully, but these errors were encountered: