记录vue开发实例

news2024/11/27 17:54:58

封装的表格组件

<template>
  <div>
    <div style="width: 100%" v-if="showList">
      <el-table v-loading.lock="loading" :data="dataList"
                :header-cell-style="{background: '#F2FCFE',fontSize: '14px',color: '#50606D'}"
                :row-style="{ height: '80px' }" class="menu_table"
                height="550">
        <el-table-column label="序号" type="index" width="80"></el-table-column>
        <el-table-column width="1"></el-table-column>
        <li v-for="(item,index) in settingOpts" :key="index">
          <el-table-column :key="Math.random()" :width="item.width" :fixed="item.fixed" :label="item.label">
            <template slot-scope="scope">
              <span v-if="item.isDisplay && item.isDisplay === true">
                {{
                  (scope.row[item.id] && scope.row[item.id] != null && scope.row[item.id] != "") ? scope.row[item.id] : "--"
                }}
              </span>
              <span v-if="item.isNeedMethod && item.isNeedMethod === true">
                {{ $parent.findMethod(item.methodName, scope.row[item.id]) }}
              </span>
              <span v-if="item.isStatus && item.isStatus === true">
                {{ $parent.findMethod(item.statusMethodName,scope.row[item.id]) }}
              </span>
              <span v-if="item.isSpecialStatus && item.isSpecialStatus === true" :class="$parent.findMethod(item.specialClass,scope.row)">
                {{ $parent.findMethod(item.specialMethod,scope.row) }}
              </span>
              <span v-if="item.isNeedBack && item.isNeedBack === true" :class="$parent.findMethod(item.classMethod,scope.row)">
                {{ scope.row[item.displayName] }}
              </span>
              <div v-if="item.isSwitch && item.isSwitch === true">
                <el-switch :value="scope.row[item.id].val" @input="$parent.findMethod(item.switchInfo.switchMethod,scope.row)" :active-value="item.switchInfo.activeVal" :inactive-value="item.switchInfo.inactiveVal" :active-color="item.switchInfo.activeColor" :inactive-color="item.switchInfo.inactiveColor">
                </el-switch>
              </div>
              <div v-if="item.isImg && item.isImg === true">
                <p v-if="(!scope.row[item.id] || scope.row[item.id] == null || scope.row[item.id].length== '')">暂无人脸</p>
                <el-popover v-else aria-placeholder="top-start" trigger="hover">
                  <div class="row_reserve">
                    <img class="big-mig" :src="scope.row[item.id]">
                  </div>
                  <div slot="reference">
                    <img style="width: 50px;height: 50px;" :src="scope.row[item.id]">
                  </div>
                </el-popover>
              </div>
              <div v-if="item.isOperation && item.isOperation === true" class="flex jc-sa">
                <div v-for="(child,index) in item.operationOpts" :key="index" v-if="showOperation(child,scope)" style="color: #0080F7; cursor: pointer">
                  <span @click="$parent.findMethod(child.method,scope.row)">
                    {{ child.isNeedSpecial && child.isNeedSpecial === true ? $parent.findMethod(child.specialDisplay,scope.row) : child.name}}
                  </span>
                </div>
              </div>
            </template>
          </el-table-column>
        </li>
        <template slot="empty">
          <div class="aic mt-20 mb-20">
            <img src="@/assets/empty.png" style="width: 45px; height: 36px" alt="" />
            <p style="margin: 0;font-size: 14px;height: 16px;line-height: 16px;color: #aba9bb;">暂无数据</p>
          </div>
        </template>
      </el-table>
    </div>
  </div>
