elementUI table组件

vue 二次封装ElementUI table表格组件 el-table表格封装 formatter:这个属性在列中如果使用插槽就会失效,所以我设置了两个列,如果有render方法说明单元格要内嵌代码,就是用特殊列,反之就是正常列,所以formatter和render不能同时使用 ... 阅读详情
<template>
  <div class="w-data-table" v-loading="tableLoading">
    <div class="dt-search" v-if="$slots.search">
      <el-form
        ref="searchform"
        size="mini"
        class="dt-search-form-inline"
        :inline="true"
        :model="searchParams"
        @submit.native.prevent="search({ _fromBar: true, _begin: 0 })"
      >
        <slot name="search" />
        <button type="submit" style="display: none;"></button>
      </el-form>
    </div>
    <div
      class="dt-toolbar"
      v-if="$slots.toolbar || $slots.search || $slots['toolbar-right']"
    >
      <slot name="toolbar" />
      <el-button
        v-if="exportable"
        size="mini"
        type="primary"
        icon="el-icon-download"
        plain
        @click="doExport()"
      >
        导出
      </el-button>
      <template v-if="$slots.search">
        <el-divider
          v-if="($slots.toolbar || exportable) && (showSearch || showReset)"
          direction="vertical"
        ></el-divider>
        <el-button
          type="primary"
          size="mini"
          icon="el-icon-search"
          plain
          v-if="showSearch"
          class="search"
          @click="search({ _fromBar: true, _begin: 0 })"
        >
          查询
        </el-button>
        <el-button
          type="default"
          size="mini"
          icon="el-icon-refresh-left"
          plain
          v-if="showReset"
          class="reset"
          @click="clearSearch()"
        >
          重置
        </el-button>
      </template>
      <template v-if="$slots['toolbar-right']">
        <div class="dt-toolbar_right">
          <slot name="toolbar-right" />
        </div>
      </template>
    </div>
    <el-table
      ref="table"
      size="medium"
      style="width: 100%"
      class="dt-table"
      header-cell-class-name="header-compact-cell"
      cell-class-name="compact-cell"
      :highlight-current-row="highlightCurrentRow"
      :border="showBorder"
      :data="data"
      :height="returnHeight || tableHeight"
      :row-key="rowKey"
      :default-expand-all="defaultExpandAll"
      :tree-props="treeProps"
      @row-click="clickRow"
      @select="onTabelSelect"
      @select-all="onTabelSelectAll"
      :load="load"
      lazy
    >
      <el-table-column v-if="showSelect" type="selection" width="55">
      </el-table-column>
      <el-table-column
        v-if="showIndex"
        type="index"
        width="50"
      ></el-table-column>
      <template
        v-for="({ hide, render, tag, dict, comp, cols, ...attrs },
        index) in column"
      >
        <template v-if="!hide">
          <el-table-column
            v-if="attrs.type"
            v-bind="{ ...columnAttrs, ...attrs }"
            :key="index"
            :selectable="checkboxT"
          ></el-table-column>
          <el-table-column
            v-else-if="render"
            v-bind="{ ...columnAttrs, ...attrs }"
            :key="index"
          >
            <template slot-scope="scope">
              <w-render :render="render" :params="scope" :data="data" />
            </template>
          </el-table-column>
          <el-table-column
            v-else-if="cols"
            v-bind="{ ...columnAttrs, ...attrs }"
            :key="index"
          >
            <template v-for="(cattrs, index) in cols">
              <el-table-column
                v-bind="{ ...columnAttrs, ...cattrs }"
                :key="index"
              ></el-table-column>
            </template>
          </el-table-column>
          <el-table-column
            v-else
            v-bind="{ ...columnAttrs, ...attrs }"
            :key="index"
          >
            <template slot-scope="scope">
              <template v-if="tag">
                <template v-if="tag.dict">
                  <el-tag size="mini" :type="tag.type(scope)">
                    <!-- {{scope.row[attrs.prop]}} -->
                    {{
                      scope.row[attrs.prop]
                        | fmtDict(dicts[tag.dict.code || attrs.prop])
                    }}
                  </el-tag>
                </template>
                <template v-else>
                  <el-tag size="mini" :type="tag.type(scope)">
                    {{ tag.text(scope) }}
                  </el-tag>
                </template>
              </template>
              <template v-else-if="comp">
                <component
                  :is="comp.name"
                  v-bind="{ ...comp.attr }"
                  v-on="{ ...comp.on(scope) }"
                >
                  <template v-if="comp.text">{{ comp.text }}</template>
                </component>
              </template>
              <template v-else-if="dict">
                {{
                  scope.row[dict.prop || attrs.prop]
                    | fmtDict(dicts[dict.code || dict.prop])
                }}
              </template>
              <template v-else>
                {{ scope.row[attrs.prop] }}
              </template>
            </template>
          </el-table-column>
        </template>
      </template>
      <el-table-column :min-width="1"></el-table-column>
      <el-table-column v-if="$scopedSlots.action" :width="1">
        <template v-slot:default="scope">
          <div class="float-action-wrp" :style="actionStyle">
            <div class="float-action">
              <slot name="action" v-bind="scope" />
            </div>
          </div>
        </template>
      </el-table-column>
    </el-table>
    <el-pagination
      v-if="pageable"
      small
      background
      layout="sizes, total, prev, pager, next "
      class="dt-pager"
      :current-page="page.current"
      :total="page.total"
      :page-sizes="[10, 50, 100]"
      :page-size="page.size"
      @current-change="onCurrentChange"
      @size-change="onSizeChange"
    >
    </el-pagination>
  </div>
