微信小程序?qū)崙?zhàn)基于vue2實現(xiàn)瀑布流的代碼實例
瀑布流,又稱瀑布流式布局。是比較流行的一種網(wǎng)站頁面布局,視覺表現(xiàn)為參差不齊的多欄布局,隨著頁面滾動條向下滾動,這種布局還會不斷加載數(shù)據(jù)塊并附加至當前尾部。
1、什么是瀑布流呢?
瀑布流,又稱瀑布流式布局。是比較流行的一種網(wǎng)站頁面布局,視覺表現(xiàn)為參差不齊的多欄布局,隨著頁面滾動條向下滾動,這種布局還會不斷加載數(shù)據(jù)塊并附加至當前尾部。
瀑布流對于圖片的展現(xiàn),是高效而具有吸引力的,用戶一眼掃過的快速閱讀模式可以在短時間內(nèi)獲得更多的信息量,而瀑布流里懶加載模式又避免了用戶鼠標點擊的翻頁操作,瀑布流的主要特性便是錯落有致,定寬而不定高的設計讓頁面區(qū)別于傳統(tǒng)的矩陣式圖片布局模式,巧妙的利用視覺層級,視線的任意流動又緩解了視覺疲勞,同時給人以不拘一格的感覺,切中年輕一族的個性化心理。
下面這些就是用瀑布流來實現(xiàn),看起來是不是很美觀呢?


2、實現(xiàn)一個簡單的瀑布流
先看一下咱們最終的試下效果吧,只是簡單傳入文字進行演示

