Heim  >  Artikel  >  Web-Frontend  >  So implementieren Sie die Paging-Funktion über Tabellen- und Paginierungskomponenten in Vue2.5

So implementieren Sie die Paging-Funktion über Tabellen- und Paginierungskomponenten in Vue2.5

亚连
亚连Original
2018-06-09 14:22:102407Durchsuche

In diesem Artikel wird hauptsächlich vorgestellt, wie Vue2.5 die Tabellen- und Paginierungskomponenten von Element UI kombiniert. Es ist sehr gut und hat Referenzwert.

Das ist es Ende 2017 und zusammengefasst Im letzten Jahr oder so der Front-End-Straße hat Vue vom Anfang zum Aufgeben übergegangen, dann zum zweiten Mal den Palast betreten und den Weg von Vue1.0 bis Vue2 fortgesetzt. 5. In Kombination mit einigen tatsächlichen Projekten des Unternehmens werden auch einige praktischere Komponenten gekapselt.

Da die aktuelle Unternehmensverwaltungsplattform hauptsächlich Element UI verwendet, haben wir einfach die Komponenten Tabelle und Paginierung kombiniert, um eine Tabellenkomponente zu kapseln, die den Seitenwechsel unterstützt. Geben Sie einfach den Code direkt ein.

2. Implementierungsideen

2.1. Einführung von Element UI (allgemeine Einführung)

main .js

// Element UI
import Element from 'element-ui'
// 默认样式
import 'element-ui/lib/theme-chalk/index.css'

2.2. Beginnen Sie mit der Kapselung der iTable.vue-Komponente (Skelett)

Da alle Projekte des Unternehmens mit i beginnen, um Komponenten und Seiten zu unterscheiden , ist es üblich, dass Komponentennamen auch mit i beginnen. Fügen Sie zunächst die Tabellen- und Paginierungskomponenten hinzu.

<template>
 <p class="table">
  <!--region 表格-->
  <el-table id="iTable"></el-table>
  <!--endregion-->
  <!--region 分页-->
  <el-pagination></el-pagination>
  <!--endregion-->
 </p>
<template>

Entwickeln Sie eine gute Angewohnheit, Kommentare für persönliche Projekte zu schreiben.

2.3 die Seite Referenzieren Sie die iTable-Komponente und übergeben Sie den Wert an die iTable-Komponente

<template>
 <p class="table-page">
 <i-table :list="list" 
    :total="total" 
    :otherHeight="otherHeight"
    @handleSizeChange="handleSizeChange"
    @handleIndexChange="handleIndexChange" @handleSelectionChange="handleSelectionChange"
    :options="options"
    :columns="columns"
    :operates="operates"
    @handleFilter="handleFilter"
    @handelAction="handelAction">
 </i-table>
 </p>