</template>

<script>
import _ from "lodash";
import {
  Table,
  TableColumn,
  Pagination,
  Link,
  Button,
  Tag,
  Form,
  FormItem,
  Row,
  Col,
  Divider,
} from "element-ui";
//分页信息
//PAGE_BEGIN = 0
//PAGE_SIZE = 50
import { PAGE_BEGIN, PAGE_SIZE } from "@/constants/common";

export default {
  name: "w-data-table",
  components: {
    [Table.name]: Table,
    [TableColumn.name]: TableColumn,
    [Pagination.name]: Pagination,
    [Link.name]: Link,
    [Button.name]: Button,
    [Tag.name]: Tag,
    [Form.name]: Form,
    [FormItem.name]: FormItem,
    [Row.name]: Row,
    [Col.name]: Col,
    [Divider.name]: Divider,
  },
  props: {
    loading: Boolean,
    // 接口
    serverId: String,
    //接口返回值的key
    resultKey: {
      type: String,
      default: "ROWS",
    },
    afterSearch: Function,
    returnSearch: {
      type: Boolean,
      default: false,
    },
    //搜索参数
    searchParams: {
      type: Object,
      default: () => ({}),
    },
    dicts: Object,
    //列名
    column: Array,
    pageable: {
      type: Boolean,
      default: true,
    },
    treeProps: {
      type: Object,
      default: () => ({}),
    },
    exportable: Boolean,
    highlightCurrentRow: {
      type: Boolean,
      default: false,
    },
    resetSearchType: {
      type: String,
      default: "search",
      validator: (value) => {
        return _.values(["search", "cleandata"]).indexOf(value) > -1;
      },
    },
    resetSearchAfter: Function,
    changeSearchRefs: {
      type: Array,
      default: () => [],
    },
    showBorder: {
      type: Boolean,
      default: false,
    },
    defaultExpandAll: {
      type: Boolean,
      default: false,
    },
    rowKey: String,
    showSelect: {
      type: Boolean,
      default: false,
    },
    returnHeight: String,
    resetAble: {
      type: Boolean,
      default: true,
    },
    searchAble: {
      type: Boolean,
      default: true,
    },
    load: Function,
    clearForm: Function,
    page: {
      type: Object,
      default: () => ({
        total: 0,
        current: PAGE_BEGIN + 1,
        size: PAGE_SIZE,
      }),
    },
    showIndex: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      tableLoading: this.loading,
      tableHeight: null,
      data: [],
      columnAttrs: {
        align: "left",
        "show-overflow-tooltip": true,
      },
      exportFields: "",
      actionStyle: {
        right: 0,
      },
      selecte: {},
      showReset: this.resetAble,
      showSearch: this.searchAble,
    };
  },
  watch: {
    loading() {
      this.tableLoading = !!this.loading;
    },
    searchAble() {
      this.showSearch = !!this.searchAble;
    },
    resetAble() {
      this.showReset = !!this.resetAble;
    },
  },
  mounted() {
    this.$bus.$on("page.init", ({ height }) => {
      this.calcHeight(height);
    });
    this.$bus.$on("page.resize", ({ height }) => {
      this.calcHeight(height);
    });
    this.$nextTick(() => {
      // const clientWidth = this.$viewport.width();
      const $wrp = this.$el.querySelector(".el-table__body-wrapper");
      const { scrollWidth } = $wrp;
      const rightWidth = scrollWidth - $wrp.parentElement.scrollWidth;
      this.actionStyle.right = `${rightWidth}px`;
      $wrp.addEventListener(
        "scroll",
        _.debounce((e) => {
          const r = rightWidth - e.target.scrollLeft + 20;
          this.actionStyle.right = `${r ? r : 0}px`;
        }, 300)
      );
    });
    // console.log(this.$slots.search);
    // _.forEach(this.$slots.search, s => {
    //   console.log(s);
    //   _.forEach(s.context.$refs, (r, k) => {
    //     if (_.indexOf(this.changeSearchRefs, k) > -1) {
    //       console.log(k);
    //     }
    //   });
    // });
  },
  methods: {
    search(params = {}, fn = (rows) => rows) {
      const { _fromBar, _begin, noErrorMsg, ...otherParams } = params;
      if (_begin >= 0) {
        this.page.current = _begin + 1;
      }
      const { current, size } = this.page;
      this.$emit("BeforesearchParams");
      const defaultParams = {
        BEGIN: (current - 1) * size,
        COUNT: size,
        ...this.searchParams,
        ...otherParams,
      };
      this.tableLoading = true;
      return axios
        .post(this.serverId, defaultParams)
        .then((res) => {
          this.$emit("searchBefore", res[this.resultKey]);
          if (res[this.resultKey]) {
            this.data = fn(res[this.resultKey]);
            this.$emit("searchAfter", res);
          } else {
            this.data = [];
          }
          if (this.pageable) {
            this.page.total = res.PAGE ? res.PAGE.TOTAL : res.page.TOTAL;
          }
          if (this.exportable) {
            if (res.EXCEL_TITLE) {
              this.exportFields = res.EXCEL_TITLE;
            } else {
              try {
                const headJson = JSON.parse(res.HEAD_JSON);
                if (headJson.EXCEL_TITLE) {
                  this.exportFields = headJson.EXCEL_TITLE;
                }
                // eslint-disable-next-line
              } catch (err) {}
            }
          }
          if (this.returnSearch) {
            this.afterSearch(res);
          }
          return res[this.resultKey];
        })
        .catch((err) => {
          if (!noErrorMsg) {
            this.$message.error(err.MESSAGE || "查询出错");
          }
          // this.data = [];
          this.data.length = 0;
          if (!_fromBar) {
            return Promise.reject({});
          }
        })
        .finally(() => {
          setTimeout(() => {
            this.tableLoading = false;
          }, 500);
        });
    },
    getData() {
      return this.data;
    },
    getSelectedRows() {
      return this.$refs.table.selection;
    },
    clearSelection() {
      this.$refs.table.clearSelection();
    },
    getClickRows() {
      return this.selecte;
    },
    clickRow(row) {
      this.selecte = row;
      this.$emit("getClickRow", row);
    },
    onTabelSelect(rows, row) {
      this.$emit("tabelSelect", rows, row);
    },
    onTabelSelectAll(rows) {
      this.$emit("tabelSelectAll", rows);
    },
    checkboxT(row) {
      if (row.DISABLED) {
        return 0;
      } else {
        return 1;
      }
    },
    clearSearch() {
      this.$emit("reset");
      if (this.searchParams.INSTID) {
        this.searchParams.INSTID = "";
      }
      this.$refs.searchform.resetFields();
      if (_.isFunction(this.resetSearchBefore)) {
        this.resetSearchBefore();
      }
      if (_.isFunction(this.clearForm)) {
        this.clearForm();
      }
      if (this.resetSearchType === "search") {
        this.search({ _fromBar: true, _begin: 0 });
      } else if (this.resetSearchType === "cleandata") {
        // this.data = [];
        this.data.length = 0;
      }
      this.$emit("resetAfter");
    },
    doExport() {
      if (!(this.data && this.data.length > 0)) {
        return this.$message.error("导出列表不能为空");
      }
      this.$emit("exportBefore");
      download.excel(this.serverId, this.searchParams, this.exportFields);
    },
    addRow(index) {
      if (index != undefined) {
        if (JSON.stringify(this.data[index]) == "{}") {
          return;
        }
        this.data.splice(index + 1, 0, {});
      } else {
        this.data.splice(index + 1, 0, {});
      }
    },
    removeRow(index) {
      if (this.data.length == 1) {
        this.data.splice(index, 1);
        this.addRow();
      } else {
        this.data.splice(index, 1);
      }
    },
    onCurrentChange(current) {
      this.$emit("current-change", current);
      this.page.current = current;
      this.search().then((list) => {
        this.$emit("current-change-after", list);
      });
    },
    onSizeChange(size) {
      this.$emit("size-change", size);
      this.page.size = size;
      this.search();
    },
    calcHeight(height) {
      const $search = this.$el.querySelector(".dt-search");
      const $toolbar = this.$el.querySelector(".dt-toolbar");
      const $pager = this.$el.querySelector(".dt-pager");
      const searchH = $search ? $search.offsetHeight : 0;
      const toolbarH = $toolbar ? $toolbar.offsetHeight : 0;
      const pagerH = $pager ? $pager.offsetHeight : 0;
      this.tableHeight = `${height - searchH - toolbarH - pagerH - 10}px`;
    },
  },
};
</script>

