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

vxe-table動態(tài)列篩選以及篩選項動態(tài)變化的問題及解決

 更新時間:2025年04月24日 09:25:04   作者:吃面必吃蒜  
這篇文章主要介紹了vxe-table動態(tài)列篩選以及篩選項動態(tài)變化的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

vxe-table動態(tài)列篩選以及篩選項動態(tài)變化

需求場景

  1. table 的列是由接口動態(tài)返回的;
  2. 列的篩選項就是數(shù)據(jù)的值,比如【姓名】這個字段總共有三個值,那么姓名這一列的篩選項就是這三個值本身;
  3. 當(dāng)有一列篩選后,其他列的篩選項也要動態(tài)變化。

vxe-table 版本:4.9.14

完整代碼

vue template 部分:

<vxe-table
   ref="vxeTableRef"
   :data="state.tableData"
   height="100%"
   border
   @filter-change="handleFilterChange"
 >
   <vxe-column
     v-for="colOpt in columnsOptions"
     :key="colOpt.field"
     :field="colOpt.field"
     :title="colOpt.title"
     align="center"
     resizable
     sortable
     :filters="colOpt.filters"
     :filter-method="colOpt.filterMethod"
   />
 </vxe-table>

script 部分:

<script setup lang="ts">
// 其他代碼
const vxeTableRef = ref();

const handleSearch = () => {
	// 獲取table數(shù)據(jù)部分的邏輯
	API(params).then((res: any) => {
	    // ...
	    state.tableData = data || [];
	    if (state.tableData.length > 0) {
	      // 在數(shù)據(jù)加載后重置所有篩選
	      nextTick(() => {
	        if (vxeTableRef.value) {
	          vxeTableRef.value.clearFilter();
	        }
	      });
	    }
  });
}

// 下面是處理列篩選的邏輯
// 獲取篩選選項
const getColumnFilters = (column: string) => {
  // 使用 Map 來提高性能
  const uniqueMap = new Map();

  for (const row of state.tableData) {
    const value = row[column];
    if (!uniqueMap.has(value)) {
      uniqueMap.set(value, {
        label: value == null || value == "" ? "(空)" : String(value),
        value: value,
        checked: false
      });
    }
  }

  return Array.from(uniqueMap.values());
};

// 創(chuàng)建篩選方法
const createFilterMethod = (column: string) => {
  return ({ value, row }: { value: any; row: any }) => {
    const cellValue = row[column];

    // 處理空值的情況
    if (value === null || value === "") {
      return cellValue === null || cellValue === "";
    }

    // 如果單元格值是數(shù)字,進(jìn)行數(shù)字比較
    if (typeof cellValue === "number") {
      return cellValue === Number(value);
    }

    // 默認(rèn)進(jìn)行字符串比較
    return String(cellValue) === String(value);
  };
};

// 數(shù)據(jù)是異步加載的,使用計算屬性來處理列配置
const columnsOptions = computed(() => {
  return state.columns.map(col => ({
    field: col,
    title: col,
    filters: getColumnFilters(col),
    filterMethod: createFilterMethod(col)
  }));
});

// 處理篩選變化
const handleFilterChange = (params: any) => {
  // 獲取當(dāng)前表格中可見的行數(shù)據(jù)
  const { filterList } = params;
  // 如果沒有篩選項,就刷新
  if (!filterList || filterList.length === 0) {
    handleSearch();
  }

  // 篩選已經(jīng)應(yīng)用,獲取處理后的可見數(shù)據(jù)
  const visibleData = vxeTableRef.value?.getTableData().visibleData || [];

  // 獲取當(dāng)前被篩選的列,避免修改它們的篩選項
  const filteredColumns = new Set(filterList.map((item: any) => item.field));

  // 更新篩選狀態(tài)
  nextTick(() => {
    // 只更新未被篩選的列
    state.columns.forEach(column => {
      // 跳過當(dāng)前正在篩選的列
      if (filteredColumns.has(column)) return;

      // 為此列生成新的篩選選項,但僅從可見數(shù)據(jù)中獲取
      const uniqueMap = new Map();
      for (const row of visibleData) {
        const value = row[column];
        if (!uniqueMap.has(value)) {
          uniqueMap.set(value, {
            label: value == null || value === "" ? "(空)" : String(value),
            value: value,
            checked: false
          });
        }
      }

      // 更新此列的篩選項
      if (vxeTableRef.value) {
        vxeTableRef.value.setFilter(column, Array.from(uniqueMap.values()));
      }
    });
  });
};
</script>

