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

Vue+Ant Design進(jìn)行大數(shù)據(jù)量下拉框卡頓與表單提交優(yōu)化

 更新時(shí)間:2025年03月26日 08:22:50   作者:碼農(nóng)阿豪@新空間  
在現(xiàn)代前端開發(fā)中,處理大數(shù)據(jù)量渲染和表單交互是常見的挑戰(zhàn),本文將探討如何優(yōu)化 Ant Design Vue 下拉框在大數(shù)據(jù)量情況下的性能問題,并解決表單提交后重復(fù)提示的問題,需要的可以了解下

前言

在現(xiàn)代前端開發(fā)中,處理大數(shù)據(jù)量渲染和表單交互是常見的挑戰(zhàn)。本文基于實(shí)際項(xiàng)目中的問題,探討如何優(yōu)化 Ant Design Vue 下拉框(Select)在大數(shù)據(jù)量情況下的性能問題,并解決 表單提交后重復(fù)提示的問題。

我們將從問題現(xiàn)象出發(fā),分析原因,并提供多種優(yōu)化方案,最終形成最佳實(shí)踐。文章包含詳細(xì)代碼示例,適合中高級(jí)前端開發(fā)者閱讀。

1. 問題背景

(1) 大數(shù)據(jù)量下拉框卡頓

在管理后臺(tái)中,我們經(jīng)常遇到需要渲染大量數(shù)據(jù)的下拉選擇框(如廣告位ID選擇)。當(dāng) mediaAdSlotList 數(shù)據(jù)量較大時(shí)(例如超過1000條),Ant Design 的 a-select 會(huì)渲染所有 option,導(dǎo)致 DOM 節(jié)點(diǎn)過多,頁面卡頓。

問題代碼:

<a-select
  v-decorator="['mediaAdId']"
  show-search
  option-filter-prop="children"
>
  <a-select-option 
    v-for="item in mediaAdSlotList" 
    :key="item.mediaAdId"
    :value="item.mediaAdId"
  >
    {{ item.mediaAdId }}
  </a-select-option>
</a-select>

(2) 表單提交后重復(fù)提示

在提交表單時(shí),有時(shí)會(huì)出現(xiàn) 兩次 “新增成功” 提示,影響用戶體驗(yàn)。這通常是由于 子組件和父組件都觸發(fā)了提示,或者 全局?jǐn)r截器重復(fù)提示 導(dǎo)致的。

問題代碼:

// 子組件
handleSubmit() {
  apiCall().then(res => {
    this.$message.success("操作成功")  // 第一次提示
    this.$emit('success')  // 父組件可能再次提示
  })
}

// 父組件
<child-component @success="showSuccess" />

methods: {
  showSuccess() {
    this.$message.success("操作成功")  // 第二次提示
  }
}

2. 解決方案:優(yōu)化大數(shù)據(jù)量下拉框

(1) 虛擬滾動(dòng)(Virtual Scroll)

Ant Design Vue 的 a-select 支持虛擬滾動(dòng),僅渲染可視區(qū)域內(nèi)的選項(xiàng),大幅提升性能。

優(yōu)化代碼:

<a-select
  v-decorator="['mediaAdId']"
  show-search
  :options="mediaAdSlotOptions"
  :virtual-scroll="{
    itemSize: 32,  // 每個(gè)選項(xiàng)高度
    height: 256   // 下拉框高度
  }"
/>

轉(zhuǎn)換數(shù)據(jù)格式:

computed: {
  mediaAdSlotOptions() {
    return this.mediaAdSlotList.map(item => ({
      label: item.mediaAdId,
      value: item.mediaAdId
    }))
  }
}

(2) 分頁加載(Pagination)

如果數(shù)據(jù)量極大(如 10,000+ 條),可以采用分頁加載策略。

優(yōu)化代碼:

async fetchMediaAdSlotList(page = 1, pageSize = 100) {
  const { data } = await api.getMediaAdSlots({ page, pageSize })
  if (page === 1) {
    this.mediaAdSlotList = data
  } else {
    this.mediaAdSlotList.push(...data)
  }
}

(3) 搜索時(shí)懶加載(Lazy Loading)

僅在用戶輸入時(shí)加載匹配的數(shù)據(jù),減少初始請(qǐng)求量。

優(yōu)化代碼:

methods: {
  handleSearch: debounce(async (keyword) => {
    if (!keyword) return
    const { data } = await api.searchMediaAdSlots({ keyword })
    this.mediaAdSlotList = data
  }, 500)
}

