亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue element-ui表格自定義動(dòng)態(tài)列具體實(shí)現(xiàn)

 更新時(shí)間:2023年06月10日 10:42:26   作者:終生耕田  
這周工作中遇見了一個(gè)表格動(dòng)態(tài)列的需求,下面這篇文章主要給大家介紹了關(guān)于vue element-ui表格自定義動(dòng)態(tài)列具體實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

element-ui表格自定義動(dòng)態(tài)列

實(shí)現(xiàn)效果

fd70c05c63b7784e53baff1c825f6b2.png

Snipaste_2023-02-17_11-51-56.png

具體功能

  1. 拖拽表頭改變寬度
    1. 限制最小寬度, 實(shí)時(shí)保存設(shè)置。
  2. 隱藏列
    1. 選中列隱藏, 不顯示在表格中。
    2. “勾選” 列和"操作" 列不可隱藏, 并且不包含在列控制組件中。
    3. 隱藏后, 無(wú)論是否凍結(jié)均不顯示。有特殊標(biāo)識(shí)則要另外做判斷。
  3. 列凍結(jié)
    1. 開啟時(shí), 表示選中列靠左凍結(jié)。
    2. 只有"操作" 列允許靠右凍結(jié)且禁止更改。
    3. 列按照凍結(jié)>不凍結(jié)的順序動(dòng)態(tài)排序。
  4. 列拖動(dòng)排序
    1. 拖動(dòng)結(jié)束按照凍結(jié)>不凍結(jié)的順序自動(dòng)排序。
  5. 恢復(fù)默認(rèn)配置
    1. 恢復(fù)表格的默認(rèn)配置, 清除用戶的自定義設(shè)置。
  6. 保存
    1. 只有保存后用戶的相關(guān)設(shè)置才會(huì)生效(包含隱藏列, 列凍結(jié)和列拖動(dòng)排序)。
  7. 取消
    1. 不保存用戶的相關(guān)設(shè)置(包含隱藏列, 列凍結(jié)和列拖動(dòng)排序)。

實(shí)現(xiàn)原理

相關(guān)數(shù)據(jù)格式

// 利用當(dāng)前頁(yè)面路由name值當(dāng)作唯一標(biāo)識(shí), 存儲(chǔ)到數(shù)據(jù)庫(kù)中
pathSign: 'DataGnGoodsReport'
// 表頭數(shù)據(jù)格式
[
	{
		"isFixed": "false",
		"isSortable": false,
		"label": "所屬部門",
		"minWidth": 108,
		"show": true,
		"specialMask": "isStoreSp",	// 特殊標(biāo)識(shí), 可用于該特殊標(biāo)識(shí)和show 雙層判斷隱藏該列, 需要做字符串轉(zhuǎn)變量的處理
		"value": "departId",	// 值標(biāo)識(shí)
		"width": 108
	}
]

頁(yè)面配置

// 頁(yè)面Table
<el-table
  border	// 邊框
  row-key="id"
  :data="tableDataFormat"
  :row-style="{'height': '100%'}"
  @sort-change="sortChange"	// 排序方法
  @header-dragend="headerDragend"	// 表頭拖拽方法
>
	// 根據(jù)表頭數(shù)組動(dòng)態(tài)渲染數(shù)據(jù)
	<template v-for="(item, index) in renderArr">
      <el-table-column
        v-if="item.specialMask ? item.show && strToVariable(item.specialMask) : item.show"	// 是否顯示
        :key="index"
        resizable
        :prop="item.value"	// 列的值
        :label="item.label"	// 表頭文案
        :min-width="item.minWidth"	// 最小寬度
        :width="item.width"	// 寬度
        :fixed="item.isFixed === 'false' ? false : item.isFixed"	// 是否凍結(jié)
        :align="item.align || 'center'"	// 文本對(duì)齊方式
        :sortable="item.isSortable && 'custom'"	// 當(dāng)前列是否可排序(升降序)
      >   
      	<template #default="{row}">
					/* 根據(jù)顯示類型不同, 做不同處理 */
        	<span v-if="item.value == name">{{ row[item.value] }}</span>
        	......
      	</template>
    	</el-table-column>
	</template>
</el-table>
// 引入列控制組件
<column-control ref="columnControl" :visible.sync="columnControlDialogVisible" :render-arr.sync="renderArr" @save="saveRenderArr" />

拖拽表頭改變寬度

鼠標(biāo)懸浮在表頭上方才顯示右邊框

.table-container >>> .el-table--border th{
  border-right: none;
}
.table-container >>> .el-table__header th:hover {
  border-right: 1px solid #939599;
}
.table-container >>> .el-table--border td{
  border: 0!important;
}

表頭拖拽

// 表頭拖拽, 使用表格header-dragend鉤子完成
headerDragend(newWidth, oldWidth, column, event) {
  const item = this.renderArr.find(item => item.label === column.label)
  // 取最小寬度
  if (newWidth <= item.minWidth) {
    column.width = item.minWidth
  } else {
    item.width = parseInt(column.width)
  }
  // 保存配置
  this.saveRenderArr(this.renderArr)
},