<style lang="less">
.w-data-table {
  .dt-search {
    box-sizing: border-box;
    padding: 8px 0 5px;
    // border-bottom: 1px solid #f2f6fc;
    border-bottom: 1px solid #ebeef5;
    .dt-search-form-inline {
      .el-form-item {
        margin-bottom: 5px;
        &:last-child {
          margin-right: 0;
        }
        .el-input.el-input--mini {
          width: 150px;
        }
      }
    }
  }
  .dt-toolbar {
    box-sizing: border-box;
    padding: 8px 0;
    border-bottom: 1px solid #ebeef5;
    &::after {
      clear: both;
    }
    .el-divider {
      margin: 0 15px;
    }
    .w-upload {
      & + .el-button {
        margin-left: 10px;
      }
    }
    .dt-toolbar_right {
      float: right;
      line-height: 28px;
      font-size: 13px;
    }
    .el-button {
      min-width: 100px;
    }
  }
  .el-table {
    // &.el-table--group {
    //   border: 0;
    //   &::after {
    //     display: none;
    //   }
    // }
    .header-compact-cell {
      padding: 6px 0;
      color: #333;
      font-size: 14px;
    }
    .compact-cell {
      padding: 6px 0;
      color: #333;
      font-size: 13px;
      a {
        color: @primary;
        text-decoration: none;
        &:hover {
          border-bottom: 1px solid @primary;
        }
      }
      .el-link--inner {
        font-size: 13px;
      }
    }
    .el-table__row {
      .float-action-wrp {
        display: none;
        position: absolute;
        right: 0;
        top: 0;
        bottom: 0;
        z-index: 99;
        transition: right, 0.2s;
        .float-action {
          display: block;
          padding: 0 6px 5px 6px;
          border-left: 1px solid #ebeef5;
          border-bottom: 1px solid #ebeef5;
          border-radius: 0 0 0 2px;
          white-space: nowrap;
          position: absolute;
          right: 0;
          bottom: -34px;
          background-color: #fff;
          .el-button + .el-button {
            margin-left: 5px;
          }
        }
      }
      &:hover td {
        // border-bottom: 1px solid @primary;
        // border-top: 1px solid @primary;
        .float-action-wrp {
          display: block;
          .float-action {
            background-color: #f5f7fa;
            border-left: 1px solid #ebeef5;
            border-bottom: 1px solid #ebeef5;
          }
        }
      }
      &:last-child:not(:first-child) td {
        .float-action-wrp {
          .float-action {
            padding: 5px 6px 0 6px;
            top: -34px;
            bottom: auto;
            border-top: 1px solid #ebeef5;
            border-bottom: 0;
            border-radius: 2px 0 0 0;
          }
        }
      }
    }
  }
  .dt-pager {
    box-sizing: border-box;
    padding: 5px 0 0 0;
    // text-align: center;
    text-align: right;
  }
}
</style>

