pixi-viewport icon indicating copy to clipboard operation
pixi-viewport copied to clipboard

Problem with viewport.destroy() when React component gets dismounted

Open darotar opened this issue 2 years ago • 3 comments

I've experienced a problem when I was destroying the viewport on component dismounting in React

the dismount logic is pretty straight-forward:

React.useEffect(() => {
   return () => {
      viewport.destroy();
   };
})

The problem occurs connected with removing event listeners from domElement when destroying - as in React dismounting, markup's being removed from DOM first and side effects get done secondy, thus it throws the error that there's no "removeEventListener" of "undefined", domElement doesn't exist already

image

As my current workaround, I'm just adding fake domElement because I see these final steps are only related to event listeners removing and they were blocking further going to super.destroy() part

React.useEffect(() => {
   return () => {
      let div = document.createElement('div');

      if (!viewport.options.events.domElement) {
         viewport.options.events.domElement = div;
      }

      viewport.destroy({
         children: true,
         texture: true,
         baseTexture: true,
      });

      div = undefined;
   }
});

I don't consider it a viewport library issue, as viewport's flow just wants to make things in right order, just was wondering if there's still some adjustments required that would allow to avoid such issues.

E.g. I could raise a small PR for checking existance of domElement while trying to destroy eventListeners

Thank you

darotar avatar Dec 05 '23 06:12 darotar

Not sure if it will fix this for you but im just dismount the stage instead.

ArthurTimofey avatar Dec 11 '23 11:12 ArthurTimofey

Arthur is there a way to do that using the React Pixi stage component?

s0rta avatar Dec 22 '23 20:12 s0rta

Arthur is there a way to do that using the React Pixi stage component?

Yup, you can use the key prop for the stage, set that key string in a state and update the key using set state to another value to cause re render of the canvas.

ArthurTimofey avatar Dec 23 '23 09:12 ArthurTimofey