</template>

      <script>
      /*

       项目列表参数属性详解

      * id String 用于关联props的属性名称
      * label String table中展示的列名
      * fixed Boolean/String 是否固定列,true默认左固定,可接收left或right
      * isDisplay Boolean 该属性是否可以直接用于展示
      * isNeedMethod Boolean 该属性是否需要经过自定义加工
      * methodName String/Object 自定义加工方法,若isNeedMethod为true,则须提供方法名称,不需要就默认null。
      * isStatus Boolean 该属性是否为状态值
      * statusMethodName String 目前状态的返回值在各列表中不统一,情况多样,所以单独提供一个加工方法。
      * isSpecialStatus Boolean 该状态是否需要特殊展示
      * specialClass String 特殊展示时的样式
      * specialMethod String 特殊展示时的方法(有些可能需要特殊处理)
      * isSwitch Boolean 是否为Switch开关类型
      * switchInfo Object switch开关需要用到的信息(激活值、颜色等),可参考客户(customer)模块
        Eg:switchInfo: {
            activeVal: "0",
            inactiveVal: "1",
            activeColor: "#13ce66",
            inactiveColor: "#DCDFE6",
            switchMethod: "updateCustomerStatus",
          },
      * isOperation Boolean 是否为操作列
      * operationOpts Array<object> 操作列所需要的方法、展示名称、是否需要条件筛选及筛选条件,可参考访客(visitor)模块
        operationOpts:[
          {
              method String  操作列关联方法名
              name String 操作列名称
              isCondition Boolean 该操作是否需要展示条件
              condition Function 展示条件函数
              isNeedSpecial Boolean 该操作是否需要特殊展示(如操作名称随状态值进行改变)
              specialDisplay String 进行特殊展示的方法名
          }
        ]
        Eg: operationOpts: [
            {
              method: "auditVisitor",
              name: "审核",
              isCondition:true,
              condition:function(data){
                return data.status == 0
              }
            },
            {
              method: "editVisitor",
              name: "编辑",
              isCondition:true,
              condition:function(data){
                return data.status != 1
              }
            },
            },
          ],
      * isImg Boolean 是否为图片
      * isNeedBack Boolean 字段是否需要背景
      * classMethod String 切换样式的方法
      * displayName String 属性展示名(有些列需要用到两个属性,此处填写所需要用到的另一个属性key)
      */
export default {
  name: "TableList",
  props: {
    dataList: {
      type: Array,
      required: true,
    },
    showList: {
      type: Boolean,
      required: true,
    },
    loading: {
      type: Boolean,
      required: true,
    },
    settingOpts: {
      type: Array,
      required: true,
    },
  },
  data() {
    return {};
  },
  methods: {
    showOperation(child, scope) {
      if (child.isCondition && child.isCondition === true) {
        return child.condition(scope.row);
      } else {
        return true;
      }
    },
  },
  created() {},
};
</script>

<style lang="less" scoped>
.menu_table {
  width: 98%;
  margin: 0 auto;
  margin-top: 20px;
}
div::-webkit-scrollbar {
  // 直接修改样式就可以了
  width: 8px;
  display: none;
}

// 	滚动条
::-webkit-scrollbar {
  width: 40px;
  // background-color: red;
}

// 滚动条轨道
::-webkit-scrollbar-track {
  width: 40px;
  border-radius: 40px;
  background-color: #f4f8f7;
}

// 滚动条滑块
::-webkit-scrollbar-thumb {
  border: 5px solid #c1c1c1;
  border-radius: 40px;
  // background-color: yellow;
}

.connect {
  padding-left: 10px;
  padding-right: 10px;
  border-radius: 4px;
  background-color: #d6edff;
}

.gateway {
  padding-left: 10px;
  padding-right: 10px;
  border-radius: 4px;
  background-color: #ffdde0;
}

.gatewaySon {
  padding-left: 10px;
  padding-right: 10px;
  border-radius: 4px;
  background-color: #ffe8cb;
}

.open {
  color: #16dbcc;
}

.close {
  color: #e52a44;
}
</style>

 引入使用

 

 element组件fixed="right" 表格错位

 解决方法

1,

2,

3,

 通过数组数量循环input标签数量填写表单

paramsInfo.fieldList的值

targetDataList的值

 表单循环targetDataList获取 label值(即有多少个input标签的生成),表单填写的内容绑定在 paramsInfo.fieldList[index].fieldValue

        <el-form-item v-for="(column, index) in targetDataList" :key="index" :label="column.fieldDesc">
              <el-input :id="column.targetId"
                        v-model.trim="paramsInfo.fieldList[index].fieldValue"
                        :type="column.fieldName"
                        style="width: 100%;"></el-input>

            </el-form-item>

 根据表头获取输入框数量

 根据表头的数量,新增的输入框数量

    //增加按钮
    addBtn() {
      // 检查 scopeBranchLists 不为空且包含 fieldName 属性
      if (Array.isArray(this.scopeBranchLists) && this.scopeBranchLists.length > 0) {
        // 使用 map 函数从 scopeBranchLists 中提取 fieldName 值
        //fieldNames = ['index_name', 'dept_name', 'comment', 'dept_type', 'options', 'unit', 'source_priority']
        // let fieldNames = this.scopeBranchLists.reduce((acc, item) => {
        //   acc[item.fieldName] = '';
        //   return acc;
        // }, {});
        const fieldNames = this.scopeBranchLists.map(item => item.fieldName);
        var fieldNamesObj = {};
        for (var i = 0; i < fieldNames.length; i++) {
          fieldNamesObj[fieldNames[i]] = null;
        }
        //this.formData = fieldNamesObj
        this.rows.push(fieldNamesObj);

      }
    },

 表头数据 

