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

