最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信小程序?qū)崙?zhàn)基于vue2實(shí)現(xiàn)瀑布流的代碼實(shí)例

 更新時(shí)間:2022年12月02日 08:25:42   作者:隱風(fēng)  
瀑布流,又稱瀑布流式布局,是比較流行的一種網(wǎng)站頁面布局,視覺表現(xiàn)為參差不齊的多欄布局,隨著頁面滾動(dòng)條向下滾動(dòng),這種布局還會(huì)不斷加載數(shù)據(jù)塊并附加至當(dāng)前尾部,這篇文章主要介紹了微信小程序?qū)崙?zhàn),基于vue2實(shí)現(xiàn)瀑布流,需要的朋友可以參考下

瀑布流,又稱瀑布流式布局。是比較流行的一種網(wǎng)站頁面布局,視覺表現(xiàn)為參差不齊的多欄布局,隨著頁面滾動(dòng)條向下滾動(dòng),這種布局還會(huì)不斷加載數(shù)據(jù)塊并附加至當(dāng)前尾部。

1、什么是瀑布流呢?

瀑布流,又稱瀑布流式布局。是比較流行的一種網(wǎng)站頁面布局,視覺表現(xiàn)為參差不齊的多欄布局,隨著頁面滾動(dòng)條向下滾動(dòng),這種布局還會(huì)不斷加載數(shù)據(jù)塊并附加至當(dāng)前尾部。

瀑布流對(duì)于圖片的展現(xiàn),是高效而具有吸引力的,用戶一眼掃過的快速閱讀模式可以在短時(shí)間內(nèi)獲得更多的信息量,而瀑布流里懶加載模式又避免了用戶鼠標(biāo)點(diǎn)擊的翻頁操作,瀑布流的主要特性便是錯(cuò)落有致,定寬而不定高的設(shè)計(jì)讓頁面區(qū)別于傳統(tǒng)的矩陣式圖片布局模式,巧妙的利用視覺層級(jí),視線的任意流動(dòng)又緩解了視覺疲勞,同時(shí)給人以不拘一格的感覺,切中年輕一族的個(gè)性化心理。

下面這些就是用瀑布流來實(shí)現(xiàn),看起來是不是很美觀呢?

2、實(shí)現(xiàn)一個(gè)簡單的瀑布流

先看一下咱們最終的試下效果吧,只是簡單傳入文字進(jìn)行演示

1、瀑布流的特點(diǎn)

1、琳瑯滿目:整版以圖片為主,大小不一的圖片按照一定的規(guī)律排列。

2、唯美:圖片的風(fēng)格以唯美的圖片為主。

3、操作簡單:在瀏覽網(wǎng)站的時(shí)候只需要輕輕滑動(dòng)一下鼠標(biāo)滾輪,一切的美妙的圖片精彩便可呈現(xiàn)在你面前

2、核心算法

通過圖片我們可以直觀的看到,每一個(gè)卡片的高度都是不一樣的,需要我們實(shí)時(shí)能計(jì)算高度,同時(shí)左右的高度還是不能相互影響。

這里我們主要通過兩個(gè)數(shù)組進(jìn)行實(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,
	}
}

對(duì)傳入數(shù)組進(jìn)行分組和計(jì)算高度

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ù)會(huì)亂的問題,因?yàn)榻?jīng)過上面的兩個(gè)await節(jié)點(diǎn)查詢阻塞一定時(shí)間,加上后面的定時(shí)器干擾
	// 數(shù)組可能變成[],導(dǎo)致此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(shí),左右都能有內(nèi)容
		// 因?yàn)樘砑拥谝粡垼瑢?shí)際隊(duì)列的高度可能還是0,這時(shí)需要根據(jù)隊(duì)列元素長度判斷下一個(gè)該放哪邊
		if (this.leftList.length <= this.rightList.length) {
			this.leftList.push(item);
		} else {
			this.rightList.push(item);
		}
	}
	// 移除臨時(shí)列表的第一項(xiàng)
	this.tempList.splice(0, 1);
	// 如果臨時(shí)數(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ù)會(huì)亂的問題,因?yàn)榻?jīng)過上面的兩個(gè)await節(jié)點(diǎn)查詢阻塞一定時(shí)間,加上后面的定時(shí)器干擾
				// 數(shù)組可能變成[],導(dǎo)致此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(shí),左右都能有內(nèi)容
					// 因?yàn)樘砑拥谝粡?,?shí)際隊(duì)列的高度可能還是0,這時(shí)需要根據(jù)隊(duì)列元素長度判斷下一個(gè)該放哪邊
					if (this.leftList.length <= this.rightList.length) {
						this.leftList.push(item);
					} else {
						this.rightList.push(item);
					}
				}
				// 移除臨時(shí)列表的第一項(xiàng)
				this.tempList.splice(0, 1);
				// 如果臨時(shí)數(shù)組還有數(shù)據(jù),繼續(xù)循環(huán)
				if (this.tempList.length) {
					this.splitData();
					return
				}
			},
			// 復(fù)制而不是引用對(duì)象和數(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的語法進(jìn)行使用,先進(jìn)行導(dǎo)入和注冊(cè)

