首页 > 其他 > 详细

vue 自定义类似checkbox选中功能

时间:2020-06-09 11:48:19      阅读:144      评论:0      收藏:0      [点我收藏+]
<template>
  <div class="checkbox-item">
    <span ref="ct" @click="change">{{label}}</span>
  </div>
</template>
<script>
export default {
  name: checkbox-item,
  components: {},
  props: {
    label: String, // 名称
    list: Array // 选中数组
  },
  data () {
    return {
      isClick: false // 是否选中
    }
  },
  methods: {
    change () {
      // 点击事件 后改变当前选中内容样式
      if (this.isClick) {
        // 未选状态
        this.$refs.ct.style.color = ‘‘
        this.$refs.ct.style.fontWeight = ‘‘
        // 从选中内容数组中删除当前对象
        let index = this.list.findIndex(d => d == this.label)
        this.list.splice(index, 1)
        this.$emit(change-event, this.list)
      } else {
        // 已选选状态
        this.$refs.ct.style.color = black
        this.$refs.ct.style.fontWeight = bold
        // 添加当前对象到选中数组
        this.list.push(this.label)
        this.$emit(change-event, this.list)
      }
      this.isClick = !this.isClick
    },
    onClick (data) {
      // 父组件调用 设置默认选中值
      data.$refs.ct.style.color = black
      data.$refs.ct.style.fontWeight = bold
      data.isClick = true
      // 注释条件是判断当前对象是否已经存在 添加对象到选中数组中
      //   if (this.list.find(d => d == this.label) == null) {
      this.list.push(this.label)
      //   }
      this.$emit(change-event, this.list)
    },
    unClick (data) {
      // 父组件调用 清空选中(预配置功能 全清选中)
      this.$refs.ct.style.color = ‘‘
      this.$refs.ct.style.fontWeight = ‘‘
      data.isClick = false
      let index = this.list.findIndex(d => d == this.label)
      this.list.splice(index, 1)
      this.$emit(change-event, this.list)
    }
  }
}
</script>
<style lang="less" scoped>
.checkbox-item {
    text-align: center;
    span {
        cursor: pointer;
        color:#ccc;
        display:inline-block;
    }
    :hover {
        color:black;
        font-weight: bold;
    }
}
</style>
<template>
  <div class="checkbox-table">
    <el-row>
      <el-row :gutter="2">
        <el-col :span="4" style="text-align:center">
          <el-form-item>
            <span>使用类型:</span>
          </el-form-item>
        </el-col>
        <el-col :span="4">
          <el-form-item>
            <checkbox-item label="自用" :list="checkedCitiesSelect" @change-event="handleCheckedCitiesChangeSelect"></checkbox-item>
          </el-form-item>
        </el-col>
        <el-col :span="4">
          <el-form-item>
            <checkbox-item label="租用" :list="checkedCitiesSelect" @change-event="handleCheckedCitiesChangeSelect"></checkbox-item>
          </el-form-item>
        </el-col>
        <el-col :span="4">
          <el-form-item>
            <checkbox-item label="混用" :list="checkedCitiesSelect" @change-event="handleCheckedCitiesChangeSelect"></checkbox-item>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="2">
        <el-col :span="4" style="text-align:center">
          <el-form-item>
            <span>应用行业:</span>
          </el-form-item>
        </el-col>
        <el-col :span="4">
          <el-form-item>
            <div style="text-align:center;color: white;background: lightblue;">
              <span>港口建设</span>
            </div>
            <checkbox-item ref="checkboxItem" v-for="city in cities" :key="city" :label="city" :list="checkedCities" @change-event="handleCheckedCitiesChange"></checkbox-item>
          </el-form-item>
        </el-col>
        <el-col :span="4">
          <el-form-item>
            <div style="text-align:center;color: white;background: lightblue;">
              <span>港口建设</span>
            </div>
            <checkbox-item ref="checkboxItem" v-for="city in cities" :key="city" :label="city" :list="checkedCities" @change-event="handleCheckedCitiesChange"></checkbox-item>
          </el-form-item>
        </el-col>
      </el-row>
    </el-row>
  </div>
</template>
<script>
import Mock from mockjs
import checkboxItem from ../components/checkbox-item
// 使用mock模拟数据
var data = Mock.mock({
  list|20: [{
    id|+1: /[a-z][A-Z][0-9]/
  }]
})
console.log(data)
const cityOptions = data.list.map(obj => { return obj.id })
export default {
  name: chechbox-table,
  components: { checkboxItem },
  props: {
    info: Array
  },
  data () {
    return {
      checkAll: false,
      checkedCities: [], // 选中的对象
      checkedCitiesSelect: [], // 筛选条件选中的对象
      cities: cityOptions // 数据集合
    }
  },
  mounted () {
    // 模拟初始化选中
    let checkList = [gE4, qG1, jZ4, uN4, rQ1, dD4, kY2, yU3, pQ3]
    this.$options.methods.check.bind(this)(checkList)
  },
  methods: {
    check (lis) {
      if (lis != null) {
        // 设置选中
        this.$refs.checkboxItem.forEach((data, index) => {
          if (lis.find(d => d == data.label) != null) {
            data.onClick(data)
          }
        })
      }
    },
    handleCheckedCitiesChange (val) {
      // 子组件回调当前选中的内容
      console.log(val)
    },
    handleCheckedCitiesChangeSelect (val) {
      // 子组件回调当前选中的内容 筛选条件
      console.log(val)
    }
  }
}
</script>
<style lang="less" scoped>
.checkItem {
    .el-checkbox{
        display: table-row-group;
    }
}
#checkbox-table .el-form-item__label{
  text-align: center;
}
</style>

效果图

技术分享图片

vue 自定义类似checkbox选中功能

原文:https://www.cnblogs.com/Uyde/p/13071532.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!