VUE element-ui之table双表头遍历及筛选自动(回车查询)、重置、关闭dialog重置

简介: VUE element-ui之table双表头遍历及筛选自动(回车查询)、重置、关闭dialog重置

直接上封装的dialog组件代码

<template>
  <div>
    <el-dialog
      title="原片采购详情"
      class="Deviceslist_eldialog"
      width="978px"
      height="534px"
      :visible.sync="dialogVisible"
      :before-close="detailsCancel"
    >
    <el-descriptions class="margin-top" :column="5" size="mini" :label-style="{fontWeight:'bold',color:'#333333'}">
        <el-descriptions-item
         v-for="(eldesc, elindex) in detailroweldescriptions"
         :key="elindex"
         :label="eldesc.label"
        >
         {{ eldesc.value }}
        </el-descriptions-item>
    </el-descriptions>
    <el-descriptions :column="5" size="mini" :label-style="{fontWeight:'bold',color:'#333333'}">
      <el-descriptions-item label="总数量">{{ totalQuantity }}</el-descriptions-item>
      <el-descriptions-item label="总面积">{{ totalArear }}</el-descriptions-item>
      <el-descriptions-item label="总金额">{{ totalAmount }}元</el-descriptions-item>
    </el-descriptions>
    <div class="private_table">
      <el-table
          :data="tableData"
          style="width: 100%;height:528px"
          border
          height="528px"
          class="table-content"
          :fit="true"
          tooltip-effect="dark"
          id="tableId"
          @sort-change="sortChange"
        >
          <!-- @sort-change="sortChange" -->
          <el-table-column label="序号" width="60" align="center">
            <!-- eslint-disable vue/no-unused-vars -->
            <el-table-column label="序号" width="60" align="center">
              <template slot="header" slot-scope="scope">
                <div>
                  <span class="table-reload-select" @click="selectSearchReset">重置</span>
                </div>
              </template>
              <template slot-scope="scope">
                {{ scope.$index+1 }}
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column
            v-for="(tableitem, index) in tablelist"
            :key="index"
            :prop="tableitem.prop"
            :label="tableitem.label"
            :type="tableitem.type"
            :sortable="tableitem.sortable"
            :width="tableitem.width"
            :align="tableitem.align"
            show-overflow-tooltip
          >
            <el-table-column
              :prop="tableitem.prop"
              :label="tableitem.label"
              :width="tableitem.width"
              :align="tableitem.align"
              show-overflow-tooltip
            >
              <!-- eslint-disable vue/no-unused-vars -->
              <template slot="header" slot-scope="scope">
                <div v-if="tableitem.keynum === 0 ? true : false" />
                <div v-if="tableitem.keynum === 1 ? true : false">
                  <el-input
                    v-model="tableitem.search"
                    size="mini"
                    placeholder="请输入"
                    class="inputstyle"
                    @change="tableitem.findData"
                  />
                </div>
                <div v-if="tableitem.keynum === 2 ? true : false">
                  <el-select
                    v-model="tableitem.search"
                    placeholder="请选择"
                    clearable
                    class="inputstyle"
                    @change="tableitem.findData"
                  >
                    <el-option
                      v-for="item in tableitem.options"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                    />
                  </el-select>
                </div>
              </template>
            </el-table-column>
          </el-table-column>
      </el-table>
    </div>
        <span slot="footer" class="dialog-footer">
          <el-button type="primary" @click="detailsCancel">确 定</el-button>
        </span>
    </el-dialog>
  </div>
</template>

<script>
import { getOriginalFilmDetails } from '@/api/purchasing/yuanpianPurchase'
import { getDictionaryList } from '@/api/basicdata/businessDictionary'
import { getSupplierfileList } from '@/api/basicdata/supplierfile'

