基于antd-vue的简易穿梭框


<template>
  <div>
    <a-modal
      :visible="true"
      title="选择部门"
      @cancel="closeModal"
      width="560px"
    >
      <div class="gutter-example">
        <a-row :gutter="16">
          <a-col class="gutter-row" :span="12">
            <!-- 
              :infinite-scroll-disabled="busy"
              :infinite-scroll-distance="0"
              @scroll="scroll" -->
            <div
              class="gutter-box"
              ref="leftList"
            >
              <a-input
                allow-clear
                style="width: 220px; margin-bottom: 8px; padding-left: 8px"
                v-model="searchParmas.keyword"
                placeholder="请输入搜索内容"
                @change="onSearch"
              >
                <a-icon slot="prefix" type="search" />
              </a-input>
              <a-checkbox-group @change="onChooseOrg" v-model="chooseArray">
                <a-checkbox
                  class="item-style"
                  v-for="item in departmentList"
                  :key="item.id"
                  :value="item.id"
                  :disabled="item.disabled"
                  >{{ item.name }}
                </a-checkbox>
              </a-checkbox-group>
            </div>
          </a-col>
          <a-col class="gutter-row" :span="12">
            <div class="gutter-box">
              <div class="choose-title">
                已选部门({{ chooseList.length }}/10)
              </div>
              <div
                class="choose-item"
                v-for="item in chooseList"
                :key="item.id"
              >
                {{ item.name }}
                <span class="close-style" @click="deleteItem(item)">
                  <a-icon type="close" />
                </span>
              </div>
            </div>
          </a-col>
        </a-row>
      </div>
      <div slot="footer">
        <a-button @click="closeModal()">取消</a-button>
        <a-button type="primary" @click="handelOk()">确定</a-button>
      </div>
    </a-modal>
  </div>
</template>

