如何優化el-table單選

一、增加單選框可點擊區域

在默認情況下,el-table的單選框只有在滑鼠移動到表格內容區域時才會出現,這很容易讓用戶忽略它的存在。

因此,我們可以通過增加單選框的可點擊區域來提高用戶的使用體驗。一種簡單的實現方式是,在表格行上添加一個單選框佔位符,使用戶在任何位置點擊表格行都能夠選中改行。

<el-table
  :data="tableData"
  :row-key="row => row.id"
  @current-change="handleRowClick">
  <el-table-column
    type="selection"
    width="55">
    <template slot-scope="{row}">
      <span 
        style="position:absolute;top:0;left:0;width:100%;height:100%;cursor:pointer"
        @click.native.stop.prevent="handleRowClick(row)"
        />
    </template>
  </el-table-column>
  <el-table-column
    prop="name"
    label="姓名">
  </el-table-column>
  <el-table-column
    prop="age"
    label="年齡">
  </el-table-column>
</el-table>

以上代碼中,我們在單選框內添加了一個跨度位置的絕對定位的span元素,並監聽其click事件,這樣用戶在點擊表格行時,實質上是在點擊單選框的可點擊區域,從而達到了增加選中體驗選項的目的。

二、設置默認選中第一行

在一般情況下,用戶進入頁面時比較希望看到一些默認數據。通過設置默認選中第一行,可以快速啟動一個需要用戶操作的功能。

實現方法相對來說很簡單,只需要在mounted鉤子函數中執行表格的setCurrentRow方法,將第一行設置為默認選項即可。

mounted() {
  this.$nextTick(() => {
    if (this.$refs.table && this.tableData.length) {
      this.$refs.table.setCurrentRow(this.tableData[0]);
    }
  });
}

以上代碼中,我們監聽了mounted鉤子函數,通過$refs獲取表格實例,在設置表格默認選中行時需要保證表格的數據this.tableData已經載入完畢。

三、在表格外添加全選功能

單選模式下,我們可能也會需要選擇多個元素進行操作。添加全選功能可以滿足這個需求。

該功能的具體實現方式是,在表格外添加一個全選框,並綁定一個事件,對選中的行進行記錄和操作。

<template>
  <div>
    <el-checkbox v-model="allChecked" @change="handleAllCheckChange">全選</el-checkbox>
    <el-table
      :data="tableData"
      :row-key="row => row.id">
      <el-table-column
        type="selection"
        width="55">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名">
      </el-table-column>
      <el-table-column
        prop="age"
        label="年齡">
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      allChecked: false,
      tableData: [
        {
          id: 1,
          name: '小明',
          age: 18
        },
        {
          id: 2,
          name: '小紅',
          age: 20
        },
        {
          id: 3,
          name: '小張',
          age: 22
        }
      ],
      checkedData: []  //選中的數據
    };
  },

  methods: {
    handleAllCheckChange(val) {
      this.allChecked = val;
      if (this.tableData.length) {
        this.checkedData = val ? this.tableData : [];  //將所有數據加入或清空選中列表
        this.$refs.table.toggleAllSelection();  //改變表格的全選狀態
      }
    }
  }
};
</script>

以上代碼中,我們在表格外添加了一個全選框,並在handleChange事件中記錄選中的行。為了加強全選功能,在表格頭中增加一個全選框,通過toggleAllSelection方法來控制表格中的行的選中狀態。

四、通過拖拽選擇實現單選

通過滑鼠拖拽實現單選是常見的UI常見功能。在el-table中也可以通過增加一個隱藏的單選框來實現該功能。

<template>
  <el-table
    ref="table"
    :data="tableData"
    :row-key="row => row.id">
    <el-table-column
      type="selection"
      width="55">
      <template slot-scope="{row}">
        <span 
          style="position:absolute;top:0;left:0;width:100%;height:100%;cursor:pointer;z-index:-1"
          :class="{'el-checkbox': true, 'is-checked': row === checkedRow}"
          :style="{ 'pointer-events': 'none' }"
          />
      </template>
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名">
    </el-table-column>
    <el-table-column
      prop="age"
      label="年齡">
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        {
          id: 1,
          name: '小明',
          age: 18
        },
        {
          id: 2,
          name: '小紅',
          age: 20
        },
        {
          id: 3,
          name: '小張',
          age: 22
        }
      ],
      checkedRow: null,  //選中的數據
      startRow: null,  //拖拽開始的行數據
      isMouseDown: false  //滑鼠是否按下
    };
  },
  mounted() {
    const thiz = this;
    document.body.addEventListener('mousedown', function() {
      thiz.isMouseDown = true;
    });
    document.body.addEventListener('mouseup', function() {
      thiz.isMouseDown = false;
      thiz.startRow = null;
    });
    this.$nextTick(function() {
      const rows = this.$el.querySelectorAll('.el-table__body-wrapper tbody tr');
      for (let i = 0; i < rows.length; i++) {
        rows[i].addEventListener('mousedown', function() {
          thiz.startRow = thiz.tableData[i];
        });
        rows[i].addEventListener('mouseover', function() {
          if (thiz.isMouseDown && thiz.startRow) {
            thiz.checkedRow = thiz.tableData[i];
          }
        });
      }
    });
  }
};
</script>