列控制組件封裝

HTML

<template>
  <el-dialog
    title="列控制"
    :visible.sync="visible"
    width="60%"
    top="4vh"
    :before-close="handleColumnControl"
  >
    <div class="table-column">
      <el-table
        ref="columnTable"
        row-key="label"
        :data="renderArrCopy"
        height="70vh"
        :row-style="{'height': '100%'}"
      >
        <el-table-column
          label="#"
          type="index"
          width="50"
        />
        <el-table-column
          prop="label"
          label="列名"
        />
        <el-table-column
          prop="show"
          label="隱藏列"
        >
          <template slot-scope="{row}">
            // 隱藏值取反判斷
            <el-switch v-model="row.show" :active-value="false" :inactive-value="true" />
          </template>
        </el-table-column>
        <el-table-column
          prop="show"
          label="列凍結(jié)"
        >
          <template slot-scope="{row}">
            <el-select v-model="row.isFixed" placeholder="請(qǐng)選擇" :disabled="row.value === 'action'" @change="sortRenderArr">
              <el-option
                v-for="item in options"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
            </el-select>
          </template>
        </el-table-column>
        <el-table-column
          label="拖動(dòng)排序"
          align="center"
        >
          <svg-icon icon-class="drag2" class="drag-icon move" />
        </el-table-column>
      </el-table>
    </div>
    <div class="submit-box">
      <el-button @click="handleColumnControl">取消</el-button>
      <el-button type="primary" @click="save">保存</el-button>
    </div>
    <div class="default-box" @click="restoreDefault">恢復(fù)出廠設(shè)置</div>
    <div class="tips">表格列根據(jù) 凍結(jié)>不凍結(jié) 的順序排序</div>
  </el-dialog>
</template>

JS

<script>
import Sortable from 'sortablejs'
import { deepClone } from '@/utils/index'
export default {
  name: 'ColumnControl',
  props: {
    visible: {
      type: Boolean,
      default: false
    },
    renderArr: {
      type: Array,
      default: function() {
        return []
      }
    }
  },
  data() {
    return {
      options: [
        {
          value: 'left',
          label: '凍結(jié)'
        },
        {
          value: 'false',
          label: '不凍結(jié)'
        }
      ],
      renderArrCopy: []	// 拷貝的表頭數(shù)據(jù)
    }
  },
  computed: {
  },
  watch: {
    visible: function(newVal, oldVal) {
      newVal && this.rowDrop()
      this.deepClone()
    }
  },
  methods: {
    // 深拷貝
    deepClone() {
      // 組件內(nèi)部表頭數(shù)據(jù)和頁(yè)面表頭數(shù)據(jù)分離
      this.renderArrCopy = deepClone(this.renderArr)
    },
    // 列拖動(dòng)排序
    rowDrop() {
      this.$nextTick(() => {
        // 要偵聽拖拽響應(yīng)的DOM對(duì)象
        const tbody = document.querySelector('.table-column .el-table__body-wrapper .el-table__body tbody')
        const _this = this
        Sortable.create(tbody, {
          animation: 20,
          // 結(jié)束拖拽后的回調(diào)函數(shù)
          onEnd({ newIndex, oldIndex }) {
            const currRow = _this.renderArrCopy.splice(oldIndex, 1)[0]
            _this.renderArrCopy.splice(newIndex, 0, currRow)
            const timer = setTimeout(() => {
              _this.sortRenderArr()
              clearTimeout(timer)
            }, 0)
          }
        })
        // 刪除最后一項(xiàng)操作('操作' 列項(xiàng)不顯示在該組件中。因數(shù)據(jù)上需要保留該項(xiàng), 所以不可采用刪除數(shù)據(jù)的方法來(lái)達(dá)到該效果, 只能從頁(yè)面渲染做隱藏處理)
        const lastIndex = this.renderArrCopy.length - 1
        if (this.renderArrCopy[lastIndex].label === '操作') {
          // 獲取'操作'項(xiàng)的那一行并刪除
          const rows = document.querySelectorAll('.table-column .el-table__row')
          // 類數(shù)組轉(zhuǎn)為數(shù)組
          Array.from(rows).forEach((item, index) => {
            index === lastIndex && item.remove()
          })
        }
      })
    },
    // 按凍結(jié) > 不凍結(jié)排序
    sortRenderArr() {
      this.renderArrCopy.sort((star, next) => {
        const arr = ['left', 'false']
        return arr.indexOf(star.isFixed) - arr.indexOf(next.isFixed)
      })
    },
    // 取消
    handleColumnControl() {
      this.$emit('update:visible', false)
    },
    // 保存
    async save() {
      this.$emit('update:renderArr', this.renderArrCopy)
      this.handleColumnControl()
      this.$emit('save', this.renderArrCopy)
    },
    // 恢復(fù)默認(rèn)配置
    restoreDefault() {
      this.$emit('save', [])
    }
  }
}
  </script>

全局方法