(4) 防抖優(yōu)化(Debounce)

避免頻繁觸發(fā)搜索請(qǐng)求,減少服務(wù)器壓力。

import { debounce } from 'lodash'

methods: {
  handleSearch: debounce(async (keyword) => {
    // 搜索邏輯
  }, 500)
}

3. 解決方案:避免表單提交重復(fù)提示

(1) 統(tǒng)一消息提示位置

推薦方案:只在子組件提示,父組件僅刷新數(shù)據(jù)。

// 子組件
handleSubmit() {
  apiCall().then(res => {
    this.$message.success("操作成功")  // 僅在這里提示
    this.$emit('success')  // 父組件只刷新數(shù)據(jù)
  })
}

// 父組件
<child-component @success="handleRefreshData" />

methods: {
  handleRefreshData() {
    this.fetchData()  // 不顯示提示
  }
}

(2) 事件冒泡管理

如果必須由父組件控制提示,可以傳遞消息內(nèi)容:

// 子組件
this.$emit('success', '操作成功')

// 父組件
<child-component @success="(msg) => $message.success(msg)" />

(3) 攔截器優(yōu)化

如果全局?jǐn)r截器導(dǎo)致重復(fù)提示,可以添加 skipMessage 選項(xiàng):

// API 調(diào)用
api.postData(params, { skipMessage: true })

// 攔截器
axios.interceptors.response.use(res => {
  if (res.config.skipMessage) return res
  if (res.data.success) {
    Message.success(res.data.message)
  }
  return res
})

4. 完整優(yōu)化代碼示例

優(yōu)化后的 Select 組件

<template>
  <a-select
    v-decorator="['mediaAdId']"
    show-search
    :options="mediaAdSlotOptions"
    :virtual-scroll="{ itemSize: 32, height: 256 }"
    @search="handleSearch"
  />
</template>

<script>
import { debounce } from 'lodash'

export default {
  data() {
    return {
      mediaAdSlotList: []
    }
  },
  computed: {
    mediaAdSlotOptions() {
      return this.mediaAdSlotList.map(item => ({
        label: item.mediaAdId,
        value: item.mediaAdId
      }))
    }
  },
  methods: {
    handleSearch: debounce(async (keyword) => {
      const { data } = await api.searchMediaAdSlots({ keyword })
      this.mediaAdSlotList = data
    }, 500)
  }
}
</script>

優(yōu)化后的表單提交邏輯

// 子組件
handleSubmit() {
  apiCall().then(res => {
    this.$message.success("操作成功")
    this.$emit('success')  // 父組件只刷新數(shù)據(jù)
  })
}

// 父組件
<child-component @success="fetchData" />

5. 總結(jié)與最佳實(shí)踐

(1) 下拉框優(yōu)化總結(jié)

方案適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)
虛擬滾動(dòng)大數(shù)據(jù)量(1,000+)高性能,流暢渲染需要 Ant Design 支持
分頁加載超大數(shù)據(jù)量(10,000+)減少初始加載時(shí)間需要額外分頁邏輯
搜索懶加載動(dòng)態(tài)過濾場(chǎng)景按需加載,減少請(qǐng)求依賴用戶輸入
防抖優(yōu)化頻繁搜索場(chǎng)景減少請(qǐng)求次數(shù)需要額外庫(lodash)

2) 表單提交優(yōu)化總結(jié)

推薦只在子組件提示,父組件僅負(fù)責(zé)數(shù)據(jù)刷新。

避免全局?jǐn)r截器重復(fù)提示,可通過 skipMessage 控制。

保持單向數(shù)據(jù)流,減少組件間耦合。

(3) 最終建議

默認(rèn)使用虛擬滾動(dòng) 優(yōu)化大數(shù)據(jù)量下拉框。

統(tǒng)一提示位置,避免重復(fù)消息。

結(jié)合防抖 + 懶加載 提升搜索體驗(yàn)。

結(jié)語

通過本文的優(yōu)化方案,可以有效解決 大數(shù)據(jù)量下拉框卡頓 和 表單重復(fù)提示 的問題。如果你的項(xiàng)目也遇到類似問題,不妨嘗試這些方法!

