vue2实现一个上边为搜索,下面为复选框选中后,右侧显示已选中组件

news2024/11/24 22:43:08

目录

  • vue2实现一个上边为搜索,下面为复选框选中后,右侧显示已选中组件
    • component / ProjectSelectItem.vue
    • 使用组件
    • 效果

vue2实现一个上边为搜索,下面为复选框选中后,右侧显示已选中组件

component / ProjectSelectItem.vue

<template>
    <div class="project-wrap">
      <!-- selectObj {{ selectObj }} -->
      <div class="project-wrap-top">
        <el-input placeholder="请输入内容" v-model="searchVal" @input="searchChange" clearable style="width:300px">
          <i slot="prefix" class="el-input__icon el-icon-search"></i>
        </el-input>
      </div>
      <div class="project-wrap-con">
        <div class="project-wrap-left" v-loading="loading">
          <template v-if="serachData&&serachData.length > 0">
            <div class="project-wrap-left-item" v-for="(item,idx) in serachData" :key="idx">
            <div class="item-left">
              <i class="el-input__icon item-left-icon el-icon-folder-opened"></i>
              <span> {{ item.label }} </span>
            </div>
            <div class="item-right">
              <el-checkbox v-model="item.checkedVal" @change="checkedChange(item)"></el-checkbox>
            </div>
          </div>
          </template>
          <div v-else>
            <div v-show="!loading">暂无数据</div>
          </div>
        </div>
        <div class="project-wrap-right">
          <div class="project-wrap-right-top">
            已选项目
          </div>
          <div class="project-wrap-right-con" v-if="selectObj.code">
            <i class="el-input__icon item-left-icon el-icon-folder-opened"></i>
            <span> {{ selectObj.label }} </span>
          </div>
        </div>
      </div>
    </div>
</template>

<script>
export default {
  name: "ProjectSelectItem",
  props:{
    // 列表数据
    projectData:{
      type: Array,
      default:()=>{
        return []
      }
    },
    // 选中的数据
    selectPropsObj:{
      type: Object,
      default:()=>{
        return {
          code:'',
          label:'',
          checkedVal:false
        }
      } 
    },
    loading:{
      type: Boolean,
      default:false
    },
  },
  components: {},
  data() {
    return {
      searchVal: "", // 搜索的值
      selectObj:{
        code:'',
        label:'',
        checkedVal:false
      },
      // 初始化完整的数据
      projectAllData:[],
      // 查询后的数据
      serachData:[],
      timer:null
    };
  },
  watch:{
    projectData: {
      handler: function() {
        this.init();
      },
      deep:true,
      immediate:true
    } 
  },
  created() {
    this.init()
  },
  destroyed(){
    clearInterval(this.timer);
  },
  methods: {
    init(){
      // 请求数据
      this.projectAllData = [...this.projectData]
      this.serachData = [...this.projectData]
      // 已经有选中的时候 回显效果
      this.selectObj = {...this.selectPropsObj };
      if ( this.selectObj.checkedVal ) {
        this.serachData = this.serachData ? this.serachData.map(item=>{
          if(item.code === this.selectObj.code ) {
              item.checkedVal = true;
            } else {
              item.checkedVal = false
            }
            return item
        }) : []
      }
    },
    // 勾选
    checkedChange(val){
      console.log('checkedChange', val);
      // 01:没有搜索值 // 02:有搜索值
      if ( !this.searchVal ) {
        this.projectAllData = this.projectAllData ? this.projectAllData.map(item=>{
          if(item.code === val.code) {
            item.checkedVal = val.checkedVal;
          } else {
            item.checkedVal = false
          }
          return item
        }) : []
        this.selectObj.code = val.checkedVal ? val.code : '';
        this.selectObj.label = val.checkedVal ? val.label : '';
        this.selectObj.checkedVal = val.checkedVal ? val.checkedVal : false;
      } else {
        this.serachData = this.serachData ? this.serachData.map(item=>{
          if(item.code === val.code) {
            item.checkedVal = val.checkedVal;
          } else {
            item.checkedVal = false
          }
          return item
        }) : []
        this.selectObj.code = val.checkedVal ? val.code : '';
        this.selectObj.label = val.checkedVal ? val.label : '';
        this.selectObj.checkedVal = val.checkedVal ? val.checkedVal : false;
      }
      this.$emit('getSelectObj',this.selectObj)
    },
    // 搜索
    searchChange() {
      clearInterval(this.timer);
      this.timer = setTimeout(()=> {
        this.serachData = this.createFilter(this.searchVal)
        // console.log('this.serachData',this.serachData);
        // console.log('this.selectObj',this.selectObj);
        this.serachData = this.serachData ? this.serachData.map(item=>{
          if(item.code === this.selectObj.code ) {
            item.checkedVal = true;
          } else {
            item.checkedVal = false
          }
          return item
        }) : []
      }, 300);
    },
    // 过滤
    createFilter(queryString) {
      // console.log('queryString',queryString);
      queryString = queryString ? queryString.trim() : ''
      let result = []
      result = this.searchVal ? 
      this.projectAllData.filter(item => {
        return (
          item.label.toLowerCase().indexOf(queryString.toLowerCase()) === 0 || 
          item.code.toLowerCase().indexOf(queryString.toLowerCase()) === 0
        )
      })
       : this.projectAllData
      return result
    },
  },
}
</script>