我们介绍一下用法
<template>
  <w-page>
    <w-data-table
      ref="datatable"
      :column="tableColumn"
      :loading="loading"
      :server-id="serverId"
      :dicts="dicts"
      :search-params="searchParams"
      :result-key="'ROWS'"
      :exportable="true"
    >
      <template slot="search">
        <el-form-item label="中介人代码" prop="COMPANYCODE" label-width="130px">
          <el-input
            :disabled="COMPANYTYPE == '02' && $route.query.type == 'company'"
            v-model="searchParams.COMPANYCODE"
            placeholder="请填写中介人代码"
          ></el-input>
        </el-form-item>
        <el-form-item label="中介人名称" prop="COMPANYNAME" label-width="130px">
          <el-tooltip
            effect="dark"
            :content="searchParams.COMPANYNAME"
            :disabled="!searchParams.COMPANYNAME"
          >
            <el-input
              :disabled="COMPANYTYPE == '02' && $route.query.type == 'company'"
              v-model="searchParams.COMPANYNAME"
              placeholder="请填写中介人名称"
            ></el-input>
          </el-tooltip>
        </el-form-item>
        <el-form-item label="团队代码" prop="SALETEAMCODE" label-width="130px">
          <el-input
            v-model="searchParams.SALETEAMCODE"
            placeholder="请填写团队代码"
          ></el-input>
        </el-form-item>
        <el-form-item label="团队名称" prop="SALETEAMNAME" label-width="130px">
          <el-input
            v-model="searchParams.SALETEAMNAME"
            placeholder="请填写团队名称"
          ></el-input>
        </el-form-item>
        <el-form-item
          label="团队生效日期起期"
          label-width="130px"
          prop="EFFEDATEBEGIN"
        >
          <el-date-picker
            v-model="searchParams.EFFEDATEBEGIN"
            value-format="yyyy-MM-dd"
            placeholder="请选择团队生效日期起期"
            type="date"
            @change="changeTime"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item
          label="团队生效日期止期"
          label-width="130px"
          prop="EFFEDATEEND"
        >
          <el-date-picker
            v-model="searchParams.EFFEDATEEND"
            value-format="yyyy-MM-dd"
            placeholder="请选择团队生效日期止期"
            type="date"
            @change="changeTime"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item label="状态" prop="SALETEAMSTATUS" label-width="130px">
          <el-select v-model="searchParams.SALETEAMSTATUS" placeholder="请选择">
            <el-option
              v-for="(item, index) in dicts.TEAMSTATUS"
              :key="index"
              :label="item.NODEDESC"
              :value="item.NODECODE"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item prop="INST_ID"></el-form-item>
      </template>
      <template class="centerBtn" slot="toolbar">
        <el-button
          size="mini"
          type="primary"
          >新增
        </el-button>
      </template>
      <template v-slot:action="{ row }">
        <el-button
          plain
          size="mini"
          type="primary"
        >
          团队成员
        </el-button>
      </template>
    </w-data-table>
  </w-page>
