日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Vue3問題:如何實現(xiàn)級聯(lián)菜單的數(shù)據(jù)懶加載?

來源: 責(zé)編: 時間:2024-01-08 09:14:21 232觀看
導(dǎo)讀序言大家好,我是大澈!本文約3100+字,整篇閱讀大約需要5分鐘。本文主要內(nèi)容分三部分,第一部分是需求分析,第二部分是實現(xiàn)步驟,第三部分是問題詳解。如果您只需要解決問題,請閱讀第一、二部分即可。如果您有更多時間,進一步學(xué)習(xí)

d3B28資訊網(wǎng)——每日最新資訊28at.com

序言

大家好,我是大澈!d3B28資訊網(wǎng)——每日最新資訊28at.com

本文約3100+字,整篇閱讀大約需要5分鐘。d3B28資訊網(wǎng)——每日最新資訊28at.com

本文主要內(nèi)容分三部分,第一部分是需求分析,第二部分是實現(xiàn)步驟,第三部分是問題詳解。d3B28資訊網(wǎng)——每日最新資訊28at.com

如果您只需要解決問題,請閱讀第一、二部分即可。d3B28資訊網(wǎng)——每日最新資訊28at.com

如果您有更多時間,進一步學(xué)習(xí)問題相關(guān)知識點,請閱讀至第三部分。d3B28資訊網(wǎng)——每日最新資訊28at.com

一、需求分析

實現(xiàn)級聯(lián)菜單效果,點擊一級菜單某一項,就會加載出對應(yīng)的二級菜單內(nèi)容,點擊二級菜單某一項,就會加載出對應(yīng)的三級菜單內(nèi)容,以此類推,最后一級為五級菜單。d3B28資訊網(wǎng)——每日最新資訊28at.com

對于加載而言,必須是懶加載效果,即點擊菜單某一項時,才會真正去請求加載對應(yīng)的下一級菜單內(nèi)容。d3B28資訊網(wǎng)——每日最新資訊28at.com

對于菜單最后一級內(nèi)容,要插入一個輸入框,在輸入框內(nèi),用戶可以任意輸入版本號,并且要求輸入框不可被選中。d3B28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然,我們的正題是數(shù)據(jù)的懶加載,級聯(lián)菜單中插入不可被選中的輸入框?qū)崿F(xiàn)算是附加內(nèi)容了。d3B28資訊網(wǎng)——每日最新資訊28at.com

d3B28資訊網(wǎng)——每日最新資訊28at.com

d3B28資訊網(wǎng)——每日最新資訊28at.com

二、實現(xiàn)步驟

1、為什么要使用數(shù)據(jù)懶加載

在項目中,我們使用數(shù)據(jù)的懶加載,會有如下好處:d3B28資訊網(wǎng)——每日最新資訊28at.com

  • 提升用戶體驗
  • 減少初始加載時間
  • 減輕網(wǎng)絡(luò)資源的消耗

了解了這些好處之后,再就是要了解數(shù)據(jù)懶加載的應(yīng)用場景。d3B28資訊網(wǎng)——每日最新資訊28at.com

這部分比較有用,所以多敘述一些。d3B28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)懶加載在以下場景中特別有用:d3B28資訊網(wǎng)——每日最新資訊28at.com

  • 長列表或分頁數(shù)據(jù):當(dāng)你有一個包含大量數(shù)據(jù)的列表或分頁功能時,可以使用數(shù)據(jù)懶加載來延遲加載列表項或分頁數(shù)據(jù)。只有當(dāng)用戶滾動到可見范圍時才加載新的數(shù)據(jù),從而提高初始加載速度和響應(yīng)性能。
  • 圖片或媒體資源:對于包含大量圖片或媒體資源的頁面,可以使用數(shù)據(jù)懶加載來延遲加載這些資源。只有當(dāng)圖片或媒體元素進入視口時才進行加載,從而減少初始加載時間和網(wǎng)絡(luò)資源的消耗。
  • 條件性加載:當(dāng)一些數(shù)據(jù)或組件只在特定條件下才需要顯示或使用時,可以使用數(shù)據(jù)懶加載。根據(jù)條件動態(tài)加載數(shù)據(jù)或組件,避免不必要的加載和資源占用。
  • 路由級別的懶加載:在Vue的路由中,可以使用懶加載來按需加載路由組件。只有當(dāng)用戶訪問某個路由時才進行組件的加載,提高初始加載速度和路由切換的性能。
  • 異步加載模塊:對于大型的Vue項目,可以使用數(shù)據(jù)懶加載來異步加載模塊,減少初始加載時間。將模塊分割成小塊,并在需要時按需加載,提高應(yīng)用的性能和可維護性。

