element-ui表格el-table的使用

2023-10-30

先给大家展示一下效果

Table 属性 

属性名 说明 类型 可选值 默认值
data 显示的数据 array
height Table 的高度, 默认为自动高度。 如果 height 为 number 类型,单位 px;如果 height 为 string 类型,则这个高度会设置为 Table 的 style.height 的值,Table 的高度会受控于外部样式。 string / number
max-height Table 的最大高度。 合法的值为数字或者单位为 px 的高度。 string / number
stripe 是否为斑马纹 table boolean false
border 是否带有纵向边框 boolean false
size Table 的尺寸 string large / default /small
fit 列的宽度是否自撑开 boolean true
show-header 是否显示表头 boolean true
highlight-current-row 是否要高亮当前行 boolean false
current-row-key 当前行的 key,只写属性 string / number
row-class-name 行的 className 的回调方法,也可以使用字符串为所有行设置一个固定的 className。 function({ row, rowIndex }) / string
row-style 行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style。 function({ row, rowIndex }) / object
cell-class-name 单元格的 className 的回调方法,也可以使用字符串为所有单元格设置一个固定的 className。 function({ row, column, rowIndex, columnIndex }) / string
cell-style 单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有单元格设置一样的 Style。 function({ row, column, rowIndex, columnIndex }) / object
header-row-class-name 表头行的 className 的回调方法,也可以使用字符串为所有表头行设置一个固定的 className。 function({ row, rowIndex }) / string
header-row-style 表头行的 style 的回调方法,也可以使用一个固定的 Object 为所有表头行设置一样的 Style。 function({ row, rowIndex }) / object
header-cell-class-name 表头单元格的 className 的回调方法,也可以使用字符串为所有表头单元格设置一个固定的 className。 function({ row, column, rowIndex, columnIndex }) / string
header-cell-style 表头单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有表头单元格设置一样的 Style。 function({ row, column, rowIndex, columnIndex }) / object
row-key 行数据的 Key,用来优化 Table 的渲染; 在使用reserve-selection功能与显示树形数据时,该属性是必填的。 类型为 String 时,支持多层访问:user.info.id,但不支持 user.info[0].id,此种情况请使用 Function function(row) / string
empty-text 空数据时显示的文本内容, 也可以通过 #empty 设置 string No Data
default-expand-all 是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效 boolean false
expand-row-keys 可以通过该属性设置 Table 目前的展开行,需要设置 row-key 属性才能使用,该属性为展开行的 keys 数组。 array
default-sort 默认的排序列的 prop 和顺序。 它的 prop 属性指定默认的排序的列,order 指定默认排序的顺序 object (order: 'ascending' 'descending') 如果只指定了 prop, 没有指定 order, 则默认顺序是 ascending
tooltip-effect 溢出的 tooltip 的 effect string dark / light dark
tooltip-options 2.2.28 溢出 tooltip 的选项,参见下述 tooltip 组件 object 请参考 tooltip object
show-summary 是否在表尾显示合计行 boolean false
sum-text 显示摘要行第一列的文本 string Sum
summary-method 自定义的合计计算方法 function({ columns, data })
span-method 合并行或列的计算方法 function({ row, column, rowIndex, columnIndex })
select-on-indeterminate 在多选表格中,当仅有部分行被选中时,点击表头的多选框时的行为。 若为 true,则选中所有行;若为 false,则取消选择所有行 boolean true
indent 展示树形数据时,树节点的缩进 number 16
lazy 是否懒加载子节点数据 boolean
load 加载子节点数据的函数,lazy 为 true 时生效 function(row, treeNode, resolve)
tree-props 渲染嵌套数据的配置选项 object { hasChildren: 'hasChildren', children: 'children' }
table-layout 设置表格单元、行和列的布局方式 string fixed / auto fixed
scrollbar-always-on 总是显示滚动条 boolean false
flexible 2.2.1 确保主轴的最小尺寸 boolean false

Table 事件 

事件名 说明 回调参数
select 当用户手动勾选数据行的 Checkbox 时触发的事件 selection, row
select-all 当用户手动勾选全选 Checkbox 时触发的事件 selection
selection-change 当选择项发生变化时会触发该事件 selection
cell-mouse-enter 当单元格 hover 进入时会触发该事件 row, column, cell, event
cell-mouse-leave 当单元格 hover 退出时会触发该事件 row, column, cell, event
cell-click 当某个单元格被点击时会触发该事件 row, column, cell, event
cell-dblclick 当某个单元格被双击击时会触发该事件 row, column, cell, event
cell-contextmenu 当某个单元格被鼠标右键点击时会触发该事件 row, column, cell, event
row-click 当某一行被点击时会触发该事件 row, column, event
row-contextmenu 当某一行被鼠标右键点击时会触发该事件 row, column, event
row-dblclick 当某一行被双击时会触发该事件 row, column, event
header-click 当某一列的表头被点击时会触发该事件 column, event
header-contextmenu 当某一列的表头被鼠标右键点击时触发该事件 column, event
sort-change 当表格的排序条件发生变化的时候会触发该事件 { column, prop, order }
filter-change column 的 key, 如果需要使用 filter-change 事件,则需要此属性标识是哪个 column 的筛选条件 filters
current-change 当表格的当前行发生变化的时候会触发该事件,如果要高亮当前行,请打开表格的 highlight-current-row 属性 currentRow, oldCurrentRow
header-dragend 当拖动表头改变了列的宽度的时候会触发该事件 newWidth, oldWidth, column, event
expand-change 当用户对某一行展开或者关闭的时候会触发该事件(展开行时,回调的第二个参数为 expandedRows;树形表格时第二参数为 expanded) row, (expandedRows | expanded)