</template>
data(){
return{
//搜索参数
searchParams: {
        INST_CODE: "",
        INST_NAME: "",
        SALETEAMCODE: "",
        SALETEAMNAME: "",
        START_TIME: "",
        END_TIME: "",
        EFFEDATEBEGIN: "",
        EFFEDATEEND: "",
        SUPERSALETEAMCODE: "",
        COMPANYCODE: "",
        COMPANYNAME: "",
        SALETEAMSTATUS: "",
        CHANNELTYPE: "",
      },
      //列表参数
      tableColumn: [
        {
          type: "index",
          label: "序号",
          align: "left",
          width: "50",
        },
        { prop: "COMPANYNAME", label: "中介人名称", width: "240" },
        {
          prop: "INST_CODE",
          label: "归属机构代码",
          width: "120",
        },
        {
          prop: "INST_NAME",
          label: "归属机构名称",
          width: "380",
          align: "center",
        },
        {
          prop: "SALETEAMCODE",
          label: "团队代码",
          width: "160px",
        },
        {
          prop: "SALETEAMNAME",
          label: "团队名称",
          width: "420",
          align: "center",
        },
        { prop: "EMPINNAME", label: "主管", width: "120" },
        {
          prop: "SUPERSALETEAMNAME",
          label: "归属团队名称",
          width: "420",
          align: "center",
        },
        {
          prop: "EFFEDATE",
          label: "生效日期",
          width: "140",
        },
        {
          prop: "SALETEAMSTATUS",
          label: "状态",
          width: "120",
        },
      ],
}
}
elementUI之table组件封装 阅读详情