里面關(guān)鍵的一個點(diǎn)在于,vxe-table 篩選后的展示數(shù)據(jù)跟我們的源數(shù)據(jù)是分開的,所以篩選觸發(fā)的事件中,我們應(yīng)該拿 visibleData 來做篩選項的動態(tài)處理。

由于邏輯可復(fù)用,所以記錄一下,需要用的時候直接copy就好了。

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue表單驗(yàn)證rules及validator驗(yàn)證器的使用方法實(shí)例

    vue表單驗(yàn)證rules及validator驗(yàn)證器的使用方法實(shí)例

    在vue開發(fā)中,難免遇到各種表單校驗(yàn),下面這篇文章主要給大家介紹了關(guān)于vue表單驗(yàn)證rules及validator驗(yàn)證器使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Vue CLI3中使用compass normalize的方法

    Vue CLI3中使用compass normalize的方法

    這篇文章主要介紹了Vue CLI3中使用compass normalize的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 前端筆記之vue中Map、Set之間的使用和區(qū)別詳析

    前端筆記之vue中Map、Set之間的使用和區(qū)別詳析

    Vue中的Map格式,是一種用于存儲和管理鍵值對數(shù)據(jù)的集合,與常規(guī)的數(shù)組不同,Map提供了更靈活和高效的方式來操作數(shù)據(jù),這篇文章主要介紹了前端筆記之vue中Map、Set之間的使用和區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2025-11-11
  • Vue使用自定義指令打開dialog的實(shí)現(xiàn)方法

    Vue使用自定義指令打開dialog的實(shí)現(xiàn)方法

    在web后臺管理項目中,經(jīng)常要用到dialog,就vue來說,使用方式則是引入組件,注冊,在template中使用,試想一下,如果我們需要在項目中的不同.vue文件中使用該dialog,但是又不想每次都在template中寫入組件該如何實(shí)現(xiàn)呢?本文我們介紹用指令控制dialog,需要的朋友可以參考下
    2024-07-07
  • Vue組件化常用方法之組件傳值與通信

    Vue組件化常用方法之組件傳值與通信

    這篇文章主要給大家介紹了關(guān)于Vue組件化常用方法之組件傳值與通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Vue常用指令V-model用法

    Vue常用指令V-model用法

    本篇文章主要介紹了Vue常用指令_V-model用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 詳解vue的hash跳轉(zhuǎn)原理

    詳解vue的hash跳轉(zhuǎn)原理

    這篇文章主要介紹了vue的hash跳轉(zhuǎn)原理,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-03-03
  • vue中將網(wǎng)頁打印成pdf實(shí)例代碼

    vue中將網(wǎng)頁打印成pdf實(shí)例代碼

    本篇文章主要介紹了vue中將網(wǎng)頁打印成pdf實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • vue-router嵌套路由方式(頁面路徑跳轉(zhuǎn)但頁面顯示空白)

    vue-router嵌套路由方式(頁面路徑跳轉(zhuǎn)但頁面顯示空白)

    這篇文章主要介紹了vue-router嵌套路由方式(頁面路徑跳轉(zhuǎn)但頁面顯示空白),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue3中Watch、Watcheffect、Computed的使用和區(qū)別解析

    Vue3中Watch、Watcheffect、Computed的使用和區(qū)別解析

    Watch、Watcheffect、Computed各有優(yōu)劣,選擇使用哪種方法取決于應(yīng)用場景和需求,watch?適合副作用操作,watchEffect適合簡單的自動副作用管理,computed?適合聲明式的派生狀態(tài)計算,本文通過場景分析Vue3中Watch、Watcheffect、Computed的使用和區(qū)別,感興趣的朋友一起看看吧
    2024-07-07

最新評論

天等县| 江达县| 宁晋县| 保德县| 雅江县| 五原县| 新泰市| 瑞安市| 巴青县| 凤庆县| 那坡县| 波密县| 准格尔旗| 贵溪市| 化德县| 商都县| 郑州市| 陇西县| 新巴尔虎右旗| 读书| 荔波县| 沿河| 阳高县| 卢湾区| 德令哈市| 泰和县| 轮台县| 甘南县| 页游| 巍山| 客服| 普定县| 南京市| 乐业县| 麻栗坡县| 容城县| 易门县| 阿合奇县| 九龙城区| 台南市| 县级市|