本组件依赖于iview的select,能够在全局装置了Iview的我的项目或者部分引入了Select的页面中自在应用。

目录
  • 成果展现
  • 性能形容
  • 构造代码
  • 逻辑代码
  • 组件利用
  • 事件钩子
  • github
成果展现

从左到右别离是:未选状态、选中一个状态、全选状态

性能形容
  • 下拉框分为三块:已选列表;全选/勾销全选按钮;未选列表;
  • 入选中未选列表的某项,该项主动从未选列表pop去已选列表;
  • 入选中已选列表的某项,该项主动从已选列表pop去未选列表;
  • 反对关键字搜寻,输入框显示已选数目;
构造代码
<template>  <div class="c-search">    <Select      v-model="s_arr"      :disabled="isdisabled"      :placeholder="placeholder"      :max-tag-count="0"      multiple      filterable      label-in-value      @on-select="selectOption"      @on-open-change="openChange"    >      <Option        v-for="i in selectedList"        :value="i.value"        :key="i.value"        :title="i.label"        >{{ i.label }}</Option      >      <Option        value="all"        key="all"        v-if="trans_unselList.length > 0"        style="padding: 0px"      >        <p          @click="            selectAllFun(              s_arr.length !== unselList.length + selectedList.length            )          "        >          {{            s_arr.length !== unselList.length + selectedList.length              ? "全选"              : "勾销全选"          }}        </p>      </Option>      <Option        v-for="item in unselList"        :value="item.value"        :key="item.value"        :title="item.label"        >{{ item.label }}</Option      >    </Select>  </div></template>data () {    return {      unselList: [], // 未选数组      selectedList: [], // 已选数组      s_arr: [], // v-model绑定选项数组      add_tag: true, // 新增选项标记      allList: [], // 全选v-model绑定选项数组      init_list: [] // 全选已选数组    }}
  • 依据s_arr长度是否为总长度确定是全选还是勾销全选
逻辑代码
// 全选/勾销全选selectAllFun (isAll) {  const self = this  setTimeout(() => {    self.s_arr = []    if (isAll) { // 全选      self.selectedList = []      self.init_list.forEach(item => {        // 采纳这种形式的拷贝,不会只是拷贝了对象的别名(只拷贝别名会导致不冀望的被改变)        self.selectedList.push(item)      })      self.unselList = []      self.allList.forEach(item => {        self.s_arr.push(item)      })    } else { // 勾销全选      self.selectedList = []      self.unselList = []      self.init_list.forEach(item => {        self.unselList.push(item)      })      self.s_arr = []    }  }, 0)},add_or_del (o) {  const self = this  try {    self.selectedList.forEach(function (item) {      if (item.value === o.value) {        self.add_tag = false        throw new Error('')      }    })  } catch (e) {    return ''  }  self.add_tag = true  return ''},selectOption (o) {  const self = this  if (o.value !== 'all') {    setTimeout(() => {      self.add_or_del(o)      if (self.add_tag) {        try {          self.unselList.forEach(function (item, index) {            if (item.value === o.value) {              self.unselList.splice(index, 1)              throw new Error('')            }          })        } catch (e) {          // console.log(e)        }        self.selectedList.push(o)      } else {        try {          self.selectedList.forEach(function (item, index) {            if (item.value === o.value) {              self.selectedList.splice(index, 1)              throw new Error('')            }          })        } catch (e) {          // console.log(e)        }        self.unselList.push(o)      }    }, 100)  }},openChange (isopen) {  if (!isopen) {    var res = this.backList_handle(this.selectedList)    this.$emit('func', res)  }},// 返回选项列表解决backList_handle (list) {  if (isArray(list)) {    var res = []    list.forEach(item => {      res.push(item.value)    })    return res  }},allList_setValue () {  const self = this  self.unselList.forEach(temp => {    self.allList.push(temp.value)    self.init_list.push(temp)  })},// 拿到的选项解决selList_handle (trans, unsel) {  const self = this  setTimeout(() => {    if (trans && trans.length > 0) {      const sel = []      const un_sel = []      unsel.forEach(function (item, index) {        if (item.value && trans.indexOf(item.value) !== -1) {          sel.push(item)        } else if (item.value && trans.indexOf(item.value) === -1) {          un_sel.push(item)        }      })      self.selectedList = sel      // s_arr保留的仅是value      self.selectedList.forEach(item => {        self.s_arr.push(item.value)      })      self.unselList = un_sel      const res = this.backList_handle(self.selectedList)      this.$emit('func', res)    } else if (trans && trans.length === 0) {      self.selectedList = []      self.unselList = []      self.init_list.forEach(item => {        self.unselList.push(item)      })      self.s_arr = []      const res = this.backList_handle(self.selectedList)      this.$emit('func', res)    }  }, 0)}
  • selectAllFun:解决全选和勾销全选事件,参数isAll判断以后解决的是全选还是勾销全选事件
  • add_or_del:判断以后是增加选项还是删除选项并对应设置标签add_tag
  • selectOption:抉择事件,依据add_tag进行对应的删除和增加的解决
  • openChange:下拉框开展收起事件,在收起的时候将拿到的选项组合传给父组件
  • allList_setValue:在首次拿到未选数组时,保留到allList和init_list中(定义见data)
  • selList_handle:解决初始化时从父组件那拿到的已选项
组件利用
<Csearch     placeholder="水果"    :trans_unselList="FruitGroup_List"    :trans_selList="res_FruitGroup_List"    @func="getFruitGroup_List" />import Csearch from '../c-search/index.vue'components: {    Csearch},
  • import引入——>组件注册——>应用
  • 父——>子传参:

    • placeholder:父组件传递的输出提醒文字
    • trans_unselList:父组件传递的未选列表
    • isdisabled:父组件传递的该选择器禁用状态
    • trans_selList:父组件传递的已选列表
事件钩子
// 拿到抉择的水果getFruitGroup_List (list) {  this.sel_FruitGroup_List = list  ...do something}
  • getFruitGroup_List:拿到抉择的水果
github

残缺代码:https://github.com/littleOneYuan/c_select