<style  lang="scss" scoped>
.project-wrap {
  background: #eee;
  width: 600px;
  height: 100%;
  .project-wrap-top {
    margin-left: 20px;
    height: 80px;
    line-height: 80px;
    border-bottom: 2px solid #000;
    text-align: left;
  }
  .project-wrap-con {
    display: flex;
    // height: 100%;
    height: calc(100% - 80px);
    overflow: auto;
    .project-wrap-left {
      width: 400px;
      overflow: auto;
      border-right: 2px solid #000;
      padding: 10px 20px;
      .project-wrap-left-item {
        display: flex;
        justify-content: space-between;
        height: 34px;
        line-height: 34px;
        width: 100%;
        // background: yellow;
        overflow: hidden;
        .item-left {
          display: flex;
          width: 330px;
          // background: #ddd;
          .item-left-icon {
            line-height: 24px;
          }
        }
        .item-right {
          width: 30px;
          // background: #eee;
        }
      }
    }
    .project-wrap-right {
      width: 160px;
      overflow: auto;
      padding: 10px;
      text-align: left;
      .project-wrap-right-top {
        font-size: 18px;
        color: #ccc;
        margin-bottom: 10px;
      }
      .project-wrap-right-con {
        padding: 2px;
        background: #cdcdcd;
        min-height: 34px;
      }
    }
  }
}
</style>

使用组件

     selectObj {{ selectObj }}
    <ProjectSelectItem :projectData="testData" @getSelectObj="getSelectObj" :selectPropsObj="selectObj" :loading="loading" />
    selectObj1 {{ selectObj1 }}
    <ProjectSelectItem :projectData="testData1" @getSelectObj="getSelectObj1"  />
    selectObj2 {{ selectObj2 }}
    <ProjectSelectItem :projectData="testData2"  @getSelectObj="getSelectObj2"  />
    <div></div>

  data() {
    return {
      selectObj:{
        code:'1',
        label:'深圳市XX运信息咨询有限公司1',
        checkedVal:true,
      },
      loading:false,
      selectObj1:{
        code:'',
        label:'',
        checkedVal:false
      },
      selectObj2:{
        code:'',
        label:'',
        checkedVal:false
      },
      // 使用扁平化数据
      testData:[],
      testData1:[
        {
          code:'01',
          label:'深圳市XX运信息咨询有限公司01',
          checkedVal:false,
        },
        {
          code:'02',
          label:'运营二部02',
          checkedVal:false,
        },
        {
          code:'03',
          label:'运营二部03运营二部运营二部运营二部运营二部运营二部运营二部',
          checkedVal:false,
        },
        {
          code:'04',
          label:'人事服务04',
          checkedVal:false,
        },
        {
          code:'010',
          label:'深圳市XX运信息咨询有限公司010',
          checkedVal:false,
        },
      ],
      testData2:[
        {
          code:'001',
          label:'公司001',
          checkedVal:false,
        },
        {
          code:'002',
          label:'运营三部002',
          checkedVal:false,
        },
        {
          code:'003',
          label:'运营三部003运营三部运营三部',
          checkedVal:false,
        },
        {
          code:'004',
          label:'人事服务004',
          checkedVal:false,
        },
        {
          code:'0010',
          label:'深圳市XX运信息咨询有限公司0010',
          checkedVal:false,
        },
      ]
    };
  },

  created() {
    // 初始化数据
    let initData = [
      {
        code:'1',
        label:'深圳市XX运信息咨询有限公司1',
        children:[
          {
            code:'1-0',
            label:'深圳市XX运信息咨询有限公司1-0',
          }
        ]
      },
      {
          code:'2',
          label:'运营二部2',
          children:[
            {
              code:'2-0',
              label:'深圳市XX运信息咨询有限公司2-0',
            }
          ]
        },
        {
          code:'3',
          label:'运营二部3运营二部运营二部运营二部运营二部运营二部运营二部',
          children:null
        },
        {
          code:'4',
          label:'人事服务4',
          children:[
            {
              code:'4-0',
              label:'人事服务4-0',
              children:[
                {
                  code:'4-0-0',
                  label:'人事服务4-0-0',
                },
              ]
            },
            {
              code:'4-1',
              label:'人事服务4-1',
            }
          ]
        }
    ]
    initData = this.treeToOneArr(initData);
    initData = initData ? initData.map(item=>{
      this.$set(item,'checkedVal',false);
      return item
    }):[];
    this.loading = true;
    setTimeout(()=>{
      this.testData = [...initData]
      this.loading = false;
      console.log('父组件-initData',initData,'this.testData',this.testData);
    },1000)

    // console.log('父组件-initData',initData,'this.testData',this.testData);
  },
  methods: {
    // 获取到数据
    getSelectObj(val){
      this.selectObj = {...val}
    },
    getSelectObj1(val){
      this.selectObj1 = {...val}
    },
    getSelectObj2(val){
      this.selectObj2 = {...val}
    },
    treeToOneArr(arr) {
      const data = JSON.parse(JSON.stringify(arr)) // 对传入的参数进行深拷贝
      const newData = [] // 创建空数组用来接收操作后的新数组
      const hasChildren = item => {
        // 递归遍历,把包含children的选项拿出来,push到之前新建的空数组内
        (item.children || (item.children = [])).map(v => {
          hasChildren(v)
        })
        delete item.children // 删除原children属性,可选项
        newData.push(item)
      }
      data.map(v => hasChildren(v))
      return newData
    },
  },