Table 方法 

方法名 说明 参数
clearSelection 用于多选表格,清空用户的选择
getSelectionRows 返回当前选中的行
toggleRowSelection 用于多选表格,切换某一行的选中状态, 如果使用了第二个参数,则可直接设置这一行选中与否 row, selected
toggleAllSelection 用于多选表格,切换全选和全不选
toggleRowExpansion 用于可扩展的表格或树表格,如果某行被扩展,则切换。 使用第二个参数,您可以直接设置该行应该被扩展或折叠。 row, expanded
setCurrentRow 用于单选表格,设定某一行为选中行, 如果调用时不加参数,则会取消目前高亮行的选中状态。 row
clearSort 用于清空排序条件,数据会恢复成未排序的状态
clearFilter 传入由columnKey 组成的数组以清除指定列的过滤条件。 如果没有参数,清除所有过滤器 columnKeys
doLayout 对 Table 进行重新布局。 当表格可见性变化时,您可能需要调用此方法以获得正确的布局
sort 手动排序表格。 参数 prop 属性指定排序列,order 指定排序顺序。 prop: string, order: string
scrollTo 滚动到一组特定坐标 (options: ScrollToOptions | number, yCoord?: number)
setScrollTop 设置垂直滚动位置 top
setScrollLeft 设置水平滚动位置 left

Table 插槽 

插槽名 说明 子标签
- 自定义默认内容 Table-column
append 插入至表格最后一行之后的内容, 如果需要对表格的内容进行无限滚动操作,可能需要用到这个 slot。 若表格有合计行,该 slot 会位于合计行之上。
empty 当数据为空时自定义的内容

Table-column 属性 

属性名 说明 类型 可选值 默认值
type 对应列的类型。 如果设置了selection则显示多选框; 如果设置了 index 则显示该行的索引(从 1 开始计算); 如果设置了 expand 则显示为一个可展开的按钮 string selection / index / expand
index 如果设置了 type=index,可以通过传递 index 属性来自定义索引 number / function(index)
label 显示的标题 string
column-key column 的 key, column 的 key, 如果需要使用 filter-change 事件,则需要此属性标识是哪个 column 的筛选条件 string
prop 字段名称 对应列内容的字段名, 也可以使用 property属性 string
width 对应列的宽度 string / number
min-width 对应列的最小宽度, 对应列的最小宽度, 与 width 的区别是 width 是固定的,min-width 会把剩余宽度按比例分配给设置了 min-width 的列 string / number
fixed 列是否固定在左侧或者右侧。 true 表示固定在左侧 string / boolean true / 'left' / 'right'
render-header 列标题 Label 区域渲染使用的 Function function({ column, $index })
sortable 对应列是否可以排序, 如果设置为 'custom',则代表用户希望远程排序,需要监听 Table 的 sort-change 事件 boolean / string custom false
sort-method 指定数据按照哪个属性进行排序,仅当sortable设置为true的时候有效。 应该如同 Array.sort 那样返回一个 Number function(a, b)
sort-by 指定数据按照哪个属性进行排序,仅当 sortable 设置为 true 且没有设置 sort-method 的时候有效。 如果 sort-by 为数组,则先按照第 1 个属性排序,如果第 1 个相等,再按照第 2 个排序,以此类推 function(row, index) / string / array
sort-orders 数据在排序时所使用排序策略的轮转顺序,仅当 sortable 为 true 时有效。 需传入一个数组,随着用户点击表头,该列依次按照数组中元素的顺序进行排序 array 数组中的元素需为以下三者之一:ascending 表示升序,descending 表示降序,null 表示还原为原始顺序 ['ascending', 'descending', null]
resizable 对应列是否可以通过拖动改变宽度(需要在 el-table 上设置 border 属性为真) boolean true
formatter 用来格式化内容 function(row, column, cellValue, index)
show-overflow-tooltip 当内容过长被隐藏时显示 tooltip boolean \ object 2.2.28 参考表格的 tooltip-options
align 对齐方式 string left / center / right left
header-align 表头对齐方式, 若不设置该项,则使用表格的对齐方式 string left / center / right
class-name 列的 className string
label-class-name 当前列标题的自定义类名 string
selectable 仅对 type=selection 的列有效,类型为 Function,Function 的返回值用来决定这一行的 CheckBox 是否可以勾选 function(row, index)
reserve-selection 数据刷新后是否保留选项,仅对 type=selection 的列有效, 请注意, 需指定 row-key 来让这个功能生效。 boolean false
filters 数据过滤的选项, 数组格式,数组中的元素需要有 text 和 value 属性。 数组中的每个元素都需要有 text 和 value 属性。 Array<{text: string, value: string}>
filter-placement 过滤弹出框的定位 string 与 Tooltip 的 placement 属性相同
filter-multiple 数据过滤的选项是否多选 boolean true
filter-method 数据过滤使用的方法, 如果是多选的筛选项,对每一条数据会执行多次,任意一次返回 true 就会显示。 function(value, row, column)
filtered-value 选中的数据过滤项,如果需要自定义表头过滤的渲染方式,可能会需要此属性。 array