到此這篇關(guān)于Vue+Ant Design進(jìn)行大數(shù)據(jù)量下拉框卡頓與表單提交優(yōu)化的文章就介紹到這了,更多相關(guān)Vue+Ant Design優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue組件高級(jí)通訊之$children與$parent

    Vue組件高級(jí)通訊之$children與$parent

    這篇文章主要為大家介紹了Vue組件高級(jí)通訊之$children與$parent,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Vue Router的三種歷史模式應(yīng)用與對(duì)比詳解

    Vue Router的三種歷史模式應(yīng)用與對(duì)比詳解

    在 Vue.js 單頁應(yīng)用(SPA)中,vue-router 提供了三種不同的 歷史模式 來管理路由導(dǎo)航和 URL 顯示方式,每種模式適用于不同場(chǎng)景,下面小編就和大家簡(jiǎn)單介紹一下吧
    2025-10-10
  • 拿來即用的vue旋轉(zhuǎn)木馬組件demo

    拿來即用的vue旋轉(zhuǎn)木馬組件demo

    這篇文章主要為大家介紹了拿來即用的vue旋轉(zhuǎn)木馬組件demo詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 詳解如何使用vue實(shí)現(xiàn)可視化界面設(shè)計(jì)

    詳解如何使用vue實(shí)現(xiàn)可視化界面設(shè)計(jì)

    Vue是一款流行的前端開發(fā)框架,它的響應(yīng)式數(shù)據(jù)綁定和組件化特性使得它成為了可視化界面設(shè)計(jì)的一個(gè)理想選擇,本文將介紹如何使用Vue實(shí)現(xiàn)可視化界面設(shè)計(jì),并且演示一個(gè)基于Vue的可視化界面設(shè)計(jì)案例,需要的朋友可以參考下
    2023-12-12
  • Vue項(xiàng)目中通過路由守衛(wèi)實(shí)現(xiàn)自動(dòng)取消Pending請(qǐng)求功能

    Vue項(xiàng)目中通過路由守衛(wèi)實(shí)現(xiàn)自動(dòng)取消Pending請(qǐng)求功能

    現(xiàn)代Web應(yīng)用中,當(dāng)用戶在頁面間快速切換時(shí),常常會(huì)遇到一些正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求繼續(xù)執(zhí)行的問題,本文將介紹如何在Vue項(xiàng)目中通過路由守衛(wèi)實(shí)現(xiàn)自動(dòng)取消pending請(qǐng)求的功能,提高應(yīng)用的性能和用戶體驗(yàn),需要的朋友可以參考下
    2026-04-04
  • Vue3+Typescript合并多個(gè)pdf并預(yù)覽打印

    Vue3+Typescript合并多個(gè)pdf并預(yù)覽打印

    這篇文章主要為大家詳細(xì)介紹了Vue3如何結(jié)合Typescript實(shí)現(xiàn)合并多個(gè)pdf并預(yù)覽打印,同時(shí)可以兼容低版本瀏覽器,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • Element實(shí)現(xiàn)表格分頁數(shù)據(jù)選擇+全選所有完善批量操作

    Element實(shí)現(xiàn)表格分頁數(shù)據(jù)選擇+全選所有完善批量操作

    這篇文章主要介紹了Element實(shí)現(xiàn)表格分頁數(shù)據(jù)選擇+全選所有完善批量操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • vue-cli3項(xiàng)目在IE瀏覽器打開兼容問題及解決

    vue-cli3項(xiàng)目在IE瀏覽器打開兼容問題及解決

    這篇文章主要介紹了vue-cli3項(xiàng)目在IE瀏覽器打開兼容問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue3+element-plus props中的變量使用 v-model 報(bào)錯(cuò)及解決方案

    vue3+element-plus props中的變量使用 v-model 報(bào)錯(cuò)及解決方案

    這篇文章主要介紹了vue3+element-plus props中的變量使用 v-model 報(bào)錯(cuò)及解決方案,prop 是單向數(shù)據(jù)流,這里只能用:model-value,不能用v-model,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Nuxt.js 靜態(tài)資源和打包的操作

    Nuxt.js 靜態(tài)資源和打包的操作

    這篇文章主要介紹了Nuxt.js 靜態(tài)資源和打包的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評(píng)論

建水县| 炎陵县| 盖州市| 延川县| 洛南县| 荥阳市| 东海县| 南岸区| 长春市| 安国市| 弥渡县| 保德县| 海安县| 襄城县| 延安市| 蓝山县| 浙江省| 贞丰县| 九龙县| 金寨县| 红安县| 柳江县| 枝江市| 察隅县| 景宁| 湖口县| 启东市| 小金县| 四平市| 绵竹市| 舟曲县| 龙山县| 思南县| 呼和浩特市| 都兰县| 阜新| 乌审旗| 兴义市| 尚义县| 肇州县| 勐海县|