export default {
  name: 'DetailsDialog',
  props: {
    detailsVisible: {
      type: Boolean,
      default: false,
      required: true
    },
    paramtter: {
      type: String,
      default: '',
      required: true
    }
  },
  data() {
    const that = this
    return {
      dialogVisible: false,
      detailsId: this.paramtter,
      tableData: [],
      totalQuantity: '',
      totalArear: '',
      totalAmount: '',
      detailroweldescriptions: [
        {
          label: '采购单号',
          value: '',
          props: 'glassPurchaseNo'
        },
        {
          label: '供应商',
          value: '',
          props: 'supplierInfoName'
        },
        {
          label: '自编号',
          value: '',
          props: 'selfNo'
        },
        {
          label: '制单人',
          value: '',
          props: 'creator'
        },
        {
          label: '制单日期',
          value: '',
          props: 'createTime'
        },
        {
          label: '需到货日期',
          value: '',
          props: 'aogDate'
        },
        {
          label: '备注',
          value: '',
          props: 'remark'
        }
      ],
      tablelist: [
            {
                prop: 'glassCategorysName',
                label: '品类',
                keynum: 2,
                search: '',
                width: '102px',
                findData: function() {
                    that.mysearch()
                },
                options: []
            },
            {
                prop: 'thickness',
                label: '厚度',
                keynum: 1,
                search: '',
                sortable: 'custom',
                width: '102px',
                findData: function() {
                    that.mysearch()
                },
                options: []
            },
            {
                prop: 'factory',
                label: '原片厂家',
                keynum: 1,
                search: '',
                width: '102px',
                findData: function() {
                    that.mysearch()
                },
            },
            {
                prop: 'specs',
                label: '规格',
                keynum: 2,
                search: '',
                sortable: 'custom',
                width: '102px',
                findData: function() {
                    that.mysearch()
                },
                options: []
            },
            {
                prop: 'glassLevel',
                label: '等级',
                keynum: 1,
                search: '',
                width: '102px',
                findData: function() {
                    that.mysearch()
                },
            },
            {
                prop: 'color',
                label: '颜色/膜系',
                keynum: 1,
                search: '',
                width: '102px',
                findData: function() {
                    that.mysearch()
                },
            },
            {
                prop: 'quantity',
                label: '单包数量',
                keynum: 0,
                search: '',
                sortable: 'custom',
                width: '102px',
            },
            {
                prop: 'boxQuantity',
                label: '包数',
                keynum: 0,
                search: '',
                sortable: 'sortable',
                width: '102px',
            },
            {
                prop: 'arear',
                label: '面积',
                keynum: 0,
                search: '',
                sortable: 'custom',
                width: '102px',
            },
            {
                prop: 'amount',
                label: '单价',
                keynum: 0,
                search: '',
                sortable: 'custom',
                width: '102px',
            },
            {
                prop: 'totalAmount',
                label: '金额',
                keynum: 0,
                search: '',
                sortable: 'custom',
                width: '102px',
            },
            {
                prop: 'remark',
                label: '备注',
                keynum: 0,
                search: '',
                width: '102px',
            }
        ],
    }
  },
  watch: { //监听dialog状态与id并赋值
    detailsVisible: {
      handler(n, o) {
        console.log('watch:', n)
        this.dialogVisible = n
        console.log(n)
      },
      deep: true
    },
    paramtter(id) {
      console.log(`父传子id---`, id);
      this.detailsId = id
    }
  },
  mounted() {
    this.getOptions()
  },
  methods: {
    // 获取表格下拉数据
    getOptions() {
      const tenantId = sessionStorage.getItem('tenantId')
      getDictionaryList({
        categoryId: 11,
        tenantId,
      }).then(res=> { //展示label,参数取value
        const supplierInfoNameOptions = res.data.map(el=>({label: el.dictionaryName, value: el.id}))
        this.tablelist.forEach(el => {
          if (el.prop === 'glassCategorysName') {
            el.options = supplierInfoNameOptions
          }
          return el
        })
      })
      getDictionaryList({
        categoryId: 12,
        tenantId,
      }).then(res=> {
        this.tablelist[3].options = res.data.map(el=>({label: el.dictionaryName, value: el.id}))
      })
    },
    //调用接口排序
    sortChange({ column, prop, order }) {
      console.log(`sort---`, column)
      this.sortColumn = order ? prop : undefined
      // 正序asc,倒序desc
      this.sortEnum = order === 'ascending' ? 'ASC' : order === 'descending' ? 'DESC' : undefined
      this.mysearch()
      this.currentPage = 1
    },
    //筛选参数与表格列prop比对,比对成功收取用户输入筛选条件,作为参数请求接口
    getSearchItemValue(key) {
        const item = this.tablelist.find(el => el.prop === key)
        return item.search
    },
    //获取筛选参数
    getParams() {
      const params =  {
            glassCategorysId: this.getSearchItemValue('glassCategorysName'),
            thickness: this.getSearchItemValue('thickness'),
            factory: this.getSearchItemValue('factory'),
            specs: this.getSearchItemValue('specs'),
            glassLevel: this.getSearchItemValue('glassLevel'),
            color: this.getSearchItemValue('color'),
        }
      return params
    },
    // 重置
    selectSearchReset() {
      this.tablelist.forEach(el => {
            el.search = ''
        })
      this.mysearch()
    },
    //更新表格数据
    mysearch(id) {
      // console.log(`numner---id`, id);
      const param = this.getParams()
      console.log(`params---`, param);
      getOriginalFilmDetails(this.detailsId || id, param).then(res => { 
        this.totalQuantity = res.data.totalQuantity
        this.totalArear = res.data.totalArear
        this.totalAmount = res.data.totalAmount
        this.tableData = res.data.list
        Object.keys(res.data).map(vls => {
          var n = this.detailroweldescriptions.findIndex(function(item) { return item.props === vls })
          if (n !== -1) {
            this.detailroweldescriptions[n].value = res.data[vls]
          }
        })
        })
    },
    //diaolog关闭前的操作
      detailsCancel() {
          this.dialogVisible = false
          this.$emit('detailsHandle', false)
          this.tablelist.forEach(el => {
            el.search = ''
          })
          this.mysearch()
      }
  }
}
</script>