1、瀑布流的特點
1、琳瑯滿目:整版以圖片為主,大小不一的圖片按照一定的規(guī)律排列。
2、唯美:圖片的風格以唯美的圖片為主。
3、操作簡單:在瀏覽網(wǎng)站的時候只需要輕輕滑動一下鼠標滾輪,一切的美妙的圖片精彩便可呈現(xiàn)在你面前
2、核心算法
通過圖片我們可以直觀的看到,每一個卡片的高度都是不一樣的,需要我們實時能計算高度,同時左右的高度還是不能相互影響。
這里我們主要通過兩個數(shù)組進行實現(xiàn),即分為左右數(shù)組,核心代碼如下:
<view id="u-left-column" class="u-column">
<slot name="left" :leftList="leftList"></slot>
</view>
<view id="u-right-column" class="u-column">
<slot name="right" :rightList="rightList"></slot>
</view>
data() {
return {
leftList: [],
rightList: [],
tempList: [],
scrollTop: 0,
}
}對傳入數(shù)組進行分組和計算高度
async splitData() {
if (!this.tempList.length) return;
let leftRect = await this.$uGetRect('#u-left-column');
let rightRect = await this.$uGetRect('#u-right-column');
// 如果左邊小于或等于右邊,就添加到左邊,否則添加到右邊
let item = this.tempList[0];
// 解決多次快速上拉后,可能數(shù)據(jù)會亂的問題,因為經(jīng)過上面的兩個await節(jié)點查詢阻塞一定時間,加上后面的定時器干擾
// 數(shù)組可能變成[],導致此item值可能為undefined
if (!item) return;
if (leftRect.height < rightRect.height) {
this.leftList.push(item);
} else if (leftRect.height > rightRect.height) {
this.rightList.push(item);
} else {
// 這里是為了保證第一和第二張?zhí)砑訒r,左右都能有內(nèi)容
// 因為添加第一張,實際隊列的高度可能還是0,這時需要根據(jù)隊列元素長度判斷下一個該放哪邊
if (this.leftList.length <= this.rightList.length) {
this.leftList.push(item);
} else {
this.rightList.push(item);
}
}
// 移除臨時列表的第一項
this.tempList.splice(0, 1);
// 如果臨時數(shù)組還有數(shù)據(jù),繼續(xù)循環(huán)
if (this.tempList.length) {
this.splitData();
return
}
}3、完整的組件代碼如下
<template>
<scroll-view class="scroll-y" scroll-y="true" @scrolltolower="tolower" :scroll-top="scrollTop">
<view class="u-waterfall" id="list">
<view id="u-left-column" class="u-column">
<slot name="left" :leftList="leftList"></slot>
</view>
<view id="u-right-column" class="u-column">
<slot name="right" :rightList="rightList"></slot>
</view>
</view>
</scroll-view>
</template>
<script>
export default {
name: "waterfall",
props: {
value: {
// 瀑布流數(shù)據(jù)
type: Array,
required: true,
default: function() {
return [];
}
},
scrolltolower: {
type: Function,
default: () => {}
}
},
data() {
return {
leftList: [],
rightList: [],
tempList: [],
scrollTop: 0,
}
},
watch: {
copyFlowList(nVal, oVal) {
this.tempList = this.cloneData(this.copyFlowList);
this.splitData();
}
},
mounted() {
this.tempList = this.cloneData(this.copyFlowList);
this.splitData();
// this.$on('clearWaterFall', this.clear)
},
computed: {
// 破壞flowList變量的引用,否則watch的結(jié)果新舊值是一樣的
copyFlowList() {
return this.cloneData(this.value);
}
},
methods: {
async splitData() {
if (!this.tempList.length) return;
let leftRect = await this.$uGetRect('#u-left-column');
let rightRect = await this.$uGetRect('#u-right-column');
// 如果左邊小于或等于右邊,就添加到左邊,否則添加到右邊
let item = this.tempList[0];
// 解決多次快速上拉后,可能數(shù)據(jù)會亂的問題,因為經(jīng)過上面的兩個await節(jié)點查詢阻塞一定時間,加上后面的定時器干擾
// 數(shù)組可能變成[],導致此item值可能為undefined
if (!item) return;
if (leftRect.height < rightRect.height) {
this.leftList.push(item);
} else if (leftRect.height > rightRect.height) {
this.rightList.push(item);
} else {
// 這里是為了保證第一和第二張?zhí)砑訒r,左右都能有內(nèi)容
// 因為添加第一張,實際隊列的高度可能還是0,這時需要根據(jù)隊列元素長度判斷下一個該放哪邊
if (this.leftList.length <= this.rightList.length) {
this.leftList.push(item);
} else {
this.rightList.push(item);
}
}
// 移除臨時列表的第一項
this.tempList.splice(0, 1);
// 如果臨時數(shù)組還有數(shù)據(jù),繼續(xù)循環(huán)
if (this.tempList.length) {
this.splitData();
return
}
},
// 復制而不是引用對象和數(shù)組
cloneData(data) {
return JSON.parse(JSON.stringify(data));
},
tolower(e) {
this.scrolltolower()
},
clear() {
this.leftList = []
this.rightList = []
}
}
}
</script>
<style lang="scss" scoped>
@mixin vue-flex($direction: row) {
/* #ifndef APP-NVUE */
display: flex;
flex-direction: $direction;
/* #endif */
}
.scroll-y {
height: 78vh;
margin-top: 18px;
}
.u-waterfall {
@include vue-flex;
flex-direction: row;
align-items: flex-start;
}
.u-column {
@include vue-flex;
flex: 1;
flex-direction: column;
height: auto;
width: 45vw;
word-break: break-all;
}
</style>3、簡單使用
基于vue的語法進行使用,先進行導入和注冊
<script>
import waterfall from '../../component/waterfall/index.vue'
export default {
name: 'content',
components: {
waterfall
}
}
</script>因為組件是基于插槽的形式進行開發(fā)的,所以我們可以直接傳入咱們的樣式和標簽
<template>
<view class="main">
<waterfall :value="dataList" :scrolltolower="getRecommendLove" ref="child">
<template v-slot:left="left">
<view v-for="item in left.leftList" :key="item.id" class="left-content" @click="copy(item)">
<view class="item">
{{item.content}}
</view>
</view>
</template>
<template v-slot:right="right">
<view v-for="item in right.rightList" :key="item.id" class="right-content" @click="copy(item)">
<view class="item">
{{item.content}}
</view>
</view>
</template>
</waterfall>
</view>
</template>最終的效果就可以達到我們的目標了

到此這篇關(guān)于微信小程序?qū)崙?zhàn),基于vue2實現(xiàn)瀑布流的文章就介紹到這了,更多相關(guān)vue2瀑布流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue antd的from表單中驗證rules中type的坑記錄
這篇文章主要介紹了vue antd的from表單中驗證rules中type的坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
vue中el-table實現(xiàn)可拖拽移動列和動態(tài)排序字段
最近公司需要做個項目,需要拖拽表格和自定義表格字段,本文主要介紹了vue中el-table實現(xiàn)可拖拽移動列和動態(tài)排序字段,具有一定吃參考價值,感興趣的可以了解一下2023-12-12
關(guān)于vue2強制刷新,解決頁面不會重新渲染的問題
今天小編就為大家分享一篇關(guān)于vue2強制刷新,解決頁面不會重新渲染的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
解決vue使用vant下拉框van-dropdown-item 綁定title值不變問題
這篇文章主要介紹了解決vue使用vant下拉框van-dropdown-item 綁定title值不變問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
vue改變循環(huán)遍歷后的數(shù)據(jù)實例
今天小編就為大家分享一篇vue改變循環(huán)遍歷后的數(shù)據(jù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
關(guān)于vue-router路由的傳參方式params query
這篇文章主要介紹了關(guān)于vue-router路由的傳參方式params query,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