<div v-for="(item, index) in scopeBranchLists" :key="index" style="margin-right: 3%;width: 140px;">
  {{ item.fieldDesc }}
</div>

 生成的input框数量(5个表头,生成对应五个输入框 为一个对象,最后放入rows数组)

<table>
  <tr v-for="(obj, rowIndex) in rows" :key="rowIndex">
    <td
      style="display: flex;justify-content: space-between;padding-bottom: 20px; border-bottom: 1px solid #e4e7ed;">
      <el-input
        v-for="(value, key) in obj"
        :key="key"
        v-model.trim="obj[key]"
        style="margin-right: 28px;
        margin-top: 5px;
        height: 30px;
        width: 140px;
        "
        type="text"
      />
      <div style="width: 4%;margin-top: 10px">
        <img src="../../../assets/cancel.png" style="width: 18px;height: 18px;cursor: pointer;"
             @click="deleteDict(rowIndex)"/>
      </div>
    </td>
  </tr>
</table>

完整代码

          <div>
            <div style="display: flex;padding-top: 3px;padding-bottom: 8px;
            border-bottom: 1px solid #ccc;background-color: #f2fcfe; color: #50606d">
              <div v-for="(item, index) in scopeBranchLists" :key="index" style="margin-right: 3%;width: 140px;">
                {{ item.fieldDesc }}
              </div>
            </div>
            <table>
              <tr v-for="(obj, rowIndex) in rows" :key="rowIndex">
                <td
                  style="display: flex;justify-content: space-between;padding-bottom: 20px; border-bottom: 1px solid #e4e7ed;">
                  <el-input
                    v-for="(value, key) in obj"
                    :key="key"
                    v-model.trim="obj[key]"
                    style="margin-right: 28px;
                    margin-top: 5px;
                    height: 30px;
                    width: 140px;
                    "
                    type="text"
                  />
                  <div style="width: 4%;margin-top: 10px">
                    <img src="../../../assets/cancel.png" style="width: 18px;height: 18px;cursor: pointer;"
                         @click="deleteDict(rowIndex)"/>
                  </div>
                </td>
              </tr>
            </table>
          </div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1070259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8.2 JUC - 6.CyclicBarrier

目录 一、是什么&#xff1f;二、使用demo三、注意 一、是什么&#xff1f; CyclicBarrier &#xff1a; 循环栅栏&#xff0c;用来进行线程协作&#xff0c;等待线程满足某个计数。构造时设置计数个数&#xff0c;每个线程执行到某个需要“同步”的时刻调用 await() 方法进行…

【数据结构】栈和队列-- OJ

目录 一 用队列实现栈 二 用栈实现队列 三 设计循环队列 四 有效的括号 一 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;QDataType data; }QNode;typedef struct …

数据结构 | (三) Stack

栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO &#xff08; Last In First Out &#xff09;的原则。 压栈&#xff1a;栈…

c#学习系列相关之多线程(三)----invoke和begininvoke

一、invoke和BeginInvoke的作用 invoke和begininvoke方法的初衷是为了解决在某个非某个控件创建的线程中刷新该控件可能会引发异常的问题。说的可能比较拗口&#xff0c;举个例子&#xff1a;主线程中存在一个文本控件&#xff0c;在一个子线程中要改变该文本的值&#xff0c;此…

(四)列表、元组、字典和集合

Python列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、字典&#xff08;dict&#xff09;和集合&#xff08;set&#xff09;详解 Python 序列&#xff08;Sequence&#xff09;是指按特定顺序依次排列的一组数据&#xff0c;它们可以占用一块连续的内…

【C/C++】关于vector迭代器失效问题

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; vector迭代器失效问题 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.10.8 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就…

C++变量默认初始化

初始化不是赋值&#xff0c;初始化是指创建变量时赋予一个初始值&#xff0c;赋值是指将变量的当前值擦除&#xff0c;赋予新值。 如果定义变量时没有初始化&#xff0c;则变量会被系统默认初始化。“默认值”取决于变量的&#xff1a;类型位置 startmindmap * C变量默认初始…

邮件群发工具哪个好

邮件群发是一种通过电子邮件向多个收件人发送邮件的方式。同时&#xff0c;邮件群发也是一种低成本、高回报的营销手段。因此邮件群发被广泛应用于各种营销活动中&#xff0c;例如活动邀请、新品上线、产品促销等等。而群发邮件最有效的方式就是借助邮件群发工具&#xff0c;而…