</template>
<script>
 import iTable from &#39;../../components/Table/Index&#39;
 export default {
  components: {iTable},
  data () {
   return {
    total: 0, // table数据总条数
    list: [], // table数据
    otherHeight: 208, // 除了table表格之外的高度,为了做table表格的高度自适应
    page: 1, // 当前页码
    limit: 20, // 每页数量
    options: {
     stripe: true, // 是否为斑马纹 table
     loading: false, // 是否添加表格loading加载动画
     highlightCurrentRow: true, // 是否支持当前行高亮显示
     mutiSelect: true, // 是否支持列表项选中功能
     filter: false, // 是否支持数据过滤功能
     action: false // 是否支持 表格操作功能
    }, // table 的参数
    columns: [
     {
      prop: &#39;id&#39;,
      label: &#39;编号&#39;,
      align: &#39;center&#39;,
      width: 60
     },
     {
      prop: &#39;title&#39;,
      label: &#39;标题&#39;,
      align: &#39;center&#39;,
      width: 400,
      formatter: (row, column, cellValue) => {
       return `<span style="white-space: nowrap;color: dodgerblue;">${row.title}</span>`
      }
     },
     {
      prop: &#39;state&#39;,
      label: &#39;状态&#39;,
      align: &#39;center&#39;,
      width: &#39;160&#39;,
      render: (h, params) => {
       return h(&#39;el-tag&#39;, {
       props: {type: params.row.state === 0 ? &#39;success&#39; : params.row.state === 1 ? &#39;info&#39; : &#39;danger&#39;} // 组件的props
       }, params.row.state === 0 ? &#39;上架&#39; : params.row.state === 1 ? &#39;下架&#39; : &#39;审核中&#39;)
      }
     },
     ……
    ], // 需要展示的列
    operates: {
     width: 200,
     fixed: &#39;right&#39;,
     list: [
      {
       label: &#39;编辑&#39;,
       type: &#39;warning&#39;,
       show: true,
       icon: &#39;el-icon-edit&#39;,
       plain: true,
       disabled: true,
       method: (index, row) => {
        this.handleEdit(index, row)
       }
      },
      {
       label: &#39;删除&#39;,
       type: &#39;danger&#39;,
       icon: &#39;el-icon-delete&#39;,
       show: true,
       plain: false,
       disabled: false,
       method: (index, row) => {
        this.handleDel(index, row)
       }
      }
     ]
    } // 列操作按钮
   }
  },
  methods: {
    // 切换每页显示的数量
   handleSizeChange (size) {
    this.limit = size
    console.log(&#39; this.limit:&#39;, this.limit)
   },
   // 切换页码
   handleIndexChange (index) {
    this.page = index
    console.log(&#39; this.page:&#39;, this.page)
   },
   // 选中行
   handleSelectionChange (val) {
    console.log(&#39;val:&#39;, val)
   },
   // 编辑
   handleEdit (index, row) {
    console.log(&#39; index:&#39;, index)
    console.log(&#39; row:&#39;, row)
   },
   // 删除
   handleDel (index, row) {
    console.log(&#39; index:&#39;, index)
    console.log(&#39; row:&#39;, row)
   }
  }
 }
</script>

Zusätzlich zum Spaltenparameter und dem Operatorparameter sollten die anderen Parameter leicht zu verstehen sein, okay. Dann werden wir diese beiden Parameter im Detail erklären, dann müssen wir die Komponente iTable.vue kombinieren, um sie zu erklären. Als nächstes werden wir Muskeln und Blutgefäße zu iTable.vue hinzufügen und die Codes veröffentlichen. Schwieriger zu verstehen ist der Render-Parameter in Columns, der die virtuellen Tags von Vue nutzt, um in den Spalten der Tabelle beliebig verschiedene HTML-Tags und andere Komponenten der Element-UI verwenden zu können. (Sie können es auch direkt schreiben und sehen, ob die Tabellenkomponente erkannt wird, hahaha!) Dies ist wahrscheinlich für diejenigen, die gerade erst anfangen, schwer zu verstehen. Für weitere Details können Sie sich zur Verdeutlichung zunächst das Rendering von Vue ansehen Erklärung, wenn einige Freunde es nicht verstehen, können Sie mir direkt eine private Nachricht senden~~~

<!--region 封装的分页 table-->
<template>
 <p class="table">
 <el-table id="iTable" v-loading.iTable="options.loading" :data="list" :max-height="height" :stripe="options.stripe"
    ref="mutipleTable"
    @selection-change="handleSelectionChange">
  <!--region 选择框-->
  <el-table-column v-if="options.mutiSelect" type="selection" style="width: 55px;">
  </el-table-column>
  <!--endregion-->
  <!--region 数据列-->
  <template v-for="(column, index) in columns">
  <el-table-column :prop="column.prop"
       :label="column.label"
       :align="column.align"
       :width="column.width">
   <template slot-scope="scope">
   <template v-if="!column.render">
    <template v-if="column.formatter">
    <span v-html="column.formatter(scope.row, column)"></span>
    </template>
    <template v-else>
    <span>{{scope.row[column.prop]}}</span>
    </template>
   </template>
   <template v-else>
    <expand-dom :column="column" :row="scope.row" :render="column.render" :index="index"></expand-dom>
   </template>
   </template>
  </el-table-column>
  </template>
  <!--endregion-->
  <!--region 按钮操作组-->
  <el-table-column ref="fixedColumn" label="操作" align="center" :width="operates.width" :fixed="operates.fixed"
      v-if="operates.list.filter(_x=>_x.show === true).length > 0">
  <template slot-scope="scope">
   <p class="operate-group">
   <template v-for="(btn, key) in operates.list">
    <p class="item" v-if="btn.show">
    <el-button :type="btn.type" size="mini" :icon="btn.icon" :disabled="btn.disabled"
       :plain="btn.plain" @click.native.prevent="btn.method(key,scope.row)">{{ btn.label }}
    </el-button>
    </p>
   </template>
   </p>
  </template>
  </el-table-column>
  <!--endregion-->
 </el-table>
 <p style="height:12px"></p>
 <!--region 分页-->
 <el-pagination @size-change="handleSizeChange"
     @current-change="handleIndexChange"
     :page-size="pageSize"
     :page-sizes="[10, 20, 50]" :current-page="pageIndex" layout="total,sizes, prev, pager, next,jumper"
     :total="total"></el-pagination>
 <!--endregion-->
 <!--region 数据筛选-->
 <p class="filter-data fix-right" v-show="options.filter" @click="showfilterDataDialog">
  <span>筛选过滤</span>
 </p>
 <!--endregion-->
 <!--region 表格操作-->
 <p class="table-action fix-right" v-show="options.action" @click="showActionTableDialog">
  <span>表格操作</span>
 </p>
 <!--endregion-->
 </p>
</template>
<!--endregion-->
<script>
 export default {
 props: {
  list: {
  type: Array,
  default: []
  }, // 数据列表
  columns: {
  type: Array,
  default: []
  }, // 需要展示的列 === prop:列数据对应的属性,label:列名,align:对齐方式,width:列宽
  operates: {
  type: Array,
  default: []
  }, // 操作按钮组 === label: 文本,type :类型(primary / success / warning / danger / info / text),show:是否显示,icon:按钮图标,plain:是否朴素按钮,disabled:是否禁用,method:回调方法
  total: {
  type: Number,
  default: 0
  }, // 总数
  pageSize: {
  type: Number,
  default: 20
  }, // 每页显示的数量
  otherHeight: {
  type: Number,
  default: 160
  }, // 用来计算表格的高度
  options: {
  type: Object,
  default: {
   stripe: false, // 是否为斑马纹 table
   highlightCurrentRow: false // 是否要高亮当前行
  },
  filter: false,
  action: false
  } // table 表格的控制参数
 },
 components: {
  expandDom: {
  functional: true,
  props: {
   row: Object,
   render: Function,
   index: Number,
   column: {
   type: Object,
   default: null
   }
  },
  render: (h, ctx) => {
   const params = {
   row: ctx.props.row,
   index: ctx.props.index
   }
   if (ctx.props.column) params.column = ctx.props.column
   return ctx.props.render(h, params)
  }
  }
 },
 data () {
  return {
  pageIndex: 1,
  multipleSelection: [] // 多行选中
  }
 },
 mounted () {
 },
 computed: {
  height () {
  return this.$utils.Common.getWidthHeight().height - this.otherHeight
  }
 },
 methods: {
  // 切换每页显示的数量
  handleSizeChange (size) {
  this.$emit(&#39;handleSizeChange&#39;, size)
  this.pageIndex = 1
  },
  // 切换页码
  handleIndexChange (index) {
  this.$emit(&#39;handleIndexChange&#39;, index)
  this.pageIndex = index
  },
  // 多行选中
  handleSelectionChange (val) {
  this.multipleSelection = val
  this.$emit(&#39;handleSelectionChange&#39;, val)
  },
  // 显示 筛选弹窗
  showfilterDataDialog () {
  this.$emit(&#39;handleFilter&#39;)
  },
  // 显示 表格操作弹窗
  showActionTableDialog () {
  this.$emit(&#39;handelAction&#39;)
  }
 }
 }
</script>
<style lang="less" rel="stylesheet/less">
 @import "../../assets/styles/mixins";
 .table {
 height: 100%;
 .el-pagination {
  float: right;
  margin: 20px;
 }
 .el-table__header-wrapper, .el-table__fixed-header-wrapper {
  thead {
  tr {
   th {
   color: #333333;
   }
  }
  }
 }
 .el-table-column--selection .cell {
  padding: 0;
  text-align: center;
 }
 .el-table__fixed-right {
  bottom: 0 !important;
  right: 6px !important;
  z-index: 1004;
 }
 .operate-group {
  display: flex;
  flex-wrap: wrap;
  .item {
  margin-top: 4px;
  margin-bottom: 4px;
  display: block;
  flex: 0 0 50%;
  }
 }
 .filter-data {
  top: e("calc((100% - 100px) / 3)");
  background-color: rgba(0, 0, 0, 0.7);
 }
 .table-action {
  top: e("calc((100% - 100px) / 2)");
  background-color: rgba(0, 0, 0, 0.7);
 }
 .fix-right {
  position: absolute;
  right: 0;
  height: 100px;
  color: #ffffff;
  width: 30px;
  display: block;
  z-index: 1005;
  writing-mode: vertical-rl;
  text-align: center;
  line-height: 28px;
  border-bottom-left-radius: 6px;
  border-top-left-radius: 6px;
  cursor: pointer;
 }
 }
</style>

Das oben Gesagte habe ich für Sie zusammengestellt.

Verwandte Artikel:

NavigatorIOS-Komponente in React Native (ausführliche Tutorialbeschreibung)

Informationen zur Verwendung der ejsExcel-Vorlage

So erstellen Sie eine Logistikkarte in D3.js (ausführliches Tutorial)

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Paging-Funktion über Tabellen- und Paginierungskomponenten in Vue2.5. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn