问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

vue element 自己封装table

发布网友 发布时间:2022-12-27 09:12

我来回答

1个回答

热心网友 时间:2023-07-16 20:25

//夫组件应用

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

      }

    }

  }

//有待优化,请各位看官提出宝贵意见,积极采纳
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
莲花冬天发芽好吗 过冬荷花什么时候发芽 一个手机号怎样登陆两个孩子的长沙市中小学生人人通云平台 人人通怎么进入学校 人人通电脑版学生怎样登录 名侦探柯南真人版3为什么要换人? 真人版柯南,你最喜欢小栗旬还是沟端淳平? 央企中国稀土集团落户江西,衷心希望江西摆脱“环江西经济带”地位_百度... 来天津的央企有哪些 东丽区的央企有哪些 太宰治是哪个动漫的人物? vue--封装后台管理项目通用组件 erp面试自我介绍 日式极简风格案例 融入现代生活 长期应付款在资产负债表中如何填列 长期应付款科目核算的内容 长期应付款包括什么 给简历添油加醋的技巧 prepositional verb 和 phrasal verb 有甚么分别? (10分) 同一句子可以有两个preposition吗? 通达信副图在75位置写字 有个电影里的名字叫子铭和花飘雨是什么电影 跪求各位大神昌辉叔叔讲故事装在口袋里的爸爸隐身小侠给我分享一个免费百度云资源链接 《装在口袋里的爸爸&#x2022;隐身小侠》 健身教练的考取方法。越详细越好。可以加分。 研究生网上确认审核不通过怎么办 公积金提取为什么初审通过,审批不通过? 谷歌的新标签页怎么自定义啊 为什么我的chrome新标签页不显示自定义按钮? 敦矣,煌矣。噫吁嚱,危乎高哉是什么意思? 挖荸荠是什么刑 12岁的儿子胆子太小了如何解决 实缴资本和认缴资本区别 简单的俄语面试自我介绍带翻译 cad中坐标标注怎么同时标出xy,cad里如何同时标注x,y坐标? 长期投资无法收回账务要怎么处理 长期投资无法收回账务处理怎么做 细流 &#160;&#160;[xì liú]什么意思?近义词和反义词是什么?英文翻译是什么? 口袋妖怪绿宝石宠物推荐? 如何在电脑上查看密码 怎么看电脑上输入过的的密码记录? 华硕笔记本更新后之前保存的账号密码在哪里 告密者最后那个将军是谁 怎么求未分配利润 用无妄之灾造句(大约30个左右) 用无妄之祸造句(大约30个左右) 用妄念造句(大约30个左右) 用妄加造句(大约30个左右) 清蒸河鳗的做法 清蒸河鳗的做法步骤 钉钉如何修改自己的群昵称