微信小程序電商實(shí)戰(zhàn)-骨架屏實(shí)現(xiàn)

本文章是一個(gè)系列文章,以一個(gè)完整的可用于生產(chǎn)的實(shí)際項(xiàng)目探索微信小程序開(kāi)發(fā)中我們經(jīng)常會(huì)遇到的問(wèn)題,希望能提供完美的解決方案,這次是本系列文章的第二篇了,以下列出該系列文章鏈接。

  1. 微信小程序及h5,基于taro,zoro最佳實(shí)踐探索
  2. 微信小程序電商實(shí)戰(zhàn)-登錄模塊設(shè)計(jì)
  3. 微信小程序電商實(shí)戰(zhàn)-自定義頂部導(dǎo)航欄

工作忙碌,難得有時(shí)間繼續(xù)開(kāi)發(fā)研究這個(gè)項(xiàng)目,目前完成了,基礎(chǔ)設(shè)施開(kāi)發(fā)及首頁(yè)得開(kāi)發(fā),話不多說(shuō),老規(guī)矩,先來(lái)看下效果吧

骨架屏效果演示.png

這是根據(jù)頁(yè)面布局自動(dòng)生成得骨架屏,目前非常流行的一種提升體驗(yàn)的辦法

為了能看到骨架屏的渲染,我調(diào)慢了所有接口的響應(yīng)速度,因此演示響應(yīng)較慢


首頁(yè)效果演示.gif

整體效果還不錯(cuò)吧(沾沾自喜中~)

骨架屏的思路

骨架屏的實(shí)現(xiàn)思路相對(duì)較簡(jiǎn)單,使用方法也很方便

我們知道微信小程序已經(jīng)開(kāi)發(fā)了選擇器功能,可以利用此特性獲取到dom節(jié)點(diǎn),為了能讓骨架屏組件知道該如何繪制,我們需要做如下約定:

  1. 約定.skeleton樣式類為骨架屏查找繪制節(jié)點(diǎn)的根節(jié)點(diǎn)
  2. 約定.skeleton-square樣式類,表示繪制當(dāng)前節(jié)點(diǎn)的骨架節(jié)點(diǎn)樣式為方形(如商品卡片)
  3. 約定.skeleton-circular樣式類,表示繪制當(dāng)前節(jié)點(diǎn)的骨架節(jié)點(diǎn)為圓形(如logo)
  4. 約定.skeleton-cylinder樣式類,表示繪制當(dāng)前節(jié)點(diǎn)的骨架節(jié)點(diǎn)為長(zhǎng)條形(如搜索框)
  5. 約定.skeleton-light與.skeleton-dark為塊元素背景骨架樣式

骨架屏的使用

首先我們需要引入skeleton組件到頁(yè)面中,并且在頁(yè)面根元素上加上.skeleton樣式

<View className={classNames(styles.home, 'skeleton')}>
  {initialize && <ComponentCommonSkeleton />}
</View>

然后在對(duì)應(yīng)元素中加入不同的樣式類,繪制骨架

<View className={classNames(styles.hotsale, 'skeleton-light')}>
  <View className={styles.header}>
    <View className={classNames(styles.title, 'skeleton-square')}>
      今日熱賣
    </View>
    <View className={classNames(styles.tip, 'skeleton-square')}>
      每日推薦,超值搶購(gòu)
    </View>
  </View>
</View>

骨架屏的實(shí)現(xiàn)

完整的實(shí)現(xiàn)邏輯,由于代碼較多,不與全部給出,有興趣的直接去倉(cāng)庫(kù)吧skeleton源碼

我們來(lái)看一下關(guān)鍵代碼,如何獲取骨架節(jié)點(diǎn)

// 利用微信小程序的selectorQuery查找相關(guān)節(jié)點(diǎn)
selectAll = selector =>
  new Promise(resolve =>
    Taro.createSelectorQuery()
      .selectAll(selector)
      .boundingClientRect()
      .exec(res => resolve(res[0])),
  )
componentDidMount() {
  const { selector } = this.props
  
  // 利用微信小程序跨自定義組件選擇器`>>>`獲取節(jié)點(diǎn)信息
  
  Promise.all([
    this.selectAll(`.${selector} >>> .${selector}-light`),
    this.selectAll(`.${selector} >>> .${selector}-dark`),
    this.selectAll(`.${selector} >>> .${selector}-square`),
    this.selectAll(`.${selector} >>> .${selector}-circular`),
    this.selectAll(`.${selector} >>> .${selector}-cylinder`),
  ]).then(([lights, darks, squares, circulars, cylinders]) =>
    // 存儲(chǔ)節(jié)點(diǎn)信息,用于渲染骨架屏
    this.setState({
      lights,
      darks,
      squares,
      circulars,
      cylinders,
    }),
  )
}

獲取到了相關(guān)節(jié)點(diǎn)信息,比如width,height,top,left等信息后,便可以利用絕對(duì)定位或者fixed繪制骨架了

當(dāng)然這只能解決常駐組件的獲取,對(duì)于一些動(dòng)態(tài)組件,比如列表渲染我們?cè)撊绾翁幚砟?,這里是一個(gè)比較麻煩的問(wèn)題,我們需要在數(shù)據(jù)還未獲取之前,給列表數(shù)據(jù)設(shè)置部分默認(rèn)數(shù)據(jù)

比如: 設(shè)置默認(rèn)的props或者state,這樣項(xiàng)目初始化時(shí)便會(huì)渲染默認(rèn)數(shù)據(jù),也就可以獲取到節(jié)點(diǎn)了

該項(xiàng)目托管于github,如有需要,請(qǐng)自取weapp-clover,感謝關(guān)注,感謝star

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:jayzouhttps://segmentfault.com/a/1190000015876164 首屏 一...
    grain先森閱讀 3,665評(píng)論 0 5
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,183評(píng)論 4 61
  • 身為一個(gè)理工男,在一顆好奇心的驅(qū)動(dòng)下,永無(wú)止境的探索未知領(lǐng)域的精神一直陪伴著我生長(zhǎng)。能活到今天,而且不聾不啞、四肢...
    失落的羊閱讀 898評(píng)論 11 0
  • 很多時(shí)候我們都想要更清楚的去看清楚別人,但是我們總是看不明白,因?yàn)槿诵亩嘧兌液茈y猜透。 其實(shí)我們最應(yīng)該的就是人清...
    猴爸陪你讀書閱讀 589評(píng)論 0 1
  • 看了公主的微博,頓時(shí)覺(jué)得自己好沒(méi)用,還要很努力很努力,才能過(guò)上自己想要的生活。 一個(gè)人要活好一輩子已經(jīng)很艱難了,哪...
    林納啊閱讀 145評(píng)論 0 1

友情鏈接更多精彩內(nèi)容