相关推荐

【STM32开源实战】基于STM32的智能输液监控系统设计与实现

本文详细介绍了基于STM32F103C8T6主控芯片的智能输液监控系统设计与实现。该系统通过光学液位传感器、温度传感器和红外滴速检测模块实时监测输液状态,利用步进电机自动调节滴速,并通过蓝牙实现数据远程传输,为医院提供了一套低成本、高可靠性的智能输液解决方案。

h6i7j8的博客 761

基于vue和element-ui的表格组件,主推数据渲染,支持内容和方法灵活绑定,提供动态具名插槽自定义内容

基于vue和element-ui的表格组件,主推数据渲染,支持内容和方法灵活绑定,提供动态具名插槽自定义内容

kakashi_chen的博客 2854

onnxruntime模型部署(一)-pythonAPI

简单模型的onnx模型的导出,以及onnxruntime推理引擎的模型部署

qq_45983373的博客 4059

基于elementUI 的custom-table 组件简单封装

【代码】基于elementUI 的custom-table 组件简单封装。

xk_initial的博客 847

若依(RuoYi)框架从零到部署:Spring Boot+Vue权限系统完整配置指南

在Java企业级应用开发中,Spring Boot作为构建微服务和单体应用的基石,极大地简化了项目初始化和配置流程。其核心原理在于通过自动配置和起步依赖,快速整合数据访问、安全认证、缓存等常用模块,显著提升开发效率。这一技术价值在需要快速构建后台管理系统的场景中尤为突出,例如权限管理、用户角色分配等通用需求。若依(RuoYi)框架正是基于Spring Boot和Vue.js的优秀实践,它封装了RBAC权限模型、代码生成器等高频功能,提供了开箱即用的解决方案。本文聚焦于若依框架的【环境配置】与【项目部署】,通

weixin_33984032的博客 455

红外通信不止遥控器:手把手教你用2ASK调制实现语音+温度数据同传

本文详细介绍了如何利用2ASK调制技术实现红外通信系统,同时传输语音和温度数据。通过STM32F103C8T6微控制器和DS18B20温度传感器的硬件设计,结合2ASK调制原理,展示了系统的完整实现方案。文章还提供了调试优化建议,适合电子爱好者和通信工程学生实践学习。