<script>
import { organizationList } from "@/api/staff.js";
export default {
  props: {
    selectArray:{
      type:Array,
      default:()=> []
    }
  },
  data() {
    return {
      loading: false,
      departmentList: [],
      copyList: [],
      total: 0,
      searchParmas: {
        page: 1,
        pageSize: 500,
        keyword: "",
      },
      chooseList: [],
      busy: false,
      chooseArray:[]
    };
  },
  mounted() {
    this.getOrganizationList();
    this.initData()
  },
  methods: {
    // 初始化数据
    initData() {
      let arr = [],choose = []
      arr = this.selectArray
      if(arr.length > 0){
        arr.forEach( item => {
          choose.push(item.id)
        })
        this.chooseArray = choose
        this.chooseList = arr
      }
    },
    // 选择部门
    onChooseOrg(e) {
      // 是否在查询列表选择
      if(!this.searchParmas.keyword){
        this.chooseList = []
      }
      if (e.length > 0) {
        if(this.chooseList.length < 10){
          e.forEach( item => {
            let chooseResult = []
            let flag = this.chooseList.filter( (ite) => ite.id == item)
            // 表示已选数组里面不包含此数据
            if(flag.length == 0){
              chooseResult = this.departmentList.filter((ite) => ite.id == item);
            }
            let resultArr = [...chooseResult,...this.chooseList]
            this.chooseList = resultArr.filter((item, index, arr) => arr.indexOf(item, 0) === index)
          })
        }
        // 最多选择十个部门
        if (this.chooseList.length == 10) {
          this.disabledList();
        }else{
          this.departmentList.map((ele) => {
            this.$set(ele, "disabled", false);
          });
        }
      }
    },
    // 禁用可选列表
    disabledList() {
      this.searchParmas.keyword = null
      this.departmentList = this.copyList
      this.chooseArray = []
      this.chooseList.forEach( item => {
        this.chooseArray.push(item.id)
      })
      this.departmentList.map((ele) => {
        if (this.chooseArray.includes(ele.id)) {
          this.$set(ele, "disabled", false);
        } else {
          this.$set(ele, "disabled", true);
        }
      });
      
    },
    // 删除部门
    deleteItem(data) {
      this.chooseArray = this.chooseArray.filter( item => item != data.id)
      this.chooseList = this.chooseList.filter( item => item.id != data.id)
      this.handelChooseArray()
    },
    // 搜索后选中数据处理
    handelChooseArray() {
      this.searchParmas.keyword = null
      this.departmentList = this.copyList
      this.chooseArray = []
      this.chooseList.forEach( item => {
        this.chooseArray.push(item.id)
      })
      if(this.chooseList.length == 10){
        this.disabledList()
      }else{
        this.departmentList.map((ele) => {
          this.$set(ele, "disabled", false);
        });
      }
      
    },
    // 左侧部门树滑动加载
    // scroll() {
    //   this.$nextTick(() => {
    //     const el = this.$refs.leftList;
    //     const offsetHeight = el.offsetHeight;
    //     const scrollTop = el.scrollTop;
    //     const scrollHeight = el.scrollHeight;
    //     if (offsetHeight + scrollTop - scrollHeight >= 0) {
    //       this.searchParmas.page += 1;
    //       this.getOrganizationList();
    //     }
    //   });
    // },
    // 获取部门列表
    getOrganizationList(option) {
      if (this.loading) {
        return;
      }
      this.loading = true;
      organizationList(this.searchParmas)
        .then((res) => {
          if (res.errorCode == "00000") {
            if (res.data.records.length == 0) {
              this.loading = false;
              return;
            }
            if(this.chooseList.length == 10){
              res.data.records.forEach((item) => {
                item.disabled = true;
              });
            }else{
              res.data.records.forEach((item) => {
                item.disabled = false;
              });
            }
            if (option) {
              this.departmentList = res.data.records;
            } else {
              this.departmentList = res.data.records;
              this.copyList = this.departmentList;
            }
            this.total = res.data.total;
            this.loading = false;
          }
        })
        .catch((err) => {
          if (err) {
            this.loading = false;
          }
        });
    },
    // 搜索数据
    onSearch(e) {
      if (!e.target.value) {
        this.handelChooseArray()
      } else {
        this.searchParmas.page = 1;
        this.searchParmas.keyword = e.target.value;
        this.getOrganizationList("search");
      }
    },
    closeModal() {
      this.chooseList = []
      this.chooseArray = []
      this.$emit('closeModal')
    },
    handelOk() {
      this.$emit('getChooseData',this.chooseList)
    }
  },
  watch:{}
};
</script>

