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

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

从左到右别离是:未选中状态、鼠标悬浮、选中、增加组合按钮

性能形容
  1. 增加/删除组合
  2. 单击聚焦组合
  3. 双击批改组合名字
  4. 切换下一个组合或者新增组合时上一个组合内容固定
  5. 组合不能清空,能够设置组合数量下限
构造代码
<template>  <div class="c-combine">    <div class="comBox">      <div v-for="(item,idx) in com_arr" :key="item.id" class="comcell" :class="{'selcomcell': item.selected}" @click="selcom_handle(idx)">        <span v-if="!item.edit" @dblclick.stop="name_click(2, idx)" @click.stop="name_click(1, idx)">{{item.name}}</span>        <input v-else v-model="item.name" type="text" placeholder="组合名" maxlength="5" class="name-input" @focus="name_input(idx)" @blur="input_over(idx,item.name)" @click.stop>        <Icon type="md-close-circle" @click.stop="close_com(idx)" />      </div>      <button type="text" class="add-btn" @click="addcom_handle()">+增加</button>    </div>  </div></template>
  • 依据edit确定编辑状态还是文本显示状态
  • selected确定选中状态还是未选中状态
逻辑代码
// 输出组合名字name_input (idx) {  // console.log('聚焦')},// 组合名字输出结束input_over (idx, name) {  this.com_arr[idx].edit = false  // console.log('失焦')  this.$emit('changename', idx, name)  this.$emit('synfun', this.com_arr)},name_click (_type, idx) {  var self = this  clearTimeout(this.timer)  if (_type === 1) { // 单击某个组合    if (event.detail === 2) return    this.timer = setTimeout(function () {      // console.log('单击')      let last_sel_id = 0      if (isArray(self.com_arr)) {        self.com_arr.forEach(com => {          if (com.selected)last_sel_id = com.id          com.edit = false          com.selected = false        })        self.com_arr[idx].selected = true        self.$emit('fixfun', 'click', last_sel_id, idx)      }    }, 100)  } else {    // console.log('双击')    this.com_arr[idx].edit = true  }  this.$emit('synfun', this.com_arr)},// 选中某个组合selcom_handle (idx) {  if (isArray(this.com_arr)) {    let last_sel_id = 0    this.com_arr.forEach(com => {      if (com.selected)last_sel_id = com.id      com.selected = false    })    this.com_arr[idx].selected = true    this.$emit('synfun', this.com_arr)    this.$emit('fixfun', 'click', last_sel_id, idx)  }},// 删除某个组合close_com (idx) {  if (this.com_arr.length === 1) {    this.$Message.warning('组合不能清空哦-_-')  } else {    alert('删除' + (idx + 1) + 'id: ' + this.com_arr[idx].id)    let cur_idx = 999    if (this.com_arr[idx].selected) {      this.com_arr.splice(idx, 1)      this.com_arr[0].selected = true      cur_idx = 0    } else {      this.com_arr.splice(idx, 1)    }    this.$emit('synfun', this.com_arr)    this.$emit('delfun', idx, cur_idx)  }},// 新增组合addcom_handle () {  if (this.com_arr.length === this.max_com) {    this.$Message.warning('最多只能增加5个组合~.~')  } else if (isArray(this.com_arr)) {    let last_sel_id = 0    this.com_arr.forEach(com => {      if (com.selected)last_sel_id = com.id      com.selected = false      com.edit = false    })    const id_temp = genID(1)    const addcom = {      name: '双击命名',      content: {},      id: id_temp,      selected: true,      edit: true    }    this.com_arr.push(addcom)    this.$emit('synfun', this.com_arr)    this.$emit('fixfun', 'add', last_sel_id, addcom)  }}
  • 解决新增组合事件
  • 删除某个组合事件
  • 选中某个组合事件
  • 单击或双击某个组合事件(单击选中/双击改名)
  • 输出组合名完结事件
组件利用
<div class="combineDiv" v-if="com_show">  <Ccombine    :com_arr="com_arr"    :max_com="max_com"    @synfun="syn_handle"    @fixfun="fix_handle"    @delfun="del_handle"    @changename="changename_handle"  /></div>import Ccombine from '@/components/c-combine/index.vue'components: {    Ccombine}data () {    return {        max_com: 5, // 组合最大数量        com_arr: [{ // 默认组合            name: '组合6',            content: {},            id: 0,            selected: true,            edit: false        }]    }}
  • import引入——>组件注册——>应用
  • 父——>子传参:com_arr初始组合、max_com组合的最大数量
事件钩子
syn_handle (newValue) {  this.com_arr = newValue},// 上一个组合内容固定fix_handle (motion, last_sel_id, param) {    // motion:动作'add'/'click'新增或者切换    // last_sel_id:上一个聚焦的组合id    // param:'add'对应addcom/'click'对应cur_idx},// 删除某个组合del_handle (idx, cur_idx) {    // idx:删除的组合index,cur_idx删除的组合Index},// 组合改名字changename_handle (idx, name) {    // idx:批改名字组合的idx,name:批改后的新组合名}
  • syn_handle:同步解决,子组件里的组合更改同步到父组件
  • fix_handle:固定组合内容解决,新增或者切换的时候固定上一个组合的content
  • del_handle:删除某个组合
  • changename_handle:组合改名字
github

残缺代码:https://github.com/littleOneY...