Table-column 插槽 

插槽名 说明
自定义列的内容 作用域参数为 { row, column, $index }
header 自定义表头的内容, 作用域参数为 { column, $index }

表格部分代码

  <!--表格数据展示 start-->
      <el-table :data="dataList.list" style="width:1300px;">
        <el-table-column prop="bookImg" label="图片" width="150" align="center">
          <template #default="scope">
            <img :src="scope.row.bookImg" style="height:60px"/>
          </template>
        </el-table-column>
        <el-table-column  prop="bookTypeId" label="类型" width="100px">
          <template #default="scope">
                <span v-for="item in typeList.list" :key="item.bookTypeId">
                    {{ scope.row.bookTypeId == item.bookTypeId ? item.bookTypeName : '' }}
                </span>
          </template>
        </el-table-column>
        <el-table-column  prop="bookName" label="名称" width="100" align="center">
          <template #default="scope">
            <div style="color: #6ca7ef;" v-html="scope.row.bookName"></div>
          </template>
        </el-table-column>
        <el-table-column prop="bookPrice" label="价格" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookWriter" label="作者" width="60" align="center">
        </el-table-column>
        <el-table-column show-overflow-tooltip prop="bookPublishHouse" label="出版社" width="80" align="center">
        </el-table-column>
        <el-table-column prop="bookPublishTime" label="出版时间" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookISBN" label="ISBN号" width="100"
                         align="center"></el-table-column>
        <el-table-column prop="bookStock" label="库存" width="100" align="center"></el-table-column>
        <el-table-column prop="bookSalvesVolume" label="销量" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookCatalog" label="目录" width="60" align="center">
        </el-table-column>
        <el-table-column show-overflow-tooltip prop="bookDesc" label="简介" width="60" align="center">
        </el-table-column>
        <el-table-column label="操作" width="200" align="center">
          <template #default="scope">
            <el-button round size="small" type="primary"
                       @click="handleEdit(scope.$index, scope.row)">修改
            </el-button>
            <el-button round size="small" type="danger"
                       @click="handleDelete(scope.$index, scope.row)">删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      <!--表格数据展示 end-->

全部代码 