import { getRenderArr, saveRenderArr } from '@/api/common'
export const columnControlMixin = {
  data() {
    return {
      renderArr: [], // 動(dòng)態(tài)列表頭數(shù)組
      columnControlDialogVisible: false, // 動(dòng)態(tài)列組件顯示設(shè)置
    }
  },
  computed: {
    // 字符串轉(zhuǎn)變量
    strToVariable() {
      return function(text) {
        return this[text]
      }
    }
  },
  created() {
    // 獲取表頭數(shù)據(jù)
    this.getRenderArr()
  },
  methods: {
    // 表頭拖拽
    headerDragend(newWidth, oldWidth, column, event) {
      const item = this.renderArr.find(item => item.label === column.label)
      if (newWidth <= item.minWidth) {
        column.width = item.minWidth
      } else {
        item.width = parseInt(column.width)
      }
      this.saveRenderArr(this.renderArr)
    },
    // 根據(jù)name值獲取表頭數(shù)據(jù)
    async getRenderArr() {
      try {
        const res = await getRenderArr({
          pathSign: this.$route.name
        })
        if (res.code === 200) {
          this.renderArr = res?.data
        }
      } catch (error) {
        console.log(error)
      }
    },
    // 保存頁(yè)面表頭數(shù)據(jù)和重置
    async saveRenderArr(arr) {
      try {
        await saveRenderArr({
          pathSign: this.$route.name,
          content: arr || []
        })
        if (!arr.length) {
          await this.getRenderArr()
          // 列控制組件重新拷貝數(shù)據(jù)
          await this.$refs.columnControl.deepClone()
          this.$message({
            message: '恢復(fù)出廠設(shè)置成功',
            type: 'success'
          })
        }
      } catch (error) {
        console.log(error)
      }
    }
  }
}

總結(jié)

到此這篇關(guān)于vue element-ui表格自定義動(dòng)態(tài)列具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)element-ui表格自定義動(dòng)態(tài)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3中ts語(yǔ)法使用element plus分頁(yè)組件警告錯(cuò)誤問題

    vue3中ts語(yǔ)法使用element plus分頁(yè)組件警告錯(cuò)誤問題

    這篇文章主要介紹了vue3中ts語(yǔ)法使用element plus分頁(yè)組件警告錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • vue中如何修改props傳進(jìn)來(lái)的值

    vue中如何修改props傳進(jìn)來(lái)的值

    大家應(yīng)該都知道vue是單向數(shù)據(jù)流,一般我們也不會(huì)在子組件里面修改父組件傳進(jìn)來(lái)的值,但總有需要修改的時(shí)候,這篇文章主要介紹了vue中修改props傳進(jìn)來(lái)的值,需要的朋友可以參考下
    2022-12-12
  • VUE中操作dom元素的幾種方法(最新推薦)

    VUE中操作dom元素的幾種方法(最新推薦)

    本文給大家總結(jié)了Vue中操作dom元素的多種方法,每種方法結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友參考下吧
    2022-12-12
  • 詳解vue-cli中的ESlint配置文件eslintrc.js

    詳解vue-cli中的ESlint配置文件eslintrc.js

    本篇文章主要介紹了vue-cli中的ESlint配置文件eslintrc.js詳解 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • vue.js的手腳架vue-cli項(xiàng)目搭建的步驟

    vue.js的手腳架vue-cli項(xiàng)目搭建的步驟

    這篇文章主要介紹了vue.js的手腳架vue-cli項(xiàng)目搭建的步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • vue實(shí)現(xiàn)滾動(dòng)底部加載下一頁(yè)指令的示例代碼

    vue實(shí)現(xiàn)滾動(dòng)底部加載下一頁(yè)指令的示例代碼

    vue中監(jiān)控滾動(dòng)事件可以直接在mounted中綁定滾動(dòng)事件,然后在銷毀前解綁滾動(dòng)事件,本文通過(guò)實(shí)例代碼介紹vue實(shí)現(xiàn)滾動(dòng)底部加載下一頁(yè)指令的過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • vue中pc移動(dòng)滾動(dòng)穿透問題及解決

    vue中pc移動(dòng)滾動(dòng)穿透問題及解決

    這篇文章主要介紹了vue中pc移動(dòng)滾動(dòng)穿透問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vue中實(shí)現(xiàn)動(dòng)態(tài)生成二維碼的方法

    vue中實(shí)現(xiàn)動(dòng)態(tài)生成二維碼的方法

    這篇文章主要介紹了vue中實(shí)現(xiàn)動(dòng)態(tài)生成二維碼的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Vue 動(dòng)態(tài)添加路由及生成菜單的方法示例

    Vue 動(dòng)態(tài)添加路由及生成菜單的方法示例

    這篇文章主要介紹了Vue 動(dòng)態(tài)添加路由及生成菜單的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 淺談vue同一頁(yè)面中擁有兩個(gè)表單時(shí),的驗(yàn)證問題

    淺談vue同一頁(yè)面中擁有兩個(gè)表單時(shí),的驗(yàn)證問題

    今天小編就為大家分享一篇淺談vue同一頁(yè)面中擁有兩個(gè)表單時(shí),的驗(yàn)證問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論