最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React實現(xiàn)一個通用骨架屏組件示例

 更新時間:2021年12月06日 15:39:12   作者:magic_zhu  
骨架屏就是在頁面數(shù)據(jù)尚未加載前先給用戶展示出頁面的大致結(jié)構(gòu),直到請求數(shù)據(jù)返回后再渲染頁面,補充進(jìn)需要顯示的數(shù)據(jù)內(nèi)容,本文就介紹了React實現(xiàn)一個通用骨架屏組件示例,分享給大家,感興趣的可以了解一下

骨架屏是什么?

找到這里的同志,或多或少都對骨架屏有所了解,請容許我先啰嗦一句。骨架屏(Skeleton Screen)是一種優(yōu)化用戶弱網(wǎng)體驗的方案,可以有效緩解用戶等待的焦躁情緒。

Demo

先看個demo 大概了解下最終的產(chǎn)物及其使用方式

npm install obiusm-react-components
import { Skeleton } from 'obiusm-react-components';
  <Skeleton isVisible={true}>
    <div className="wrapper">
      <div className="content1"></div>
      <div data-skeleton-ignore={true}>123456</div>
      <div className="content2"></div>
      <div className="content3" data-skeleton-style={{ width: '50%' }}></div>
    </div>
  </Skeleton>

只需要在自己寫的組件外面包一層決定其是否顯示就可以了

設(shè)計思路

骨架可以在真實內(nèi)容沒有加載出來前讓用戶提前感知,可以提高用戶體驗 如果我們每次寫組件的時候都要為其定制骨架,那就顯得相當(dāng)繁瑣

得益于React props的這種數(shù)據(jù)數(shù)據(jù)傳遞方式,我們在props中可以輕松拿到整顆ReactElement的樹。 那么我們只需要去遞歸遍歷這個樹從而去模仿其結(jié)構(gòu),復(fù)制其class就可以實現(xiàn)自動生成骨架了。

但在具體的使用上,我們可能只需要結(jié)構(gòu)前幾層的結(jié)構(gòu)而不需要模擬整顆樹的結(jié)構(gòu),也有可能自動生成的樣式太丑我們需要定制其節(jié)點樣式,還有可能我們不需要關(guān)注一些浮層類的內(nèi)容或者說想忽略某一個節(jié)點

所以大概需要實現(xiàn)以下幾個功能

  • 設(shè)定遞歸深度
  • 提供忽略節(jié)點的方法
  • 提供定制骨架節(jié)點樣式的方法

具體實現(xiàn)

首先定義一個組件函數(shù)來決定是渲染骨架屏還是真實元素

function Skeleton(props: Props) {
  if (!props) {
    return <div />;
  }
  if (props.isVisible) {
    return createModal(props.children, props.depth || 4, 0);
  } else {
    return props.children ? props.children : <div />;
  }
}

createModal 對Skeleton下面包住的div進(jìn)行遞歸遍歷, 每次遞歸的時候?qū)urrent+1并傳遞下去,這樣我們可以判斷已經(jīng)遞歸了幾層了 判斷一下每個節(jié)點上data-skeleton-ignore是否有data-skeleton-style從而特殊處理就可以了

const createModal = (child: ReactElement, depth: number, current: number) => {
  if (
    depth === current ||
    (child && child.props && child.props['data-skeleton-ignore'])
  ) {
    return;
  }
  if (
    child &&
    child.props &&
    child.props.children &&
    Array.isArray(child.props.children) &&
    current < depth - 1
  ) {
    return (
      <div
        className={`${
          child.props.className !== undefined ? child.props.className : ''
        } ${'react-skeleton'}`}
        style={
          child.props && child.props['data-skeleton-style']
            ? child.props['data-skeleton-style']
            : {}
        }
        key={Math.random() * 1000}
      >
        {child.props.children && child.props.children.length > 0
          ? child.props.children.map((child: any) => {
              return createModal(child, depth, current + 1);
            })
          : '*'}
      </div>
    );
  } else {
    return (
      <div
        className={`${
          child.props && child.props.className ? child.props.className : ''
        } ${'react-skeleton2'}`}
        style={
          child.props && child.props['data-skeleton-style']
            ? child.props['data-skeleton-style']
            : {}
        }
        key={Math.random() * 1000}
      >
        *
      </div>
    );
  }
};