<template>
  <div class="data-container">
    <!--添加 start-->
    <div class="data-header">
      <!--优化:@keyup.enter="searchHandle"回车时触发searchHandle事件-->
      <el-input class="input" @keyup.enter="searchHandle" v-model="searchInfo" size="large"
                placeholder="请输入名称/作者/出版社"></el-input>
      <el-button @click="searchHandle" class="button" size="large" type="primary" plain>搜索</el-button>
      <el-button @click="addHander" style="margin-left: 40px;" size="large" class="button" type="primary">
        <el-icon>
          <DocumentAdd/>
        </el-icon>&nbsp;添加
      </el-button>
    </div>
    <!--添加 end-->
    <div class="data-table">
      <!--表格数据展示 start-->
      <el-table :data="dataList.list" style="width:1300px;">
        <el-table-column prop="bookImg" label="图片" width="150" align="center">
          <template #default="scope">
            <img :src="scope.row.bookImg" style="height:60px"/>
          </template>
        </el-table-column>
        <el-table-column  prop="bookTypeId" label="类型" width="100px">
          <template #default="scope">
                <span v-for="item in typeList.list" :key="item.bookTypeId">
                    {{ scope.row.bookTypeId == item.bookTypeId ? item.bookTypeName : '' }}
                </span>
          </template>
        </el-table-column>
        <el-table-column  prop="bookName" label="名称" width="100" align="center">
          <template #default="scope">
            <div style="color: #6ca7ef;" v-html="scope.row.bookName"></div>
          </template>
        </el-table-column>
        <el-table-column prop="bookPrice" label="价格" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookWriter" label="作者" width="60" align="center">
        </el-table-column>
        <el-table-column show-overflow-tooltip prop="bookPublishHouse" label="出版社" width="80" align="center">
        </el-table-column>
        <el-table-column prop="bookPublishTime" label="出版时间" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookISBN" label="ISBN号" width="100"
                         align="center"></el-table-column>
        <el-table-column prop="bookStock" label="库存" width="100" align="center"></el-table-column>
        <el-table-column prop="bookSalvesVolume" label="销量" width="100" align="center"></el-table-column>
        <el-table-column show-overflow-tooltip prop="bookCatalog" label="目录" width="60" align="center">
        </el-table-column>
        <el-table-column show-overflow-tooltip prop="bookDesc" label="简介" width="60" align="center">
        </el-table-column>
        <el-table-column label="操作" width="200" align="center">
          <template #default="scope">
            <el-button round size="small" type="primary"
                       @click="handleEdit(scope.$index, scope.row)">修改
            </el-button>
            <el-button round size="small" type="danger"
                       @click="handleDelete(scope.$index, scope.row)">删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      <!--表格数据展示 end-->
      <!--分页 start-->
      <div class="page">
        <el-pagination @current-change="currentChangeHaddler" background layout="prev,pager,next,jumper"
                       default-page-size="defaultPageSize" :total="totalData"></el-pagination>
      </div>
      <!--分页 end-->
      <!--添加对话框 start-->
      <el-dialog draggable destroy-on-close v-model="dialogAddVisible" title="添加" width="70%" center>
        <el-form :inline="true" :model="addFormInfo" status-icon label-width="120px">
          <el-form-item label="图片">
            <el-upload list-type="picture-card" action="http://localhost:8040/file/localhost/upload"
                       :on-success="onUploadAddSuccess" :on-remove="handleAddRemove">
              <el-icon>
                <Plus/>
              </el-icon>
            </el-upload>
          </el-form-item>
          <el-form-item label="类型">
            <el-select v-model="addFormInfo.bookTypeId" class="m-2" placeholder="请选择书籍类型" size="large">
              <el-option v-for="item in typeList.list" :key="item.bookTypeId" :label="item.bookTypeName"
                         :value="item.bookTypeId"/>
            </el-select>
          </el-form-item>
          <el-form-item label="名称">
            <el-input v-model="addFormInfo.bookName"></el-input>
          </el-form-item>
          <el-form-item label="价格">
            <el-input v-model="addFormInfo.bookPrice"></el-input>
          </el-form-item>
          <el-form-item label="作者">
            <el-input v-model="addFormInfo.bookWriter"></el-input>
          </el-form-item>
          <el-form-item label="出版社">
            <el-input v-model="addFormInfo.bookPublishHouse"></el-input>
          </el-form-item>
          <el-form-item label="出版时间">
            <el-input v-model="addFormInfo.bookPublishTime"></el-input>
          </el-form-item>
          <el-form-item label="ISBN号">
            <el-input v-model="addFormInfo.bookISBN"></el-input>
          </el-form-item>
          <el-form-item label="库存">
            <el-input v-model="addFormInfo.bookStock"></el-input>
          </el-form-item>
          <el-form-item label="销量">
            <el-input v-model="addFormInfo.bookSalvesVolume"></el-input>
          </el-form-item>
          <el-form-item label="目录">
            <el-input style="width: 800px" :rows="6" type="textarea" v-model="addFormInfo.bookCatalog"></el-input>
          </el-form-item>
          <el-form-item label="简介">
            <el-input style="width: 800px" :rows="6" type="textarea" v-model="addFormInfo.bookDesc"></el-input>
          </el-form-item>

        </el-form>
        <template #footer>
                    <span class="dialog-footer">
                        <el-button @click="dialogAddVisible = false">取消</el-button>
                        <el-button type="primary" @click="sureHandler">确定</el-button>
                    </span>
        </template>
      </el-dialog>
      <!--添加对话框 end-->
      <!--编辑对话框 start-->
      <el-dialog draggable destroy-on-close v-model="dialogEditorVisible" title="修改" width="70%" center>
        <el-form :inline="true" :model="editorFormInfo" label-width="120px">
          <el-form-item label="图片">
            <el-upload list-type="picture-card" action="http://localhost:8040/file/localhost/upload"
                       :show-file-list="false"
                       :on-success="onUploadEditorSuccess">
              <img v-if="fileEditorPath" :src="fileEditorPath" class="avatar" style="height:60px"/>
              <el-icon v-else class="avatar-uploader-icon">
                <Plus/>
              </el-icon>
            </el-upload>
          </el-form-item>
          <el-form-item label="类型">
            <el-select v-model="editorFormInfo.bookTypeId" class="m-2" placeholder="Select" size="large">
              <el-option v-for="item in typeList.list" :key="item.bookTypeId" :label="item.bookTypeName"
                         :value="item.bookTypeId"/>
            </el-select>
          </el-form-item>
          <el-form-item label="名称">
            <el-input v-model="editorFormInfo.bookName"></el-input>
          </el-form-item>
          <el-form-item label="价格">
            <el-input v-model="editorFormInfo.bookPrice"></el-input>
          </el-form-item>
          <el-form-item label="作者">
            <el-input v-model="editorFormInfo.bookWriter"></el-input>
          </el-form-item>
          <el-form-item label="出版社">
            <el-input v-model="editorFormInfo.bookPublishHouse"></el-input>
          </el-form-item>
          <el-form-item label="出版时间">
            <el-input v-model="editorFormInfo.bookPublishTime"></el-input>
          </el-form-item>
          <el-form-item label="ISBN号">
            <el-input v-model="editorFormInfo.bookISBN"></el-input>
          </el-form-item>
          <el-form-item label="库存">
            <el-input v-model="editorFormInfo.bookStock"></el-input>
          </el-form-item>
          <el-form-item label="销量">
            <el-input v-model="editorFormInfo.bookSalvesVolume"></el-input>
          </el-form-item>
          <el-form-item label="目录">
            <el-input style="width: 800px" :rows="6" type="textarea" v-model="editorFormInfo.bookCatalog"></el-input>
          </el-form-item>
          <el-form-item label="简介">
            <el-input style="width: 800px" :rows="6" type="textarea" v-model="editorFormInfo.bookDesc"></el-input>
          </el-form-item>
        </el-form>
        <template #footer>
                    <span class="dialog-footer">
                        <el-button @click="dialogEditorVisible = false">取消</el-button>
                        <el-button type="primary" @click="sureEditorHandler">确定</el-button>
                    </span>
        </template>
      </el-dialog>
      <!--编辑对话框 end-->
    </div>
  </div>