<script>
import waterfall from '../../component/waterfall/index.vue'
export default {
	name: 'content',
	components: {
		waterfall
	}
}
</script>

因?yàn)榻M件是基于插槽的形式進(jìn)行開發(fā)的,所以我們可以直接傳入咱們的樣式和標(biāo)簽

<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>

最終的效果就可以達(dá)到我們的目標(biāo)了

到此這篇關(guān)于微信小程序?qū)崙?zhàn),基于vue2實(shí)現(xiàn)瀑布流的文章就介紹到這了,更多相關(guān)vue2瀑布流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的實(shí)例代碼

    vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的實(shí)例代碼

    這篇文章主要介紹了vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • vue開發(fā)頁面自適應(yīng)屏幕尺寸的實(shí)例代碼

    vue開發(fā)頁面自適應(yīng)屏幕尺寸的實(shí)例代碼

    使用vue開發(fā)的頁面都是通過px設(shè)置它的尺寸,如果換了一個(gè)不同尺寸的屏幕就會(huì)出現(xiàn)頁面排版錯(cuò)亂,顯示不完整等情況,下面通過插件將px裝換為rem單位適應(yīng)不同尺寸的屏幕,需要的朋友可以參考下
    2022-12-12
  • vue3模塊創(chuàng)建runtime-dom源碼解析

    vue3模塊創(chuàng)建runtime-dom源碼解析

    這篇文章主要為大家介紹了vue3模塊創(chuàng)建runtime-dom源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • vue 使用高德地圖vue-amap組件過程解析

    vue 使用高德地圖vue-amap組件過程解析

    這篇文章主要介紹了vue 使用高德地圖vue-amap組件過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解使用vuex進(jìn)行菜單管理

    詳解使用vuex進(jìn)行菜單管理

    本篇文章主要介紹了詳解使用vuex進(jìn)行菜單管理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • vuex實(shí)現(xiàn)歷史記錄的示例代碼

    vuex實(shí)現(xiàn)歷史記錄的示例代碼

    這篇文章主要介紹了vuex實(shí)現(xiàn)歷史記錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Vue3為什么這么快

    Vue3為什么這么快

    這篇文章主要介紹了Vue3為什么這么快,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • vue自定義翻頁組件的方法

    vue自定義翻頁組件的方法

    這篇文章主要為大家詳細(xì)介紹了vue自定義翻頁組件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • VUE使用vue?create命令創(chuàng)建vue2.0項(xiàng)目的全過程

    VUE使用vue?create命令創(chuàng)建vue2.0項(xiàng)目的全過程

    vue-cli是創(chuàng)建Vue項(xiàng)目的一個(gè)腳手架工具,vue-cli提供了vue create等命令,下面這篇文章主要給大家介紹了關(guān)于VUE使用vue?create命令創(chuàng)建vue2.0項(xiàng)目的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • npm安裝vue@cli報(bào)錯(cuò)的簡單處理方式

    npm安裝vue@cli報(bào)錯(cuò)的簡單處理方式

    最近工作中遇到了報(bào)錯(cuò),現(xiàn)在將解決的辦法分享給大家,下面這篇文章主要給大家介紹了關(guān)于npm安裝vue@cli報(bào)錯(cuò)的簡單處理方式,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12

最新評(píng)論

云阳县| 古田县| 高州市| 丰宁| 沛县| 昌黎县| 舟曲县| 梓潼县| 祁阳县| 繁昌县| 邯郸市| 丽江市| 宜州市| 资源县| 青浦区| 弥渡县| 成武县| 调兵山市| 博野县| 雅安市| 岳西县| 和硕县| 合川市| 太谷县| 阳春市| 准格尔旗| 富顺县| 汤原县| 岳阳市| 天祝| 合山市| 民乐县| 钟祥市| 嵩明县| 三明市| 龙川县| 阿克苏市| 广水市| 永川市| 克什克腾旗| 韶山市|