React 实现骨架屏组件

墨蓝 2022-10-24 05:52 403阅读 0赞

思路其实就是:当数据未返回的时候,渲染骨架屏组件,数据返回之后,渲染真正的组件

  1. | - skeletons
  2. | - OrderSkeletons
  3. | - index.js
  4. | - index.less
  5. | - index.js

index.js

  1. export { default as OrderSkeletons } from './OrderSkeletons';

index.js

  1. import React, { useState, useEffect } from 'react';
  2. import './index.less';
  3. export default function (props) {
  4. const [state, setState] = useState(Array(3).fill(1));
  5. useEffect(() => {
  6. }, [])
  7. return (
  8. <div className='order-skeletons'>
  9. { state.map(item => (
  10. <div className='order-item' key={ item}>
  11. <div className={ 'skeletons left'}></div>
  12. <div className='center'>
  13. <div className={ 'skeletons title'}></div>
  14. <div className={ 'skeletons price'}></div>
  15. <div className={ 'skeletons time'}></div>
  16. </div>
  17. <div className={ 'skeletons pay'}>
  18. </div>
  19. </div>
  20. ))}
  21. </div>
  22. )
  23. }

index.less

  1. @import '../../assets/mixin.less';
  2. .order-skeletons {
  3. .order-item {
  4. .flex(row, flex-start);
  5. margin-bottom: 12px;
  6. padding: 12px;
  7. width: 100%;
  8. box-sizing: border-box; .left {
  9. width: 120px;
  10. height: 80px;
  11. }
  12. .center {
  13. flex: 1;
  14. margin: 0 12px; .price {
  15. margin: 12px 0;
  16. width: 50px;
  17. }
  18. .time {
  19. width: 120px;
  20. }
  21. }
  22. .pay {
  23. margin-right: 4px;
  24. width: 70px;
  25. height: 30px;
  26. }
  27. }
  28. }
  29. /* Skeletons效果 */
  30. .skeletons {
  31. position: relative;
  32. display: block;
  33. overflow: hidden;
  34. width: 100%;
  35. min-height: 20px;
  36. background-color: #ededed;
  37. }
  38. .skeletons:empty::after {
  39. display: block;
  40. content: '';
  41. position: absolute;
  42. width: 100%;
  43. height: 100%;
  44. transform: translateX(-100%);
  45. background: linear-gradient(90deg, transparent, rgba(216, 216, 216, 0.253), transparent);
  46. animation: loading 1.5s infinite;
  47. }
  48. @keyframes loading { /* 骨架屏动画 */
  49. from {
  50. left: -100%;
  51. }
  52. to {
  53. left: 120%;
  54. }
  55. }

mixin.less

  1. .flex(@direction:row, @justify:center, @align:center){
  2. display: flex;
  3. flex-direction: @direction;
  4. justify-content: @justify;
  5. align-items: @align;
  6. }

组件用法

  1. import { OrderSkeletons } from '@/skeletons'
  2. export default function(props){
  3. const [state, setState] = useState()
  4. useEffect(() => {
  5. }, [])
  6. console.log(props)
  7. return (
  8. <div>
  9. { isEmpty(props?.orders) ?
  10. <OrderSkeletons toast /> :
  11. <div className='tab-lists'>
  12. //....
  13. </div>
  14. }
  15. </div>
  16. )
  17. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,403人围观)

还没有评论,来说两句吧...

相关阅读

    相关 骨架组件

    一般情况下,在首屏数据未拿到之前,为了提升用户的体验,会在页面上展示一个loading的图层,但是会有一段时间显示白屏; 因此为了更进一步优化用户体验,就有了骨架屏;在页面

    相关 react 实现组件

    在浏览器中访问页面,需要对页面中的其中一个组件能够实现全屏展示 实现效果 ![20200712140516612.gif][] 直接复制下面代码到项目中即可使用