效果

在这里插入图片描述

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

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

相关文章

对于小米随手吸尘器各种问题的初始办法

本人在什么值得买发过&#xff0c;现在只不过是为了让账号看起来更丰盈一点&#xff0c;现在再发一次。 充不进去电/使用的时候短暂吸气&#xff0c;这两个问题&#xff0c;在上个月的时候我就已经发现了这个问题。 然后我就拆开了那个主机&#xff0c;就是那个保温杯一样的东…

SpringCloud(3) Ribbon负载均衡,负载均衡策略,自定义负载均衡

目录 1.Ribbon负载均衡流程2.Ribbon负载均衡策略3.自定义负载均衡策略如何实现4.总结 1.Ribbon负载均衡流程 假设我们有一台 order-service 订单服务&#xff0c;两台 user-service 用户服务&#xff0c;当订单服务需要调用用户服务获取用户信息的时候&#xff0c;应该怎么分配…

Windows下mysql 8.0.11 安装教程

http://www.jb51.net/article/140950.htm &#xff1a;此文章注意my.ini的扩展名 MySQL安装参考&#xff1a;mysql-8.0.11-winx64.zip在Windows中的安装配置-百度经验 MySQL卸载&#xff1a;https://blog.csdn.net/cxy_summer/article/details/70142322 下载最新的MySQL 1、…

经商必看的10本书籍推荐

1、《经理人参阅&#xff1a;商业模式与商业思维》 这本书被誉为商业模式的圣经。该书通过可视化工具&#xff0c;包括商业模式画布和价值主张画布&#xff0c;帮助企业家、创业者和经理人创造创新的商业模式。本书通过图表、图像和实例&#xff0c;详细讲解了商业模式的构建方…

智慧饮品未来发展方向:点赋科技AI智能饮品机器人的崛起

随着人们对健康饮品的追求和科技的不断创新&#xff0c;智慧饮品正在迅速崛起并成为未来饮品市场的热点。其中&#xff0c;AI智能饮品机器人作为一种创新的服务形式&#xff0c;将在未来发展中扮演重要角色。点赋科技将探讨智慧饮品市场的未来发展方向以及AI智能饮品机器人的潜…

URL(URI) 中的编码与乱码(下)--查询字符串(query string)中的编码

在上篇中, 初步谈论了 URL 中含有中文字符时的转义编码, 提到了所使用的编码是 utf-8. 不过你可能会有点疑问, 一定都是要用 utf-8 编码吗? 还是因为页面编码本身是 utf-8 的缘故呢? 毕竟在那个例子中, 页面的编码也恰好是 utf-8. 在 GBK 编码页面下的 URL 转义 这次, 将继…

Linux10.地址空间

1.几乎所有的语言&#xff0c;如果它有地址的概念&#xff0c;这个地址一定不是物理地址&#xff0c;是虚拟地址(线性地址)。 2.诸如网卡&#xff0c;硬盘和显卡等外设内部也具有寄存器。 3.在makefile中&#xff0c;gcc -o 文件A 文件1 文件2(…)可以写成 :gcc -o $ $^ 4.地…

程序员常用的几个效率小工具,可好用了!