weixin_42531588的博客 388

elementui-table列隐藏展示:支持全选反选重置,以及列字段值错位问题解决

elementui-table控制列的隐藏和展示,且支持全选、反选、重置功能,以及列字段值错位问题解决。

陌夏线的前端小窝 3126

易智联LM401模块学习(一)——初识Lora

Lora

weixin_46046597的博客 1054

封装element-ui的table组件(带分页)

el-table的一个简单封装

唐唐唐行的博客 3181

基于SAHI算法优化YOLOv8的小目标检测性能研究

SAHI(SliceAwareHyperInference)是一种推理优化算法,通过将大图切片为小块并分别推理的方式,实现更精细的小目标检测。提升小目标检测精度:切片后的小目标在每个小块中占比更大,模型能够更好地聚焦。兼容性强:可直接集成到现有目标检测框架中(如YOLO系列、Detectron2等)。支持大分辨率图片和视频推理:减少硬件对大图推理的限制。本文详细探讨了如何通过SAHI(切片辅助超推理算法)结合YOLOv8模型,有效提升小目标检测性能,尤其是在高分辨率图片和视频场景中表现优异。

博客 2371

AUTOSAR进阶图解==>AUTOSAR_SWS_COM

AUTOSAR COM模块是AUTOSAR通信堆栈的核心组件,提供信号导向的通信服务。该模块位于通信服务层,连接RTE与PDU Router,主要功能包括信号封装/提取、传输模式管理、信号路由、超时监控和字节序转换等。COM模块架构分为应用层、通信服务层和通信抽象层,包含信号管理、I-PDU处理、传输模式管理等组件。其配置结构包括顶层容器、I-PDU组、I-PDU和信号等多层次配置对象,支持丰富的参数设置。模块采用严格的状态管理机制,包括模块状态和I-PDU组状态转换,确保通信可靠性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1243

管理后台界面 详细分析(内含代码 |【前端】)

最近在做的一个后台管理 因为关于隐私原因 只方便展示个别页面代码 注意是前端代码 我把项目地址放在最后了 如有需要可自取学习

摸鱼大王的博客 4241

电磁场仿真软件:COMSOL Multiphysics_(17).时域与频域分析

时域和频域分析是电磁场仿真中非常重要的两种方法,每种方法都有其独特的应用场景和优势。时域分析适用于瞬态响应和宽带信号的分析,而频域分析则适用于稳态响应和窄带信号的分析。在COMSOL Multiphysics中,通过合理设置物理场接口、材料属性、边界条件、网格划分和求解器,可以高效地进行这两种分析,并通过傅里叶变换将时域结果转换为频域结果,进一步拓展仿真应用的范围。合理的性能优化措施,如网格划分优化和并行计算,可以显著提高仿真的效率和准确性。

kkchenjj的博客 1974

elementui table组件的使用

elementui table组件的使用 基于elementUI组件对table对使用。 表格的使用 绑定数据tabledata <el-table ref="multipleTable" border :data="tableData" tooltip-effect="dark" height="100%" ...

caiNiao_j的博客 4435

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

vue中elementUI table组件合并单元格教程