常用排序算法详解

1.冒泡排序原理示例代码实现 2.快速排序原理示例代码实现 3.插入排序原理示例代码实现 4.希尔排序原理示例代码实现 5.选择排序原理示例代码实现 6.堆排序原理示例代码实现 7.归并排序原理示例代码实现 本文讲述了常见的排序算法的执行过程&#xff0c;有详细实现过程举例 1.冒…

arm 点灯实验代码以及现象

.text .global _start _start: 1.设置GPIOE寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0x50000A28 LDR R1,[R0] ORR R1,R1,#(0x1<<4) 第4位置1 STR R1,[R0] 1.设置GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R…

自动定时删除磁盘文件的脚本(从文件日期最早的开始删)

#!/bin/bash# 指定的挂载点 MOUNTPOINT"/media/vm/MyDisk512GB"# 设置磁盘大小的限制 (例如&#xff1a;800G) LIMIT$((800 * 1024 * 1024)) # 单位是KB# 获取挂载点的已使用空间 USED_SPACE$(df -kP "$MOUNTPOINT" | tail -1 | awk {print $3})echo &quo…

强化学习------Qlearning算法

简介 Q learning 算法是一种value-based的强化学习算法&#xff0c;Q是quality的缩写&#xff0c;Q函数 Q(state&#xff0c;action)表示在状态state下执行动作action的quality&#xff0c; 也就是能获得的Q value是多少。算法的目标是最大化Q值&#xff0c;通过在状态state下…

day58:ARMday5,GPIO流水灯实验

汇编指令&#xff1a; .text .global _start _start: 1.设置GPIOE GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[5:4]->1 0x50000a28 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) STR R1,[R0]2.设置PE10、PF10、PE8管脚为输出模式&#xff0c;GPIOE_MODER[21…

【gcc】RtpTransportControllerSend学习笔记 1

本文是woder大神 的文章的学习笔记。主要是大神文章: webrtc源码分析(8)-拥塞控制(上)-码率预估 的学习笔记。大神的webrtc源码分析(8)-拥塞控制(上)-码率预估 详尽而具体,堪称神作。因为直接看大神的文章,自己啥也没记住,所以同时跟着看代码。跟着大神走一遍,不求甚解,…

SpringCloud学习笔记-注册微服务到Eureka注册中心

目录 1.在该Module的pom文件中引入eureka依赖2.在该module的src/main/resources/application.yml配置文件3.启动对应的微服务4.查看微服务是否启动成功 假如我有一个微服务名字叫user-service,我需要把它注册到Eureka注册中心,则具体步骤如下: 1.在该Module的pom文件中引入eure…

MQ - 38 Serverless : 基于Serverless架构实现流式数据处理

文章目录 导图Pre概述典型的数据流场景什么是 ServerlessServerless 的定义Serverless Function如何基于 Serverless 实现数据处理数据处理流程底层架构和技术原理两种方案的优劣势对比业务案例和场景分析日志清洗场景事件流处理其他case总结导图

geecg-uniapp 源码下载运行 修改端口号 修改tabBar 修改展示数据

APP体验&#xff1a; http://jeecg.com/appIndex技术官网&#xff1a; http://www.jeecg.com安装文档&#xff1a; 快速开始 JeecgBoot 开发文档 看云视频教程&#xff1a; 零基础入门视频官方支持&#xff1a; http://jeecg.com/doc/help 一&#xff0c;下载安装 源码下载…

【力扣面试题】URL化

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析1、使用String内部方法2、使用StringBuilder 一、题目描述 题目链接&#xff1a;URL化 编写一种…

【软考】5.2 传输介质/通信方式/IP地址/子网划分

《传输介质》 双绞线&#xff1a;网线&#xff1b;传输距离在100m以内 无屏蔽双绞线&#xff1a;UTP&#xff1b;可靠性相对较低屏蔽双绞线&#xff1a;STP&#xff1b;屏蔽怕干扰&#xff1b;可靠性相对较高&#xff1b;一般用于对传输可靠性要求很高的场合 网线&#xff1a…

【Java 进阶篇】HTML块级元素详解

HTML&#xff08;Hypertext Markup Language&#xff09;是用于创建网页的标记语言。在HTML中&#xff0c;元素被分为块级元素和内联元素两种主要类型。块级元素通常用于构建网页的结构&#xff0c;而内联元素则嵌套在块级元素内&#xff0c;用于添加文本和其他内容。本文将重点…