目录 &#x1f5a5;️ Hexed.it &#x1f5bc;️ Carbon &#x1f5bc;️ Draw.net 今天给大家推荐几个平时工作学习中常用到的小工具&#xff0c;让你效率拉满&#xff01; &#x1f5a5;️ Hexed.it 在线地址&#xff1a;HexEd.it - Browser-based Online and Offline He…

增强深度学习与对抗训练对癫痫发作的鲁棒预测

标题&#xff1a;Augmenting Deep Learning with Adversarial Training for Robust Prediction of Epilepsy Seizures Abstract: 癫痫是一种慢性疾病&#xff0c;涉及异常的大脑活动&#xff0c;导致患者失去对意识或运动活动的控制。因此&#xff0c;在癫痫发作之前检测出癫…

Learn Mongodb DB数据库部署 ②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

类加载的时机

类加载的时机 类的生命周期 类从被加载到虚拟机内存开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括以下 7 个阶段&#xff1a; 加载 验证 准备 解析 初始化 使用 卸载 验证、准备、解析 3 个阶段统称为连接。 加载、验证、准备、初始化和卸载这 5 个阶段的…

【MATLAB第49期】基于MATLAB的深度学习ResNet-18网络不平衡图像数据分类识别模型

【MATLAB第49期】基于MATLAB的深度学习ResNet-18网络不平衡图像数据分类识别模型 一、基本介绍 这篇文章展示了如何使用不平衡训练数据集对图像进行分类&#xff0c;其中每个类的图像数量在类之间不同。两种最流行的解决方案是down-sampling降采样和over-sampling过采样。 在…

力扣 -- 64.最小路径和

题目链接&#xff1a;64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目的。 参考代码&#xff1a; class Solution { public:int minPathSum(vector<vector…

filezilla 刷新文件

ubuntu上的filezilla一直右键找不到文件刷新的选项&#xff0c;今天终于找到了 点击那个循环利用的按钮&#xff0c;就是刷新文件和文件夹&#xff0c;这个和mac上的操作有点不一致&#xff0c;很奇怪哈

PHP --- 基础(01)

简单介绍 &#xff08;1&#xff09;PHP基本语法操作 <?php $iphone13 5880; // 变量首字母不能是数字&#xff0c;同时变量区分大小写 $iphone12 5000; // 变量名尽量有意义 $shen $iphone13 $iphone12 echo $shen; // echo是在php中常用的输出、显示功能的命令 ?&…

使用 arpl 在 PVE 上安装黑群晖

arpl 是 GitHub 上开源的自动装载程序&#xff0c;能够实现使用 arpl 在物理机或虚拟机中安装黑群晖 1. 下载 arpl 在 GitHub 项目 fbelavenuto/arpl 的 Releases 中选择下载最新版本&#xff0c;选择 img.zip 后缀的文件进行下载 解压后可以得到一个名为 arpl.img 的文件&am…

一.《泽诺尼亚》背包物品数据分析和遍历

寻找突破口 1.首先寻找突破口,围绕一个“变”字去找 2.之前在别的课程中也给同学们说过,我们在找背包物品遍历,无非就是要先拿到物品对象 3.然而要拿到物品对象,必须先拿到物品属性,然后逆向分析拿到物品对象 4.那么问题来了, 怎么拿到物品属性呢&#xff1f; 5.这时候就要…

Fiddler如何进行弱网测试

目录 前言 1、Fiddler设置 2、手机设置 3.设置模拟调制解调器的速度&#xff1a; 4.设置手机代理 前言 使用Fiddler对手机App应用进行抓包&#xff0c;可以对App接口进行测试&#xff0c;也可以了解App传输中流量使用及请求响应情况&#xff0c;从而测试数据传输过程中流量…

上海师范大学Windows端VPN使用教程及课表查询方法

1、首先强调&#xff1a;学生电子邮件和 VPN 服务须在修改初始密码之后才能登录使用。 2、其次&#xff1a; 学校已为每位新生开通了统一身份认证账号&#xff08; CUID &#xff09;&#xff08;如&#xff1a;1000101010, 详见录取 通知书上的 CUID&#xff09; 。 初始密码…

protobuf的Proto3语法学习 (二)

文章目录 五、proto3语法详解1. 字段规则2. 消息类型的定义与使⽤2.1 定义2.2 使⽤2.3 创建通讯录2.0版本2.3.1 通讯录2.0的写⼊实现2.3.2 通讯录2.0的读取实现2.3.3 验证写入是否正确 3. enum类型3.1 定义规则3.2 定义enum类型的注意事项3.3 升级通讯录⾄2.1版本 4. Any类型4.…