</template>
<script setup>
import axios from "@/utils/request.js"
import {onMounted, reactive, ref} from "vue";
//初始化类型列表
const typeList = reactive({
  list: []
})
//数据列表
const dataList = reactive({
  list: []
})
//数据总条数
const totalData = ref(0)
//当前页
const currentPage = ref(1)
//初始化分页显示条数
const defaultPageSize = ref(5)
//搜索初始化状态
const searchInfo = ref("")
//添加-上传后图片地址
const fileAddPath = ref(0)
//编辑-上传后图片地址
const fileEditorPath = ref(0)
//添加添加对话框控制器
const dialogAddVisible = ref(false)
//初始化添加对话框状态
const addFormInfo = reactive({

  bookImg: "",
  bookName: "",
  bookPrice: "",
  bookWriter: "",
  bookPublishHouse: "",
  bookPublishTime: "",
  bookISBN: "",
  bookStock: "",
  bookSalvesVolume: "",

  bookCatalog: "",

  bookDesc: "",

  bookTypeId: "",

})
//编辑对话框控制器
const dialogEditorVisible = ref(false)
//初始化编辑对话框状态
const editorFormInfo = reactive({
  bookId: "",
  bookImg: "",
  bookName: "",
  bookPrice: "",
  bookWriter: "",
  bookPublishHouse: "",
  bookPublishTime: "",
  bookISBN: "",
  bookStock: "",
  bookSalvesVolume: "",

  bookCatalog: "",

  bookDesc: "",

  bookTypeId: "",

})
/**
 * 网路请求:分页查询
 *  */
const http = (search, page, size) => {
  axios.get('/book/book/search', {
    params: {
      search,
      page,
      size
    }
  }).then(res => {
    if (res.data.code == 200) {
      dataList.list = res.data.data.records
      totalData.value = res.data.data.total
    } else {
      ElMessage.error(res.data.message)
    }

  })
}
onMounted(() => {
  http(null, 1, 5)
  axios.get('/book/bookType/findAll').then(res => {
    typeList.list = res.data.data
    console.log(typeList.list[0])
  })
})
/**
 * 添加时文件上传成功时的钩子
 */
const onUploadAddSuccess = (response, uploadFile) => {
  console.log(response)//http://192.168.66.101/group1/M00/00/00/wKhCZWQZ2Y6AfdIDAADHg7AcneY285.jpg
  console.log(uploadFile.raw.name)//springboot.jpg
  fileAddPath.value = response.data
}
/**
 * 编辑时文件上传成功时的钩子
 */
const onUploadEditorSuccess = (response, uploadFile) => {
  //console.log(response.data)//http://192.168.66.101/group1/M00/00/00/wKhCZWQZ2Y6AfdIDAADHg7AcneY285.jpg
  //console.log(uploadFile.raw.name)//springboot.jpg
  fileEditorPath.value = response.data
}
/**
 * 添加时文件移除时的操作
 */
const handleAddRemove = (file, files) => {
  //console.log(file.url)//file.url---blob:http://127.0.0.1:81/87591d3e-43e3-4032-bd61-c26867d32f0e
  //console.log(fileAddPath.value)
  axios.post('/book/book/delete', {
    params: {
      filePath: fileAddPath.value
    }
  }).then(res => {
    if (res.data.code == 200) {
      fileAddPath.value = null
      ElMessage.success("上传时移除图片成功")
    }
  })
}
/**
 * 分页
 */
const currentChangeHaddler = (val) => {
  http(searchInfo.value, val, 5)
  currentPage.value = val
}
/**
 * 搜索按钮
 */
const searchHandle = () => {
  http(searchInfo.value, 1, 5)
}
/**
 * 添加对话框弹出事件
 */
const addHander = () => {
  dialogAddVisible.value = true
}
/**
 * 添加对话框 确定事件
 */
const sureHandler = () => {
  axios.post('/book/book/add', {
    bookName: addFormInfo.bookName,
    bookPrice: addFormInfo.bookPrice,
    bookImg: fileAddPath.value,
    bookWriter: addFormInfo.bookWriter,
    bookPublishHouse: addFormInfo.bookPublishHouse,
    bookPublishTime: addFormInfo.bookPublishTime,
    bookISBN: addFormInfo.bookISBN,
    bookStock: addFormInfo.bookStock,
    bookSalvesVolume: addFormInfo.bookSalvesVolume,
    bookCatalog: addFormInfo.bookCatalog,
    bookDesc: addFormInfo.bookDesc,
    bookTypeId: addFormInfo.bookTypeId,
  }).then(res => {
    if (res.data.code == 200) {
      dialogAddVisible.value = false
      //刷新页面
      http(null, currentPage.value, 5)
      fileAddPath.value = null
    } else {
      ElMessage.error(res.data.message)
    }
  })
}
/**
 * 编辑对话框 弹出事件
 *  */