以上代碼中,我們在mounted中監聽mouse事件,增加了拖拽選擇實現單選的效果。在初次點擊表格時,記錄起始選擇位置的數據,並通過監聽mouseover事件實時更新選擇範圍。

五、增加單元格可點擊區域

除了表格行外,有時也需要單元格可以被點擊來實現更細節的操作。通過為單元格內容增加點擊事件,我們可以進行一些更為靈活和定製化的操作。

<el-table
  :data="tableData"
  :row-key="row => row.id">
  <el-table-column
    prop="name"
    label="姓名">
    <template slot-scope="{row}">
      <span 
        :style="{cursor: 'pointer'}"
        @click="handleCellClick(row)">
        {{ row.name }}
      </span>
    </template>
  </el-table-column>
  <el-table-column
    prop="age"
    label="年齡">
    <template slot-scope="{row}">
      <span 
        :style="{cursor: 'pointer'}"
        @click="handleCellClick(row)">
        {{ row.age }}
      </span>
    </template>
  </el-table-column>
</el-table>

以上代碼中,我們對需要點擊的單元格中的內容增加了click事件,這樣就能夠實現對單元格的簡單操作了。

原創文章,作者:YPPA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143046.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YPPA的頭像YPPA
上一篇 2024-10-14 18:44
下一篇 2024-10-14 18:44

相關推薦

  • Oracle Table函數詳解

    一、概覽 Table函數是Oracle中一種高級SQL操作,它可以將複雜的表達式轉換成虛擬表來供查詢使用。使用Table函數,可以作為輸入多個行,返回一張臨時表。Table函數可以…

    編程 2025-04-25
  • EL-Button 點擊事件全方位解析

    一、基本概念 EL-Button 是餓了么 UI 組件庫中的一個按鈕組件,具有多種類型和樣式。 二、點擊事件綁定 為 EL-Button 組件綁定點擊事件,可以使用 v-on 指令…

    編程 2025-04-23
  • 深度解析el-checkbox-group

    一、el-checkbox-group插槽 在使用el-checkbox-group時,我們可以通過插槽來自定義每個checkbox的內容。例如: 上海 北京 廣州 深圳 {{ o…

    編程 2025-04-23
  • el-upload上傳文件大小限制詳解

    一、上傳文件大小的問題 上傳文件大小是很多開發者在使用el-upload組件時需要考慮的問題。一個應用程序實現上傳功能時,需要對上傳的內容的大小和數量進行精細控制,這是高效和安全的…

    編程 2025-04-23
  • 詳解Lua table.sort函數

    一、排序基礎知識 排序是數據處理中常見的操作,將一些數據按照一定的規則進行排序。在計算機科學中,排序演算法是一類經典的演算法問題。 排序演算法可以分為內部排序和外部排序,內部排序是指所有…

    編程 2025-04-22
  • 使用Vue修改Table的行數據

    一、創建一個Table組件 首先,我們需要創建一個Table組件,該組件將包含多個表格行。我們可以使用props向組件中傳遞一個表格數據數組,然後在組件中循環遍歷表格行。 <…

    編程 2025-04-22
  • layui.table詳解

    一、從layui.table.cache取第一條數據 在使用layui.table渲染表格時,如果我們需要獲取表格中的數據,可以使用layui.table.cache函數來獲取。下…

    編程 2025-04-22
  • 使用s-table組件優化網頁表格展示

    一、s-table組件概述 s-table是element-ui中的一個表格組件,使用簡便、性能優良,可適用於各種場景。其中,s-table組件提供了自定義表頭、表格大小、表格斑馬…

    編程 2025-04-13
  • 詳解table表頭固定

    一、CSS實現table表頭固定 在table標籤上加入以下CSS,即可實現table表頭固定: table { width: 100%; border-collapse: col…

    編程 2025-04-12
  • 深入el-option點擊事件

    一、觸發點擊事件 使用element-ui時,我們經常會使用它的下拉框el-select組件,它會包含多個el-option子組件,我們可以通過監聽el-select的change…

    編程 2025-04-12

發表回復

登錄後才能評論