vue中elementUI table组件合并单元格教程 一、先看看我这边合并后的效果图 二、合并思路或原理大致讲解 1.首先要去遍历表格数组,计算出每行需要合并的数量(遍历数组去记录合并规则) 2.通过给table传入span-method方法可以实现合并行或列 (方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。...

数组嵌套对象数组遍历方法 6571

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

elementui的table组件如何显示图片

ElementUI的Table组件中显示图片,可以通过自定义列模板的方式来实现

phplife的技术专栏,专注于php,golang,ai等技术应用 7062

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

vue3 elementUi table自由渲染组件

elementui中的table组件,表格中想要自由地渲染内容,是一种比较麻烦的事情,比如你表格中想要某一列插入一个button按钮,是不是要用插槽,那下一次某一列插入一个图片,又得新开一种插槽或者类别。那么,有没有什么方法,能够通过配置,直接配置一个组件的方式,让表格的那一列直接渲染对应的组件。elementui table中并不提供这样的配置。所以需要开发人员自己封装。

秋来九月八 906

vue+elementUI自定义通用table组件

vue+elementUI自定义通用table组件 自定义通用table组件,带分页,后端排序,路由带参数跳转,多选框,字段格式化 1.tableList组件 <!-- 费用报销编辑弹框 --> <template> <div class="table-temp"> <el-table :data="tableData" border size="mini"

shuaigg001的博客 2183

elementUI table组件渲染问题

elementUI table组件渲染问题 1、问题: 问题描述:页面内,使用选项卡,进行内容显示的切换。切换后,原本高度合适的表格出现白边,以及滚动条 检查Dom会发现,el-table组件内,发现了一个类名为 is-scrolling-none 的固定行内样式的高度的div,导致高度显示错误: <div class="el-table__body-wrapper is-scrolling-none" style="height: 510px;"> ------ </div&

不知名的博客 4774

ElementUI的Table组件中的renderHeader方法研究

项目使用ElementUI,挺好用的,页面中有些地方的帮助提示通过使用组件Tooltip和el-icon-question来展示,代码如下: <div class="title">本月累计收益 <el-tooltip class="item" content="截止至昨日本月累计收益" placement="top"> <span class="el-ic...

qq_39505012的博客 6148

elementui table 固定列_elementUI Table组件 如何设置合并列

效果图:image.png代码如下::data="tableData"style="width:200px":border="true":span-method="objectSpanMethod">prop="month"label="月份">prop="year"label="年份">export default {data() {return {tableData: [{"...

weixin_35039377的博客 438

elementui展示多张图片_elementUi中table组件的遍历展示

一:elementui的table组件一般我们是直接将label固定写死的,今天遇到了一个根据返回值动态渲染label,对table组件做template遍历展示可实现。html部分fixed="right"label="操作"width="100">查看js部分colsFont:[{label:"A",props:"a_value",flag:false},{label:"B",props...

weixin_39540271的博客 1386

elementUi——table组件与table的嵌套——技能提升

今天写前台页面时,遇到一个需求,效果图如下: 使用的是elementUi中的el-table表格组件,需要在特定的行下面添加一行查看替代产品,点击查看替代产品后,可以通过调接口的方式获取替代产品,然后渲染到页面上。此时可以点击收起替代产品,进行替代产品的隐藏。 1.elementUi官网上关于el-table的部分有个展开行的功能 此时可以通过这个展开行的功能来渲染查看替代产品的部分: <el-table-column type="expand" width="1"> <temp

yehaocheng520的博客 4889

修改elementUI中table组件样式和progress样式

UI给的设计图,要求黑色背景的table和矩形进度条,首先考虑的是切换elementUI的主题,但是这个一切换就是全局切换,而需求是只有一个页面需要用到这种黑色主题,所以采用最粗暴的方法,直接修改elementUI中table组件和progress组件的样式 <style lang="less"> //table样式 .el-table th.is-leaf, ....

ju__ju的博客 3577

ElementUI table组件,表格组件,单击单元格可编辑逻辑

ElementUI table组件,表格组件,单击单元格可编辑逻辑 1、表格部分 <el-table :data="seatDataFilter" @cell-click="changeSort" > <template slot-scope="scope"> <el-input v-model="changeSortVal"...

小糖穿越火线 5290

elementui中el-table表格封装成组件

子组件表格dialog封装结构如图: <el-dialog :title="propsSelectData.title" :visible.sync="propsSelectData.visibleMultiSelectDialog" width="40%" :showClose="false" :modal='false' :close-on-click-modal

L_WalkingPig的博客 1267
上一篇: antd + vue3实现tree树增加按钮
下一篇: vue3+echarts绘制中国地图
lbchenxy
博客等级 码龄9年 29粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lbchenxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值