Skip to content

Commit 0723e02

Browse files
committed
Prevent multiple calls of "createRoot"
1 parent 31b03f9 commit 0723e02

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

src/r3f/components/CanvasDOMOverlay.jsx

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useMemo, useEffect, StrictMode, forwardRef } from 'react';
1+
import { useMemo, useEffect, StrictMode, forwardRef, useState } from 'react';
22
import { createRoot } from 'react-dom/client';
33
import { useThree } from '@react-three/fiber';
44

@@ -7,8 +7,8 @@ export const CanvasDOMOverlay = forwardRef( function CanvasDOMOverlay( { childre
77

88
// create the dom element and react root
99
const [ gl ] = useThree( state => [ state.gl ] );
10+
const [ root, setRoot ] = useState( null );
1011
const container = useMemo( () => document.createElement( 'div' ), [] );
11-
const root = useMemo( () => createRoot( container ), [ container ] );
1212

1313
// position the container
1414
useEffect( () => {
@@ -29,13 +29,30 @@ export const CanvasDOMOverlay = forwardRef( function CanvasDOMOverlay( { childre
2929

3030
}, [ container, gl.domElement.parentNode ] );
3131

32+
// create the react render root
33+
useEffect( () => {
34+
35+
const root = createRoot( container );
36+
setRoot( root );
37+
return () => {
38+
39+
root.unmount();
40+
41+
};
42+
43+
}, [ container ] );
44+
3245
// render the children into the container
33-
root.render(
34-
<StrictMode>
35-
<div { ...rest } ref={ ref }>
36-
{ children }
37-
</div>
38-
</StrictMode>
39-
);
46+
if ( root !== null ) {
47+
48+
root.render(
49+
<StrictMode>
50+
<div { ...rest } ref={ ref }>
51+
{ children }
52+
</div>
53+
</StrictMode>
54+
);
55+
56+
}
4057

4158
} );

0 commit comments

Comments
 (0)