const handleEdit = (index, row) => {
  dialogEditorVisible.value = true
  axios.get('/book/book/findById', {
    params: {
      bookId: row.bookId
    }
  }).then(res => {
    if (res.data.code == 200) {
      editorFormInfo.bookId = res.data.data.bookId;
      fileEditorPath.value = res.data.data.bookImg;
      editorFormInfo.bookPrice = res.data.data.bookPrice;
      editorFormInfo.bookWriter = res.data.data.bookWriter;
      editorFormInfo.bookPublishHouse = res.data.data.bookPublishHouse;
      editorFormInfo.bookPublishTime = res.data.data.bookPublishTime;
      editorFormInfo.bookISBN = res.data.data.bookISBN;
      editorFormInfo.bookStock = res.data.data.bookStock;
      editorFormInfo.bookSalvesVolume = res.data.data.bookSalvesVolume;
      editorFormInfo.bookCatalog = res.data.data.bookCatalog;
      editorFormInfo.bookDesc = res.data.data.bookDesc;
      editorFormInfo.bookTypeId = res.data.data.bookTypeId;
    } else {
      ElMessage.error(res.data.data.message)
    }
  })

}
/**
 * 编辑对话框 确定事件
 */
const sureEditorHandler = () => {
  axios.post('/book/book/update', {
    bookId: editorFormInfo.bookId,
    bookName: editorFormInfo.bookName,
    bookPrice: editorFormInfo.bookPrice,
    bookImg: fileEditorPath.value,
    bookWriter: editorFormInfo.bookWriter,
    bookPublishHouse: editorFormInfo.bookPublishHouse,
    bookPublishTime: editorFormInfo.bookPublishTime,
    bookISBN: editorFormInfo.bookISBN,
    bookStock: editorFormInfo.bookStock,
    bookSalvesVolume: editorFormInfo.bookSalvesVolume,
    bookCatalog: editorFormInfo.bookCatalog,
    bookDesc: editorFormInfo.bookDesc,
    bookTypeId: editorFormInfo.bookTypeId,
  }).then(res => {
    if (res.data.code == 200) {
      dialogEditorVisible.value = false
      http(null, currentPage.value, 5)
    } else {
      ElMessage.error(res.data.message)
    }
  })
}

/**删除 */
const handleDelete = (index, row) => {
  ElMessageBox.confirm(
      '确定删除么',
      '删除',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      }
  ).then(() => {
    //确认删除
    axios.delete("/book/book/delete", {
      params: {
        bookId: row.bookId
      }
    }).then(res => {
      if (res.data.code == 200) {
        ElMessage({
          type: 'success',
          message: "删除成功!!!",
        })
        //刷新
        http(null, currentPage.value, 5)
      } else {
        ElMessage({
          type: 'error',
          message: res.data.message,
        })
      }
    })
  }).catch(error => {
    ElMessage({
      type: 'info',
      message: "取消删除",
    })
  })


}
</script>
<style scoped>
.el-carousel__item:nth-child(2n + 1) {
  background-color: #d3dce6;
}

.data-header {
  background: linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -o-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -ms-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -moz-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -webkit-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  padding: 20px;
  width: 100%;
  background-attachment: #fff;
  box-sizing: border-box;
}

.data-header span {
  color: #6ca7ef;
  font-weight: 700;
}

.data-header .input {
  width: 300px;
}

.data-table {
  background: linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -o-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -ms-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -moz-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  background: -webkit-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
  padding: 20px;
  display: flex;
  width: 100%;
  height: 700px;
}

.page {
  /**分页模块*/
  /**固定定位 元素的位置相对于浏览器窗口是固定位置。即使窗口是滚动的它也不会移动 */
  position: fixed;
  right: 10px;
  bottom: 100px;
}
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