<style lang="less" scoped>
.gutter-example > .ant-row > div {
  background: transparent;
  border: 0;
}
.gutter-box {
  width: 100%;
  background: #00a0e9;
  padding: 8px 0;
  height: 349px;
  background: #ffffff;
  border-radius: 4px;
  opacity: 1;
  border: 1px solid #d9dadd;
  overflow-y: auto;
  overflow-x: hidden;
  color: #272e3b;
  .item-style {
    padding: 0 8px;
    margin: 8px 0 0;
    width: 100%;
    font-weight: 600;
  }
  .choose-title {
    font-weight: 600;
    height: 42px;
    line-height: 42px;
    padding: 0 8px;
  }
  .choose-item {
    line-height: 30px;
    font-weight: 600;
    padding: 0 8px;
    .close-style {
      color: #d9dadd;
      float: right;
      cursor: pointer;
      visibility: hidden;
    }
    &:hover {
      background: #f6f9ff;
      .close-style {
        visibility: inherit;
      }
    }
  }
}
</style>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: antd-mobile-vue是一个基于Vue.js框架的移动端组件库,它提供了一系列UI组件,用于开发高质量的移动端应用。 与其它UI组件库相比,antd-mobile-vue具有以下优势和特点: 1. 高质量的组件:antd-mobile-vue提供了丰富的移动端UI组件,如按钮、表单、弹窗、导航等,这些组件都经过了精心设计和开发,具有统一的风格和良好的用户体验。 2. 灵活的布局:antd-mobile-vue提供了灵活的布局组件,如栅格布局、Flex布局,可帮助开发者快速搭建页面结构,并自适应不同的屏幕尺寸。 3. 易于使用和扩展:antd-mobile-vue的组件使用简单,开发者可以通过简单的配置和参数就可以实现复杂的交互效果。而且,antd-mobile-vue的组件提供了丰富的扩展能力,可以根据项目需求进行个性化的定制。 4. 生态丰富:antd-mobile-vue拥有庞大的开发者社区和活跃的维护团队,开发者可以通过官方文档和社区资源获取帮助和支持。此外,antd-mobile-vue还与其它Vue.js生态工具和库良好地兼容,如Vue Router、Vue CLI等。 5. 支持国际化:antd-mobile-vue提供了多语言支持,开发者可以根据项目需求灵活地切换多种语言环境。 总之,antd-mobile-vue是一个功能强大、易于使用和扩展的移动端组件库,它可以帮助开发者快速构建高质量的移动端应用,提高开发效率和用户体验。 ### 回答2: antd-mobile-vue是一种基于Vue.js框架的移动端UI库。它是对Ant Design Mobile的Vue组件实现的封装和扩展,旨在为开发者提供高质量、易用性的移动端组件库,帮助快速开发移动应用程序。 antd-mobile-vue提供了丰富的移动端UI组件,如按钮、导航栏、标签栏、列表、表单等,可以满足日常开发中绝大部分的界面需求。这些组件都经过精心设计和优化,在视觉和交互上都符合当前移动端的设计原则和用户体验。而且,它还提供了灵活的定制和扩展能力,允许开发者根据具体需求进行个性化定制,提高开发效率和用户体验。 除了UI组件外,antd-mobile-vue还提供了一些实用的工具和功能,如样式工具库、语言国际化、路由管理等。这些工具和功能都是为了让开发者更方便地进行移动应用开发,减少重复性的工作,提高开发效率。 antd-mobile-vue拥有广泛的社区支持和文档资料,开发者可以从社区中获取帮助和解决问题,学习和掌握使用该库的技巧和最佳实践。同时,antd-mobile-vue还提供了详细的官方文档和示例代码,方便开发者快速入手和上手该库。 总之,antd-mobile-vue是一款功能强大、易用性强的移动端UI库,适用于各种移动应用的开发。无论是个人开发者还是团队开发,都可以通过使用antd-mobile-vue来快速构建高质量的移动应用程序。 ### 回答3: antd-mobile-vue 是一个基于 Vue.js 的移动端 UI 组件库,它提供了丰富的移动端组件和样式风格,可以帮助开发者快速构建优雅的移动端应用。 antd-mobile-vue 的特点有以下几个方面: 1. 高度可定制:antd-mobile-vue 提供了大量的组件,涵盖了移动端常见的UI元素,如按钮、导航栏、表单等,这些组件的样式和交互行为都可以通过配置进行定制,满足不同项目的需求。 2. 兼容性强:antd-mobile-vue 提供了对不同移动端浏览器和操作系统的支持,保证组件在不同环境下的正常运行和展示,同时也保证了用户的使用体验。 3. 特色设计:antd-mobile-vue 的设计风格简洁、现代,符合移动端用户的审美要求,同时也遵循了 Material Design 和 iOS Human Interface Guidelines 等设计准则,保证了用户的熟悉感和易用性。 4. 文档丰富:antd-mobile-vue 提供了详细的文档和示例代码,开发者可以根据文档了解组件的使用方法和配置参数,快速上手使用。 5. 生态丰富:antd-mobile-vue 是基于 Ant Design Mobile(antd-mobile)的 Vue 实现,可以与其它 Vue 生态工具和插件无缝集成,如 Vue Router、Vuex 等,方便开发者构建复杂的移动应用。 总之,antd-mobile-vue 是一个强大而灵活的移动端 UI 组件库,它可以帮助开发者节省时间和精力,快速开发出高质量的移动应用。无论是个人项目还是企业应用,都可以考虑使用这个库来提升开发效率和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

左撇子没秃头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值