完整代碼及其使用文檔

完整代碼 obiusm-react-components

文檔 https://magic-zhu.github.io/obiusm-react-components-docs/components/skeleton/

到此這篇關(guān)于React實現(xiàn)一個通用骨架屏組件示例的文章就介紹到這了,更多相關(guān)React 骨架屏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React.js綁定this的5種方法(小結(jié))

    React.js綁定this的5種方法(小結(jié))

    this在javascript中已經(jīng)相當(dāng)靈活,這篇文章主要介紹了React.js綁定this的5種方法(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • React?保留和重置State

    React?保留和重置State

    這篇文章主要為大家介紹了React?保留和重置State實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • react中使用swiper的具體方法

    react中使用swiper的具體方法

    本篇文章主要介紹了react中使用swiper的具體方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • react native 仿微信聊天室實例代碼

    react native 仿微信聊天室實例代碼

    這篇文章主要介紹了react native 仿微信聊天室實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • React結(jié)合Drag?API實現(xiàn)拖拽示例詳解

    React結(jié)合Drag?API實現(xiàn)拖拽示例詳解

    這篇文章主要為大家介紹了React結(jié)合Drag?API實現(xiàn)拖拽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • react-native ListView下拉刷新上拉加載實現(xiàn)代碼

    react-native ListView下拉刷新上拉加載實現(xiàn)代碼

    本篇文章主要介紹了react-native ListView下拉刷新上拉加載實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • react map使用方法實例詳解

    react map使用方法實例詳解

    map()方法是在React中常用的數(shù)組處理方法之一,可以用于遍歷數(shù)組、生成組件列表以及進(jìn)行數(shù)據(jù)轉(zhuǎn)換等操作,通過合理運用map()方法,可以更靈活地處理和展示數(shù)據(jù),下面給大家講解react map使用方法,感興趣的朋友一起看看吧
    2023-10-10
  • React官方團(tuán)隊完善原生Hook閉包陷阱

    React官方團(tuán)隊完善原生Hook閉包陷阱

    這篇文章主要為大家介紹了React官方團(tuán)隊出手,補齊原生Hook短板閉包陷阱的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 解析react?函數(shù)組件輸入卡頓問題?usecallback?react.memo

    解析react?函數(shù)組件輸入卡頓問題?usecallback?react.memo

    useMemo是一個react hook,我們可以使用它在組件中包裝函數(shù)??梢允褂盟鼇泶_保該函數(shù)中的值僅在依賴項之一發(fā)生變化時才重新計算,這篇文章主要介紹了react?函數(shù)組件輸入卡頓問題?usecallback?react.memo,需要的朋友可以參考下
    2022-07-07
  • Vite+React+TypeScript手?jǐn)]TodoList的項目實踐

    Vite+React+TypeScript手?jǐn)]TodoList的項目實踐

    本文主要介紹了Vite+React+TypeScript手?jǐn)]TodoList的項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論

清苑县| 盘山县| 布尔津县| 抚顺市| 柘城县| 湖口县| 沙湾县| 金昌市| 金溪县| 错那县| 堆龙德庆县| 贡嘎县| 彭州市| 安平县| 蒙城县| 台东县| 青神县| 阿鲁科尔沁旗| 江门市| 曲周县| 柳州市| 循化| 东宁县| 秦皇岛市| 鹿邑县| 陵水| 福州市| 大足县| 梅河口市| 道孚县| 玛多县| 清流县| 梁山县| 伊春市| 大余县| 安阳市| 剑阁县| 新余市| 资溪县| 农安县| 丰县|