๐ ย ๊ฒฐ๊ณผ
2022-10-26.9.23.51.mov
๐ ย ์ฐธ๊ณ ๋งํฌ
Skeleton-Loading
๋ฉ๋ชจ๋ฆฌ๋์ ์๋ฌ ํด๊ฒฐ
material-UI Skeleton
๐ ย ๋ฉ๋ชจ
* skeleton ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ฐ๋ก ๋ง๋ค์๋ค.
* ํญ์ ๋ก๋ฉ์ค์๋ ์ค์ผ๋ ํค์ ๋ณด์ฌ์ฃผ๊ณ , ๋ก๋ฉ์ด ๋๋๋ฉด ์๋ต๋ฐ์ data ๋ฅผ ๋ณด์ฌ์ฃผ๋ฏ๋ก ์ค๋ณต์ฝ๋๊ฐ ๋ง์ useSkeleton ํ
์ ๋ฐ๋ก ๋ง๋ฆ
* data ๋ฅผ ์จ์ ํ ๋ฐ์์ค๊ธฐ ์ ์ ๋ค๋ฅธ api ๋ฅผ ์์ฒญํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ์๋ฌ๊ฐ ์ผ์ด๋๋ฏ๋ก, unmount ์ผ๋ api ์์ฒญ์ ๊ทธ๋ง๋๋๋ก ์ค์ ํจ
๐ต ย useSkeleton.js
useSkeleton.js ์ปค์คํ
ํ
์์ฑ
const useSkeleton = getData => {
const [ loading , setLoading ] = useState ( true )
const [ isSubscribed , setIsSubscribed ] = useState ( true )
useEffect ( ( ) => {
if ( ! loading ) return
if ( isSubscribed )
setTimeout ( ( ) => { // ์ค์ผ๋ ํค ํ๋ฉด์ ์ ๋นํ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด setTimeout ์ฌ์ฉ
setLoading ( false )
} , 1500 )
} , [ loading ] )
useEffect ( ( ) => {
getData ( )
return ( ) => setIsSubscribed ( false ) // unmount ์ผ ๋, api ์์ฒญ ์ค์ง
} , [ ] )
return { loading}
}
useSkeleton ํ
๊บผ๋ด์ฐ๊ธฐ ( ex video.js )
const Video = ( { id} ) => {
const [ videos , setVideos ] = useState ( [ ] )
const getVideos = ( ) => {
api
. getVideos ( id )
. then ( res => {
console . log ( res . data )
const { results} = res . data
setVideos ( results )
} )
. catch ( e => {
console . log ( e )
} )
}
const { loading} = useSkeleton ( getVideos ) // useSkeleton ํ
return (
< Grid container spacing = { 1 } >
{ videos . map ( video => (
< Grid key = { video . id } item xs = { 12 } sm = { 6 } lg = { 4 } >
< Box sx = { BoxStyle } >
{ loading ? ( // loading ์ค => Skeleton ๋์ฐ๊ธฐ
< Skeleton
style = { contentStyle }
animation = "wave"
variant = "rectangular"
/>
) : ( // loading ์๋ฃ => ๋ฐ์ดํฐ ํ๋ฉด ๋์ฐ๊ธฐ
< iframe
style = { contentStyle }
src = { `https://www.youtube.com/embed/${ video . key } ?autoplay=1` }
> </ iframe >
) }
</ Box >
</ Grid >
) ) }
</ Grid >
)
}
๐ ย ๊ฒฐ๊ณผ
2022-10-26.9.23.51.mov
๐ ย ์ฐธ๊ณ ๋งํฌ
Skeleton-Loading
๋ฉ๋ชจ๋ฆฌ๋์ ์๋ฌ ํด๊ฒฐ
material-UI Skeleton
๐ ย ๋ฉ๋ชจ
๐ต ย useSkeleton.js