Skip to content

Skeletonย #4

@ijieun0123

Description

@ijieun0123

๐Ÿ˜‡ ย  ๊ฒฐ๊ณผ

2022-10-26.9.23.51.mov


๐Ÿ”— ย  ์ฐธ๊ณ  ๋งํฌ

Skeleton-Loading
๋ฉ”๋ชจ๋ฆฌ๋ˆ„์ˆ˜ ์—๋Ÿฌ ํ•ด๊ฒฐ
material-UI Skeleton



๐Ÿ“ ย  ๋ฉ”๋ชจ

* skeleton ์€ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.
* ํ•ญ์ƒ ๋กœ๋”ฉ์ค‘์—๋Š” ์Šค์ผˆ๋ ˆํ†ค์„ ๋ณด์—ฌ์ฃผ๊ณ , ๋กœ๋”ฉ์ด ๋๋‚˜๋ฉด ์‘๋‹ต๋ฐ›์€ data ๋ฅผ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ ์ค‘๋ณต์ฝ”๋“œ๊ฐ€ ๋งŽ์•„ useSkeleton ํ›…์„ ๋”ฐ๋กœ ๋งŒ๋“ฆ
* data ๋ฅผ ์˜จ์ „ํžˆ ๋ฐ›์•„์˜ค๊ธฐ ์ „์— ๋‹ค๋ฅธ api ๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์—๋Ÿฌ๊ฐ€ ์ผ์–ด๋‚˜๋ฏ€๋กœ, unmount ์ผ๋•Œ api ์š”์ฒญ์„ ๊ทธ๋งŒ๋‘๋„๋ก ์„ค์ •ํ•จ


๐Ÿ”ต ย  useSkeleton.js

  1. 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}
}

  1. 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>
  )
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions