@@ -6,6 +6,24 @@ type CreateRoot = (container: Element | DocumentFragment) => any
66
77export function getRenderer ( props ?: { createRoot ?: CreateRoot } ) : Renderer {
88 const createRoot = props ?. createRoot
9+ const wrappers = new WeakMap < HTMLElement , HTMLElement > ( )
10+
11+ function getWrapper ( container : HTMLElement ) {
12+ const wrapper = wrappers . get ( container )
13+
14+ if ( wrapper ) return wrapper
15+
16+ const span = document . createElement ( 'span' )
17+
18+ container . appendChild ( span )
19+ return wrappers . set ( container , span ) . get ( container ) as HTMLElement
20+ }
21+ function removeWrapper ( container : HTMLElement ) {
22+ const wrapper = wrappers . get ( container )
23+
24+ if ( wrapper ) wrapper . remove ( )
25+ wrappers . delete ( container )
26+ }
927
1028 if ( createRoot ) {
1129 const roots = new WeakMap < HTMLElement , any > ( )
@@ -14,27 +32,36 @@ export function getRenderer(props?: { createRoot?: CreateRoot }): Renderer {
1432 mount : ( (
1533 element : React . DOMElement < React . DOMAttributes < any > , any > ,
1634 container : HTMLElement
17- ) : Element => {
18- if ( ! roots . has ( container ) ) {
19- roots . set ( container , createRoot ( container ) )
35+ ) : Element => {
36+ const wrapper = getWrapper ( container )
37+
38+ if ( ! roots . has ( wrapper ) ) {
39+ roots . set ( wrapper , createRoot ( wrapper ) )
2040 }
21- const root = roots . get ( container )
41+ const root = roots . get ( wrapper )
2242
2343 return root . render ( element )
2444 } ) as ReactDOM . Renderer ,
2545 unmount : ( container : HTMLElement ) => {
26- const root = roots . get ( container )
46+ const wrapper = getWrapper ( container )
47+ const root = roots . get ( wrapper )
2748
2849 if ( root ) {
2950 root . unmount ( )
30- roots . delete ( container )
51+ roots . delete ( wrapper )
52+ removeWrapper ( container )
3153 }
3254 }
3355 }
3456 }
3557
3658 return {
37- mount : ReactDOM . render ,
38- unmount : ReactDOM . unmountComponentAtNode
59+ mount : ( ( element : React . DOMElement < React . DOMAttributes < any > , any > , container : HTMLElement ) : Element => {
60+ return ReactDOM . render ( element , getWrapper ( container ) )
61+ } ) as ReactDOM . Renderer ,
62+ unmount : ( container : HTMLElement ) => {
63+ ReactDOM . unmountComponentAtNode ( getWrapper ( container ) )
64+ removeWrapper ( container )
65+ }
3966 }
4067}
0 commit comments