vue.js實(shí)現(xiàn)一個(gè)瀑布流的組件
引言
我所見(jiàn)過(guò)的瀑布流都是固定的幾列,然后每一列包含若干個(gè)元素(圖文元素),每一列的總高度都差不多。
所以我這個(gè)組件的功能就很簡(jiǎn)單,可以設(shè)置列數(shù)量,然后只要再寫(xiě)一個(gè)渲染元素的方法,即可使用。
組件說(shuō)明
組件名:<tag-autoflow />
參數(shù)名 | 類(lèi)型 | 說(shuō)明 |
---|---|---|
data | Array | 數(shù)據(jù)源 |
column_size | Number | 列的數(shù)量 |
renderItem | Function | 目前只能通過(guò)render函數(shù)渲染子元素,還不支持模板。 有三個(gè)參數(shù) h, item,將被渲染的元素 next,是一個(gè)function,在渲染子元素的合適時(shí)機(jī)(例如img的onload事件里),調(diào)用next()即可。 如不調(diào)用next將只能渲染一個(gè)元素,無(wú)法繼續(xù)渲染。 |
簡(jiǎn)單的使用例子
export default { data() { // 隨機(jī)生成20個(gè)測(cè)試數(shù)據(jù) const num = 20; var list = new Array(num).fill(0).map((v, i) => { return this.createItem(i); }) return { list, } }, // 直接用render函數(shù)來(lái)寫(xiě),因?yàn)槲矣X(jué)得這樣寫(xiě)props更直觀一點(diǎn) render(h){ return h('tag-autoflow', { props:{ // 設(shè)置列數(shù)量 column_size:3, // 數(shù)據(jù)源 data: this.list, // 渲染item的方法,參數(shù)目前提供三個(gè) // h 瀑布流組件的createElement方法,非父組件的 // item 要渲染的元素對(duì)象 // next 必須主動(dòng)調(diào)用next,插件才會(huì)自動(dòng)去渲染下一個(gè)元素,詳細(xì)說(shuō)明見(jiàn)下文 renderItem(h, item, next){ // 簡(jiǎn)單的渲染一個(gè)img跟一個(gè)p標(biāo)簽 // 因?yàn)閕mg標(biāo)簽的圖片加載需要時(shí)間,而圖片影響了計(jì)算所在列的高度 // 所以需要在img觸發(fā)了load事件后,再去調(diào)用next渲染下一個(gè)item。 return h('div', [ h('img', { attrs: { src: item.img }, on: { load: e => { next(); } } }), h('p', item.title) ]) }, }, }); }, methods:{ createItem(i) { var title = i + ',' + new Array(_.random(10, 150)).fill('哈').join(''); var img = `http://via.placeholder.com/${_.random(100, 400)}x${_.random(100, 400)}`; return { img, title, } }, } }
渣渣效果圖
代碼里是一次性生成的20個(gè)元素,頁(yè)面渲染的時(shí)候,很明顯的能看出來(lái)是在一個(gè)img觸發(fā)了load事件之后才渲染下一個(gè)元素。
如果花點(diǎn)心思加一些動(dòng)畫(huà)效果應(yīng)該很酷吧。
如果你要渲染的item不包含圖片,純文字的話,可以通過(guò)這種寫(xiě)法調(diào)用next。保證了計(jì)算列高度的準(zhǔn)確性。
renderItem(h, item, next){ this.$nextTick(function(){ next(); }); return h('p', item.title); },
瀑布流的流程說(shuō)明
- 先根據(jù)參數(shù)生成對(duì)應(yīng)數(shù)量的列,
- 判斷data是否有元素,沒(méi)有就結(jié)束。
- 從data里面shift()拿到一個(gè)元素item,
- 找出當(dāng)前高度最小的一列,將item放入該列。
- 渲染item,然后調(diào)用next()方法進(jìn)入2
TODO
- 瀑布流還有個(gè)常見(jiàn)的功能就是滾動(dòng)加載了,目前尚未加入此功能,會(huì)盡快加上。
- 元素加載的過(guò)渡動(dòng)畫(huà)
以上就是vue.js實(shí)現(xiàn)一個(gè)瀑布流的組件的詳細(xì)內(nèi)容,更多關(guān)于vue.js瀑布流組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue導(dǎo)入excel文件,vue導(dǎo)入多個(gè)sheets的方式
這篇文章主要介紹了vue導(dǎo)入excel文件,vue導(dǎo)入多個(gè)sheets的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Vue.js實(shí)現(xiàn)開(kāi)發(fā)購(gòu)物車(chē)功能的方法詳解
這篇文章主要介紹了Vue.js實(shí)現(xiàn)開(kāi)發(fā)購(gòu)物車(chē)功能的方法,結(jié)合實(shí)例形式分析了基于vue.js開(kāi)發(fā)的購(gòu)物車(chē)功能相關(guān)操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-02-02vue中實(shí)現(xiàn)圖片壓縮 file文件的方法
這篇文章主要介紹了vue中實(shí)現(xiàn)圖片壓縮 file文件的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05詳解vue-cli快速構(gòu)建vue應(yīng)用并實(shí)現(xiàn)webpack打包
這篇文章主要介紹了詳解vue-cli快速構(gòu)建vue應(yīng)用并實(shí)現(xiàn)webpack打包,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Vue3中實(shí)現(xiàn)發(fā)送網(wǎng)絡(luò)請(qǐng)求功能(最新推薦)
Axios是一個(gè)基于Promise的HTTP客戶端,可以在瀏覽器和Node.js中用于發(fā)送HTTP請(qǐng)求,本文主要介紹在Vue3中實(shí)現(xiàn)發(fā)送網(wǎng)絡(luò)請(qǐng)求功能,感興趣的朋友一起看看吧2023-12-12解決vue終端報(bào)錯(cuò):不是內(nèi)部或外部命令
最近學(xué)習(xí)一下前端框架Vue,整體上感覺(jué)還是比較有意思的,但是在安裝vue-cli腳手架的時(shí)候,出現(xiàn)了一些問(wèn)題,解決問(wèn)題也花費(fèi)了不少時(shí)間,下面這篇文章主要給大家介紹了關(guān)于解決vue終端報(bào)錯(cuò):不是內(nèi)部或外部命令的相關(guān)資料,需要的朋友可以參考下2023-02-02