<style lang='scss' scoped>
  .private_table{
      width: 100%;
      height: calc(100% - 50px);
      background: #fff;
      border-top: 1px solid #323232;
      .table-reload-select{
        font-size: 14px;
        font-family: Microsoft YaHei;
        font-weight: 400;
        line-height: 0px;
        color: #2C68FF;
        opacity: 1;
        cursor: pointer;
      }
      .table-content{
        border-bottom: 1px solid #323232;
      }
      .table-reload-select{
        font-size: 14px;
          font-family: Microsoft YaHei;
          font-weight: 400;
          line-height: 0px;
          color: #2C68FF;
          opacity: 1;
          cursor: pointer;
      }
      .table-reload-detail, .table-reload-editor, .table-reload-examine, .table-reload-receipt, .table-reload-delete {
        font-size: 14px;
          font-family: Microsoft YaHei;
          font-weight: 400;
          line-height: 0px;
          color: #2C68FF;
          opacity: 1;
          cursor: pointer;
      }
      .table-reload-examine, .table-reload-receipt{color: #23BCCA;}
      .table-reload-delete {color: #F05656;}
      .table-reload-line{ color: #E0E0E0; }
      //@at-root
    }
</style>

<style lang="scss" >
  .private_table{
    .el-pagination.is-background .el-pager li:not(.disabled).active{
      background: #2C68FF;
    }
    .el-table thead.is-group th {
    background: none;
    }
    .el-table thead.is-group th.el-table__cell{
      background: #fff ;
      height: 26px !important;
    }
    .el-table thead tr:nth-child(2) th {
      background: rgb(239, 240, 241) !important;
    }
    .el-table tr{
      height: 26px;
    }
    .el-table .caret-wrapper{
      height: 26px;
    }
    .el-table .sort-caret.ascending{
      top: 0.1125rem
    }
    .el-table .sort-caret.descending{
      bottom:0.1375rem;
    }
    .el-table thead.is-group th {
      background: none;
    }
    .el-table td, .el-table th {
      padding: 0;
    }
    .el-input__icon{
      line-height: 0;
    }
    .el-input--suffix .el-input__inner{
      height: 26px;
    }
    .el-table .el-table__cell {
      border: 1px solid #C8C8C8;
      border-top: none;
      border-right: none;
    }
    .el-table th.el-table__cell>.cell{
      height: 26px;
      line-height: 25px;
    }
    .el-table .el-table__cell:nth-child(1) {
      border-left: none !important;
      text-align: center;
    }
    .el-input__inner{
      border: none !important;
      background: #eff0f1 !important;
    }
  }
</style>

<style scoped>
    /* 鼠标悬停背景色 */
  /deep/ .el-table--enable-row-hover .el-table__body tr:hover > td {
    background: #D3DEF9;
    
  }
  
</style>

效果图
在这里插入图片描述

相关文章
|
3月前
|
JavaScript
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
这篇文章介绍了如何使用Ant Design Vue UI框架创建一个简单的后台管理模板,包括创建Vue项目、安装和使用ant-design-vue、以及编写后台管理通用页面的代码和样式。
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
|
4月前
|
JavaScript
vue element-ui 中el-message重复弹出问题解决 el-message重复弹出解决办法
vue element-ui 中el-message重复弹出问题解决 el-message重复弹出解决办法
283 49
|
2月前
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
196 0
|
3月前
|
人工智能 JavaScript 索引
Duplicate keys detected: This may cause an update error.【Vue遍历渲染报错的解决】
这篇文章讨论了在Vue中进行列表渲染时遇到的“Duplicate keys detected”错误。这个错误通常发生在使用 `v-for` 指令渲染列表时,如果没有为每个循环项指定一个唯一的 `key` 属性,或者指定的 `key` 属性值重复了。文章提供了导致错误的原始代码示例,并给出了修正后的代码,通过在 `key` 绑定中加入索引确保 `key` 的唯一性。此外,文章还解释了为什么需要唯一 `key` 以及如何解决这个问题。
Duplicate keys detected: This may cause an update error.【Vue遍历渲染报错的解决】
|
3月前
|
JavaScript
element-ui table表格多选后再打开默认选中
element-ui table表格多选后再打开默认选中
|
2月前
|
JSON 数据可视化 JavaScript
低代码可视化教你Vue遍历循环绑定
低代码可视化教你Vue遍历循环绑定
34 0
|
4月前
|
JavaScript 前端开发 安全
[译] 在 Vue 组件中分离 UI 和业务逻辑。
[译] 在 Vue 组件中分离 UI 和业务逻辑。
|
1月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
8天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
43 1
vue学习第一章

热门文章

最新文章