There's been a discussion of what it would take to support Web Components
well in Elm and one of the primary issues that has come up has been
problems with the virtual DOM not preserving component DOM elements during
an update or preserving them when it should not. This matters because these
are elements that often are being used because they keep state outside of
Elm and spurious destruction/construction or reuse leads to state resetting
when it shouldn't or being "preserved" when it shouldn't.

This problem, however, already exists for text fields which have notions of
focus and selection which exist outside of Elm. The following gist
demonstrates the problem. Typing into the field should capture all of the
successive text strings. It works fine in Before mode in which the text
field sits at the same spot in the virtual DOM throughout. But in After
mode, every time you type, the text field moves in the DOM and gets
destroyed and re-created.

https://gist.github.com/markhamburg/874a2dc5e92d233415cbe9cbe0e8e5d6

Some cases, could be handled using Html.Keyed but this is really built for
handling lists — imagine instead of the example I just provided one where
we pop an error field into view ahead of the text entry — and in fact
requires that concern be paid all the way up the tree — the error field
might be several levels up from the text field in the view hierarchy.

Basically, with care and attention, we can get the virtual DOM to do the
right thing most of the time, but what we have is a lurking source of
difficult to reproduce bugs where if the virtual DOM changes in the wrong
way at the wrong time, the state for an element will get messed up.

How could we fix this? This is where my limited knowledge of browser
behavior and of what the key decisions are in the virtual DOM that lead to
improved performance impairs my ability to say anything definitive. But
essentially what it seems like we want is a return of an optional identity
attribute for views that should be used on any view that involves external
state. The virtual DOM update code should sweep through the old tree and
collect up a map of identity strings to DOM elements and look in this map
to find the right DOM element for any item in the new virtual DOM tree.
Basically, the identity attribute means "preserve the external DOM element".

Are there better solutions that don't just involve saying "avoid writing
code like that" (though a solution that said "write code like this instead"
would also be an option).

Mark

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to