correct the implementation of useMount

This commit is contained in:
Pig Fang 2020-06-06 10:12:16 +08:00
parent a1ce50609f
commit c7b8cdab40
5 changed files with 126 additions and 114 deletions

View File

@ -1,16 +1,20 @@
import { useEffect, useMemo } from 'react' import { useEffect, useRef } from 'react'
export default function useMount(selector: string): HTMLElement { export default function useMount(selector: string): HTMLElement | null {
const container = useMemo(() => document.createElement('div'), []) const container = useRef<HTMLDivElement | null>(null)
useEffect(() => { useEffect(() => {
const mount = document.querySelector(selector)! const mount = document.querySelector(selector)!
mount.appendChild(container) const div = document.createElement('div')
container.current = div
mount.appendChild(div)
return () => { return () => {
mount.removeChild(container) mount.removeChild(div)
container.current = null
} }
}, []) }, [])
return container return container.current
} }

View File

@ -238,7 +238,8 @@ const Show: React.FC = () => {
return ( return (
<React.Fragment> <React.Fragment>
{createPortal( {container &&
createPortal(
<React.Suspense fallback={<ViewerSkeleton />}> <React.Suspense fallback={<ViewerSkeleton />}>
<Previewer <Previewer
{...{ {...{

View File

@ -233,7 +233,8 @@ const Upload: React.FC = () => {
)} )}
</div> </div>
</div> </div>
{ReactDOM.createPortal( {container &&
ReactDOM.createPortal(
<React.Suspense fallback={<ViewerSkeleton />}> <React.Suspense fallback={<ViewerSkeleton />}>
<Previewer <Previewer
skin={type !== TextureType.Cape ? texture : undefined} skin={type !== TextureType.Cape ? texture : undefined}

View File

@ -17,7 +17,9 @@ const Previewer: React.FC<Props> = (props) => {
const skin = props.skin ? `${blessing.base_url}/textures/${props.skin}` : '' const skin = props.skin ? `${blessing.base_url}/textures/${props.skin}` : ''
const cape = props.cape ? `${blessing.base_url}/textures/${props.cape}` : '' const cape = props.cape ? `${blessing.base_url}/textures/${props.cape}` : ''
return ReactDOM.createPortal( return (
container &&
ReactDOM.createPortal(
<React.Suspense fallback={<ViewerSkeleton />}> <React.Suspense fallback={<ViewerSkeleton />}>
<Viewer skin={skin} cape={cape} isAlex={props.isAlex} showIndicator> <Viewer skin={skin} cape={cape} isAlex={props.isAlex} showIndicator>
{props.children} {props.children}
@ -25,6 +27,7 @@ const Previewer: React.FC<Props> = (props) => {
</React.Suspense>, </React.Suspense>,
container, container,
) )
)
} }
export default Previewer export default Previewer

View File

@ -28,7 +28,9 @@ const Previewer: React.FC<Props> = (props) => {
const { skin, cape, isAlex } = props const { skin, cape, isAlex } = props
return ReactDOM.createPortal( return (
container &&
ReactDOM.createPortal(
is3d ? ( is3d ? (
<React.Suspense fallback={<ViewerSkeleton />}> <React.Suspense fallback={<ViewerSkeleton />}>
<Viewer3d skin={skin} cape={cape} isAlex={isAlex}> <Viewer3d skin={skin} cape={cape} isAlex={isAlex}>
@ -42,6 +44,7 @@ const Previewer: React.FC<Props> = (props) => {
), ),
container, container,
) )
)
} }
export default Previewer export default Previewer