vue element 自己封装table

//夫组件应用

 <div>

      <Public-Table

        :tablelist="tablelist"

        @handleSizeChange="handleSizeChange"

        @handleCurrentChange="handleCurrentChange"

        @handleSelectionChange="handleSelectionChange"

        @handleoperationClick="handleoperationClick"

      ></Public-Table>

    </div>

  tablelist: {

        tablePage: true, //是否开启分页

        currentPage: 1, //默认页数

        pageSize: 10, //默认条数

        total: 1, //默认总数

        type: "index", //状态

        tableData: [], //数据

        tabletitle: [

          //表头

          {

            date: "clientid",

            title: "客户端id",

            align: "center",

            width: "200",

            render: (h, params) => {

              return h(

                "el-button",

                {

                  props: {

                    type: "text"

                  },

                  on: {

                    click: () => {

                      this.DetailsList = params.row;

                      this.Detailsstate = true;

                    }

                  }

                },

                params.row.clientid

              );

            }

          },

          {

            date: "username",

            title: "用户名",

            align: "center",

            width: "180"

          },

          {

            date: "ip_address",

            title: "IP地址",

            align: "center",

            width: "200"

          },

          {

            date: "port",

            title: "端口",

            align: "center",

            width: "160"

          },

          {

            date: "clean_start",

            title: "清除会话",

            align: "center",

            width: "160"

          },

          {

            date: "proto_ver",

            title: "协议版本",

            align: "center",

            width: "140"

          },

          {

            date: "keepalive",

            title: "心跳(秒)",

            align: "center",

            width: "140"

          },

          {

            date: "connected_at",

            title: "连接时间",

            align: "center",

            width: "180"

          }

        ],

        operation: [

          { label: "详情", size: "mini", type: "primary", value: {} },

          { label: "订阅", size: "mini", type: "primary", value: {} },

          { label: "踢除", size: "mini", type: "danger", value: {} }

        ]

      }

//子组件

 <div>

    <el-table

      :data="tableDatas"

      border

      :key="tableKey"

      style="width: 100%"

      @selection-change="handleSelectionChange"

    >

      <el-table-column :type="tabletype" align="center" label="序号" width="50" />

      <template v-for="(val,i) in tabletitles">

        <!-- <el-table-column

          :align="val.align"

          :width="val.width?val.width:'auto'"

          :prop="val.date"

          :label="val.title"

        ></el-table-column>-->

        <el-table-column

          :align="val.align"

          :width="val.width?val.width:'auto'"

          :prop="val.date"

          :label="val.title"

        >

          <template slot-scope="scope">

            <ex-slot v-if="val.render" :render="val.render" :row="scope.row" :index="scope.$index"></ex-slot>

            <span v-else>{{ scope.row[val.date] || '' }}</span>

          </template>

        </el-table-column>

      </template>

      <el-table-column

        label="操作"

        align="center"

        v-if="operations.length>0"

        width="240"

        fixed="right"

      >

        <template slot-scope="scope">

          <template v-for="val in operations">

            <el-button

              :size="val.size"

              :type="val.type"

              @click="handleClick(scope.$index, scope.row,val.label)"

            >{{val.label}}</el-button>

          </template>

        </template>

      </el-table-column>

    </el-table>

    <!--分页-->

    <el-pagination

      v-if="tablePage"

      style="margin-top: 10px"

      :current-page="currentPage"

      :page-sizes="[2,10, 20, 30, 40, 50]"

      :page-size="pageSize"

      layout="total, sizes, prev, pager, next, jumper"

      :total="total"

      @size-change="handleSizeChange"

      @current-change="handleCurrentChange"

    />

  </div>

</template>

var exSlot = {

  functional: true,

  props: {

    row: Object,

    render: Function,

    index: Number,

    column: {

      type: Object,

      default: null

    }

  },

  render: (h, data) => {

    const params = {

      row: data.props.row,

      index: data.props.index

    };

    if (data.props.column) params.column = data.props.column;

    return data.props.render(h, params);

  }

};

export default {

  components: {

    exSlot

  },

  props: {

    tablelist: Object

  },

  data() {

    return {

      tableKey: 0,

      tablePage: this.tablelist.tablePage || false,

      operations: this.tablelist.operation || [], //操作方法

      tabletype: this.tablelist.type || "index", //渲染状态

      tableDatas: this.tablelist.tableData || [], //数据

      tabletitles: this.tablelist.tabletitle || [], //表头

      currentPage: this.tablelist.currentPage || 1, //初始页

      pageSize: this.tablelist.pageSize || 10, //每页的数据

      total: this.tablelist.total || 0 //总条数

    };

  },

  created() {

    console.log("table");

  },

  computed: {},

  methods: {

    //pageSize 改变时会触发

    handleSizeChange(val) {

      this.$emit("handleSizeChange", val);

    },

    //currentPage 改变时会触发

    handleCurrentChange(val) {

      this.$emit("handleCurrentChange", val);

    },

    //多选框回调

    handleSelectionChange(selection) {

      // console.log(selection);

      this.$emit("handleSelectionChange", selection);

    },

    //操作返回

    handleClick(index, row, label) {

      this.$emit("handleoperationClick", { index, row, label });

    }

  },

  watch: {

    tablelist: {

      //监听传值数据变化更新视图

      deep: true, //深度监听设置为 true

      handler: function(newV, oldV) {

        this.tableDatas = newV.tableData;

        this.total = newV.total;

      }

    }

  }

//有待优化,请各位看官提出宝贵意见,积极采纳

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容