上述場景在此部分只做簡單描述,如果你有空余時間,各個場景具體代碼實例請見第三部分總結(jié)。d3B28資訊網(wǎng)——每日最新資訊28at.com

我們這次的需求實現(xiàn),就是符合第1條場景。d3B28資訊網(wǎng)——每日最新資訊28at.com

2、數(shù)據(jù)懶加載代碼實例

當(dāng)選中某一級時,動態(tài)加載該級下的選項。d3B28資訊網(wǎng)——每日最新資訊28at.com

通過lazy開啟動態(tài)加載,并通過lazyload方法來設(shè)置加載數(shù)據(jù)源。d3B28資訊網(wǎng)——每日最新資訊28at.com

  • lazyload方法有兩個參數(shù),第一個參數(shù)node為當(dāng)前點擊的節(jié)點,第二個resolve為數(shù)據(jù)加載完成的回調(diào)(必須調(diào)用)。
  • node可以解構(gòu)出level參數(shù),它從0開始計數(shù),指明當(dāng)前點擊節(jié)點的層級。
  • 為數(shù)據(jù)對象添加leaf屬性,是為了指明哪一級的對象是葉子節(jié)點。

模板代碼:d3B28資訊網(wǎng)——每日最新資訊28at.com

<template><!-- 級聯(lián)面板 --><el-cascader-panel :props="props"></el-cascader-panel></template>

邏輯代碼:d3B28資訊網(wǎng)——每日最新資訊28at.com

<script setup>// 級聯(lián)面板配置項const props = reactive({// 開啟懶加載lazy: true,// 懶加載加載數(shù)據(jù)源方法async lazyLoad(node, resolve) {const { level } = node;// 已經(jīng)有數(shù)據(jù)了,不需要重復(fù)請求了if (node.children && node.children.length > 0) return;// 模擬掉接口setTimeout(() => {let result;switch (level) {case 0: // 一級目錄result = [{value: "0",label: "行內(nèi)轉(zhuǎn)賬-手機號",children: []},{value: "1",label: "行內(nèi)轉(zhuǎn)賬-銀行賬號",children: []},{value: "2",label: "匯款到當(dāng)?shù)劂y行",children: []},{value: "3",label: "匯款到錢包",children: []},{value: "4",label: "轉(zhuǎn)賬到CUPD",children: []}];break;case 1: //二級目錄// 省略此處代碼...break;case 2: //三級目錄// 省略此處代碼...break;case 3: //四級目錄// 省略此處代碼...break;case 4: // 五級目錄result = [{value: "最低系統(tǒng)版本",label: "最低系統(tǒng)版本要求"},{value: "0",label: "不啟用"},{value: "1",label: "內(nèi)測"},{value: "2",label: "上線"}];// 設(shè)置五級菜單為葉子節(jié)點,無子節(jié)點result.forEach((item) => {item.leaf = level >= 4;});break;default:result = [];break;}resolve(result);}, 1000);}});</script>

3、插入輸入框代碼實例

通過插槽和條件判斷,在級聯(lián)面板中插入輸入框,其中data.label為節(jié)點對象的名稱。d3B28資訊網(wǎng)——每日最新資訊28at.com

通過@click.stop阻止事件冒泡、寬度為父元素的100%、以及清除級聯(lián)面板組件一些默認(rèn)樣式,實現(xiàn)了輸入框不可被選中的效果。d3B28資訊網(wǎng)——每日最新資訊28at.com

模版代碼:d3B28資訊網(wǎng)——每日最新資訊28at.com

<template><!-- 級聯(lián)面板 --><el-cascader-panel :props="props"><template #default="{ data }"><!-- 輸入框節(jié)點對象 --><div v-if="data.label == '最低系統(tǒng)版本要求'" @click.stop style="width: 100%"><div>{{ data.label }}</div><div class="searchText"><el-input v-model="searchText" :placeholder="'最低系統(tǒng)版本要求'"></el-input></div></div><div v-else><div>{{ data.label }}</div></div></template></el-cascader-panel></template>

樣式代碼:d3B28資訊網(wǎng)——每日最新資訊28at.com

