vue element 自己封装table

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue element 自己封装table相关的知识,希望对你有一定的参考价值。

参考技术A //夫组件应用

 <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;

      

    

  

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

以上是关于vue element 自己封装table的主要内容,如果未能解决你的问题,请参考以下文章

封装一个用vue+element-ui实现的远程搜索组件(vue-cli项目中)

vue+element DatePicker日期选择器封装(可自定义快捷选择时间)

vue+Ts+element组件封装

vue +element 封装一个选人弹窗

封装element中的table表格,实现可控并动态渲染(动态表头)

vue_element_admain中自动注册全局组件