當我們首次開啟一個app的時候會請求介面獲取資料,那麼獲取資料的這段時間展示什麼給使用者呢?國內很多app都是千篇一律的用一個菊花代替(俗稱loading),或者更有心一點的做一個好看一點的loading,但是這樣當拿到資料渲染頁面的時候會很生硬的切換,總感覺很low。
facebook首頁列表是用一個接近真實佈局的骨架動畫來代替loading,這東西可以稱之為skeleton screen或者placeholder,但是翻譯過來真不知道該翻譯成什麼合適,這麼做的好處就是在內容載入完成後可以做到流暢無縫切換真實佈局,細節決定產品的質量,我覺得facebook對使用者體驗,互動的細節做的挺不錯。先上一張我的fb截圖。
rn-placeholder是rn版本的placeholder,我在次基礎上做了對flastlist,listview,SectionList的適配封裝。先看一下在我的開源專案中的效果:
看完上面的效果是不是感覺比傳統的loading要舒服多了,下面是example:
一:flastlist,listview,SectionList使用demo
import { ListItem, ListParagraph } from 'components';
export default class Zi extends Component {
render() {
const { loading } = this.props;
return (
<ListParagraph
ParagraphLength={4} // 要渲染的條數
isLoading={loading} // loading狀態
hasTitle // 是否需要title
list={this.sectionList} // 這就是SectionList的函式
/>
);
}
}複製程式碼
注:ListParagraph元件目前在我開源專案中,還沒有新增到npm,有需要的到我專案中拿,專案地址在文章末尾
二:左圖右內容佈局
import Placeholder from 'rn-placeholder';
export default class Cheng extends Component {
render() {
return <Placeholder.ImageContent
size={60}
animate="fade"
lineNumber={4}
lineSpacing={5}
lastLineWidth="70%"
onReady={this.state.isReady}
>
<Text>左圖右內容佈局</Text>
</Placeholder.ImageContent>
}
}複製程式碼
三:段落佈局
import Placeholder from 'rn-placeholder';
export default class Cheng extends Component {
render() {
return <Placeholder.Paragraph
size={60}
animate="fade"
lineNumber={4}
lineSpacing={5}
lastLineWidth="30%"
onReady={this.state.isReady}
>
<Text>段落佈局</Text>
</Placeholder.Paragraph>
}
}複製程式碼
四:還有Line(行佈局),Media(圖片佈局),使用方法跟 三 一樣。
完美收官!
專案demo地址:github.com/duheng/Mozi
THE END!