<style lang="scss" scope>.el-cascader-panel.is-bordered {border: none;}.el-cascader-menu:last-child .el-cascader-node:nth-of-type(1):has(.searchText) {margin-bottom: 30px;padding: 0;&:hover,&:focus {background: #fff;}}.el-cascader-menu__list {padding: 20px 0;}</style>

三、問題詳解

1、關(guān)于CascaderProps配置項的參數(shù)一覽

d3B28資訊網(wǎng)——每日最新資訊28at.com

2、懶加載各個場景代碼實例總結(jié)

長列表或分頁數(shù)據(jù)懶加載:d3B28資訊網(wǎng)——每日最新資訊28at.com

<template><div><ul><li v-for="item in items" :key="item.id">{{ item.name }}</li><li v-if="loading">Loading...</li></ul></div></template><script>export default {data() {return {items: [],loading: false,};},mounted() {this.loadMore(); // 初始加載window.addEventListener('scroll', this.handleScroll);},methods: {loadMore() {this.loading true;// 模擬異步加載數(shù)據(jù)setTimeout(() => {const newItems = /* 請求新數(shù)據(jù) */;this.items = this.items.concat(newItems);this.loading = false;}, 1000);},handleScroll() {const scrollPosition = window.innerHeight + window.pageYOffset;const contentHeight = document.documentElement.scrollHeight;if (scrollPosition >= contentHeight && !this.loading) {this.loadMore(); // 滾動到底部時加載更多數(shù)據(jù)}},},beforeDestroy() {window.removeEventListener('scroll', this.handleScroll);},};</script>

圖片懶加載:d3B28資訊網(wǎng)——每日最新資訊28at.com

<template><div><img :src="placeholder" ref="image" style="display: none;"></div></template><script>export {data() {return {placeholder: require('@/assets/placeholder.png'), // 占位圖};},mounted() {window.addEventListener('scroll', this.handleScroll);},methods: {handleScroll() {const imageElement = this.$refs.image;const rect = imageElement.getBoundingClientRect();if (rect.top < window.innerHeight) {const src = /* 獲取圖片真實地址 */;imageElement.src = src; // 加載圖片window.removeEventListener('scroll', this.handleScroll); // 圖片加載后移除滾動監(jiān)聽}},},beforeDestroy() {window.removeEventListener('scroll', this.handle);},};</script>

條件性數(shù)據(jù)懶加載:d3B28資訊網(wǎng)——每日最新資訊28at.com

<template><div><button @click="showData = true">顯示數(shù)據(jù)</button><div v-if="showData"><!-- 顯示數(shù)據(jù)的組件或內(nèi)容 --></div></div></template><script>export default {data() {return {showData: false,};},};</script>

路由懶加載(基于 Vue Router):d3B28資訊網(wǎng)——每日最新資訊28at.com

const Home = () => import('./components/Home.vue');const About = () => import('./components/About.vue');const Contact = () => import('./components/Contact.vue');const routes = [{ path: '/home', component: Home },{ path: '/about', component: About },{ path: '/contact', component: Contact },];const router = new VueRouter({routes,});

異步加載模塊(基于 import() 動態(tài)導(dǎo)入語法):d3B28資訊網(wǎng)——每日最新資訊28at.com

<template><div><button @click="loadModule">加載模塊</button><div v-if="moduleLoaded"><!-- 顯示已加載的模塊 --></div></div></template><script>export default {data() {return {moduleLoaded: false,};},methods: {loadModule() {import('./path/to/module.js').then((module) => {// 模塊加載成功this.moduleLoaded = true;}).catch((error) => {console.error(error);});},},};</script>

本文鏈接:http://www.www897cc.com/showinfo-26-57846-0.htmlVue3問題:如何實現(xiàn)級聯(lián)菜單的數(shù)據(jù)懶加載?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Kafka消息阻塞:拯救面試的八大終極解決方案!

下一篇: 你知道Spring中BeanFactoryPostProcessors是如何執(zhí)行的嗎?

標(biāo)簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 全椒县| 开阳县| 喀喇沁旗| 新巴尔虎右旗| 朝阳区| 巴南区| 浮梁县| 孝义市| 且末县| 应城市| 阿拉尔市| 洪泽县| 忻州市| 元谋县| 邯郸市| 崇信县| 隆回县| 托克托县| 嘉义市| 大埔县| 宁河县| 武义县| 临西县| 潼南县| 吴桥县| 伊吾县| 齐齐哈尔市| 云阳县| 类乌齐县| 大理市| 德保县| 淄博市| 丹江口市| 东光县| 双峰县| 永定县| 大连市| 华蓥市| 阜阳市| 右玉县| 苍山县|