element-ui表格el-table的使用 的相关文章

  • 如何使用 HTML 5 实现类似 gmail 的文件上传/附件

    我记得一些支持 Ajax 之类的选项 无回发世界 文件上传 隐藏的 iframe 使用 flash 对象 尽管我仍然好奇为什么使用 SWF 以及它提供什么优势 然而 通过查看博客 HTML 5 似乎很有前途 我尝试了一些小示例 它确实有效
  • 如何实时改变setInterval的速度

    我想知道如何实时更改 setInterval 的速度 例如 if score lt 10 repeater setInterval function spawnEnemy 1000 if score gt 10 repeater setIn
  • 使用 Firefox 插件 sdk 的 nsISocketTransportService

    我正在尝试使用 Firefox 来读取 SSH 横幅 IE 当您最初连接到 SSH 服务器时 服务器会向您发送其横幅 标识服务器软件 并且您向 SSH 服务器发送您的横幅 标识您的客户端软件 为此 我使用以下 URL 中的示例 firefo
  • 使用 jQuery Select2 清除下拉菜单

    我正在尝试使用奇妙的方式以编程方式清除下拉菜单Select2 http ivaynberg github com select2 图书馆 使用 Select2 远程 ajax 调用动态填充下拉列表query option HTML
  • Mapbox GL 中的 MaxBounds 和自定义非对称填充

    我有一个 Mapbox GL JS 应用程序 在地图上显示一些小部件 为了确保地图上的任何内容都不会被它们隐藏 我使用以下命令添加了一些填充map setPadding 这是一个不对称的 在我的例子中左边比右边大 它按预期工作 例如fitB
  • karma/jasmine 控制台更详细的测试结果

    我使用 Karma 和 Jasmine 进行 javascript 单元测试 假设我有一个失败的测试 如下所示 expect objectA toEqual expectedObjectA 当失败时 我看到控制台上转储了两个对象 并显示一条
  • 为什么这行带有“await”的代码会触发微任务队列处理?

    以下引用是我理解微任务队列处理的主要参考 当 JS 堆栈清空时 就会处理微任务 承诺使用 杰克 阿奇博尔德 https twitter com jaffathecake status 954653170986311680 这对我来说没有意义
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 检索 css3 缩放元素的宽度/高度

    我正在与 offsetWidth 属性的奇怪之处 我认为 作斗争 这是场景 比方说 我有一个span标签 在我的js中 在某个时刻我执行css3转换 对于这个元素 例如 el set styles transform scale scale
  • 使用 JQuery 禁用和启用所有超链接

    我有以下禁用所有超链接的内容 但在事件发生后我想再次启用它们 我该如何执行此操作 a click function return false 我认为这不仅仅是将其设置为 true 那么简单 谢谢大家 不要以这种方式绑定 点击 处理程序 而是
  • 如果一个对象结构与另一个对象结构不匹配/不匹配,如何引发异常

    我将读取格式正确的用户输入对象 也就是说 输入对象现在可以具有接口中未定义的任何键或子结构 如果用户提供了无效的对象 我如何抛出异常 预定义接口 export interface InputStructureInterface tableN
  • 模板中带有 ng-if 的 angularjs 指令

    我正在构建一个在模板内使用 ng if 的指令 奇怪的是 提供给链接函数的元素没有扩展ng if代码 它只是ng if的注释行 经过一番尝试 我发现通过将链接代码包装在 timeout 中似乎可以使其正常工作 但我想知道这是否不是正确的处理
  • webpack中动态加载外部模块失败

    我正在尝试建立以下架构 一个核心 React 应用程序 它具有一些基本功能 并且能够在运行时加载其他 React 组件 这些额外的 React 组件可以按需加载 并且它们在构建核心应用程序时不可用 因此它们不能包含在核心应用程序的捆绑包中
  • 如何使用新的analytics.js跟踪多个帐户?

    我需要使用 Google 的新的analytics js 跟踪一个页面上两个帐户的综合浏览量 有大量教程和示例如何使用较旧的 ga js 进行操作 但我发现的只是这个分析文档页面 https developers google com an
  • Web组件中嵌套槽的内容不可见

    我有一个 Web 组件 它应该接受任意元素来包装其内容 虽然我可以在 Chrome 开发工具中看到插槽已正确分配 但 DOM 中什么也没有出现 以前有人见过这个问题吗 定义 class ExampleParent extends HTMLE
  • 如何为我的整个 Node.js 应用程序使用相同的 MySQL 连接?

    我有一个app js 我从那里运行我的整个应用程序 在 app js 内部 我require许多文件中都有代码 对于每个文件 我都这样做 var mysql require mysql var mclient mysql createCon
  • 我可以使用 ASP.NET WebForms 母版页在每个内容页中包含不同的 javascript/css 文件吗?

    我有几个使用相同母版页的内容页 它们并不都需要包含在相同的 javascript 和 css 文件中 tag 是否可以更改内容来自内容页面的标签 确实如此 但我建议采取一些不同的做法 我在关闭正文标签的正上方放置了一个内容占位符 然后我填充
  • ChartJs:如何按时间值(而不是像素)以编程方式平移

    我使用的是chartJs 3 6 1 和 Chartjs plugin zoom 1 2 1 但我认为这并不重要 我有 2 个时间序列折线图 当我通过拖放平移一个图表时 我也想移动 平移另一个图表 为此 我为 graphA 启用了缩放 平移
  • 使用 ref 触发反应 dropzone 不起作用

    我正在实现这个库 https github com felixrieseberg React Dropzone Component https github com felixrieseberg React Dropzone Compone
  • d3.event.translate 在触摸设备的缩放上包含 NaN

    我使用 d3 为我的 svg 编写了一个自定义缩放函数 如下所示 Zoom behavior function myzoom xpos d3 event translate 0 ypos d3 event translate 1 vis a

随机推荐

  • Spring Data JPA教程:审计(二)

    公众号 欢迎关注 书接上文 本文解决前面两个问题中的第二个问题 我们将为实体加上创建者和修改者的信息 首先创建一个返回授权用户信息的组件 获取授权用户信息 Spring Data JPA使用AuditorAware
  • c++基础——区分引用和指针

    目录 前言 1 引用 1 2引用的概念 1 2引用的定义 1 3引用与const 1 4引用的使用场景 2 指针 2 1概念 2 2获取对象的地址 2 3利用指针访问对象 2 3空指针 2 4野指针 2 4 1概念 2 4 2野指针的产生
  • Vs2019+Qt

    一 下载vs2019和qt 关于vs2019的配置方法不在赘述 上一篇已经讲解了 点击传送门 1 下载vs2019 直接在官网点击下载即可 是免费的 2 下载qt 在官网站下载即可 关于vs和qt安装 vs2019安装到自定义的目录就行 根
  • javascript 中函数调用方法:apply() 和 call()

    每个函数都包含两根非继承而来的方法 apply 和call 这两个方法的用途都是在特定的作用域中调用函数 实际上等于设置函数体内this对象的值 首先 apply 方法接收两个参数 一个是在其中运行函数的作用域 另一个是参数数组 其中第二个
  • Nacos - nacos-mysql.sql源文件与application.properties配置文件

    目录标题 前言 内容 初始化 MySQL 数据库 application properties 配置 前言 Nacos设置外部数据源 需要初始化nacos mysql sql源文件 修改application properties配置文件
  • android游戏开发(OpenGL ES绘制矩形平面)

    接触android将近一年了 以前学的应用开发 现在自学android游戏开发 把自己学到的分享出来一下 这也是我的第一篇博客 不说废话了 开始正文 GLRender类用于图形的渲染工作 Util类用于glrender中的数据缓冲 GLRe
  • 信号与中断的区别

    信号与中断的相似点 1 采用了相同的异步通信方式 2 当检测出有信号或中断请求时 都暂停正在执行的程序而转去执行相应的处理程序 3 都在处理完毕后返回到原来的断点 4 对信号或中断都可进行屏蔽 信号与中断的区别 1 中断有优先级 而信号没有
  • R:增加或删除列表元素

    列表创建之后可以添加新的组件 gt z lt list a abc b 12 gt z c lt Add gt z a 1 abc b 1 12 c 1 Add 还可以直接使用索引添加组件 gt z lt list a abc b 12 c
  • 深入了解java.lang.ArrayIndexOutOfBoundsException异常

    异常介绍 什么是异常 在编程过程中 异常是指在程序执行期间发生的意外或异常情况 当程序遇到异常时 会中断正常的执行流程 并且根据异常类型采取相应的处理措施 异常的分类 异常可以分为两种类型 受检异常 Checked Exception 和非
  • 在职阿里6年,一个29岁女软件测试工程师的心声

    简单的先说一下 坐标杭州 14届本科毕业 算上年前在阿里巴巴的面试 一共有面试了有6家公司 因为不想请假 因此只是每个晚上去其他公司面试 所以面试的公司比较少 其中成功的有4家 另外2家失败的原因在于 1 对于系统知识的了解不够全面 在最后
  • 【华为OD机试真题 JAVA】数组连续和

    JS版 华为OD机试真题 JS 数组连续和 标题 数组连续和 时间限制 1秒 内存限制 65536K 语言限制 不限 给定一个含有N个正整数的数组 求出有多少个连续区间 包括单个正整数 它们的和大于等于x 输入描述 第一行两个整数N x 0
  • Android自定义view之View的测量过程全解析

    Android 应用层开发中绕不开自定义 View 这个话题 虽然现在 Github 上有形形色色的开源库供大家使用 但是作为一名开发者而言 虽然不提倡重复造轮子 但是轮子都是造出来的 碰到一些新鲜的 UI 效果时 如果现有的控件无法完成任
  • 【零基础学QT】第九章 窗口美化QSS的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏目录 零基础学QT 文章导航篇 专栏资料 https pan baidu com s 192A28BTIYFHmixRcQwmaHw 提取码 qtqt 点
  • 谈谈阿里与谷歌的Java开发规范

    无规矩不成方圆 编码规范就如同协议 有了Http TCP等各种协议 计算机之间才能有效地通信 同样的 有了一致的编码规范 程序员之间才能有效地合作 道理大家都懂 可现实中的我们 经常一边吐槽别人的代码 一边写着被吐槽的代码 究其根本 就是缺
  • 黑窗口DOS命令

    常用命令 操作 说明 盘符名称 盘符切换 E 回车 表示切换到E盘 dir 查看当前路径下的内容 cd目录 进入单级目录 cd itheima cd 回退到上一级目录 cd目录1 目录2 进入多级目录 cd itheima javaSE c
  • excel

    1 按照xxx以列化分 按照 分为一列 选中 数据 分列 分隔符号 下一步 其他 点击完成
  • 《算法图解》总结第 8 章:贪婪算法

    仅用于记录学习 欢迎批评指正 大神勿喷 系列文章目录 算法图解 总结第 1 章 二分查找 大O表示法 算法图解 总结第 2 章 数组和链表 选择排序 算法图解 总结第 3 章 while循环 递归 栈 算法图解 总结第 4 章 分而治之 快
  • 你不知道的vector和string方法?

    变长数组 但是不是链表 刚开始误以为是链表 因为链表当时学的时候就是说的相比数组可以变长 熟练应用这个容器的每一个方法 定义 vector
  • 腾讯云数据库团队:MySQL5.7 JSON实现简介

    作者介绍 吴双桥 腾讯云工程师 阅读原文 更多技术干货 请访问腾云阁 本文主要介绍在MySQL 5 7 7开始引入的非结构化数据类型JSON的特性以及具体的实现方式 包括存储方式 首先介绍为什么要引入JSON的原生数据类型的支持 接着介绍M
  • element-ui表格el-table的使用

    先给大家展示一下效果 Table 属性 属性名 说明 类型 可选值 默认值 data 显示的数据 array height Table 的高度 默认为自动高度 如果 height 为 number 类型 单位 px 如果 height 为