Checkbox.vue 2.93 KB
<template>
  <div style="display: inline-block" class="check-box">
    <el-checkbox-group v-model="cbVal" @change="handleChange">
      <el-checkbox
        v-for="(item, index) in checkboxOptions"
        :key="index"
        :label="item.value"
      >{{ item.label }}</el-checkbox>
    </el-checkbox-group>
  </div>
</template>
<script>
import { apiMap } from '../../fieldConfig/apis'
export default {
  name: 'RcCheckbox',
  components: {},
  model: {
    prop: 'value',
    event: 'change'
  },
  props: {
    value: {
      type: Array,
      default: () => []
    },
    options: {
      type: Array,
      default() {
        return [
          {
            value: '1',
            label: '选项一'
          }
        ]
      }
    },
    optionMode: {
      type: String,
      default() {
        return 'static'
      }
    },
    optionApi: {
      type: Object,
      default() {
        return {}
      }
    }
  },
  data() {
    return {
      cbVal: this.value,
      checkboxOptions: []
    }
  },
  computed: {},
  watch: {
    value(val) {
      this.cbVal = val
    },
    optionMode(val) {
      this.value = []
      switch (val) {
        case 'static': this.checkboxOptions = this.options; return
        case 'origin': this.originOptions(this.optionApi); return
      }
    },
    optionApi: {
      deep: true,
      handler(val) {
        this.value = []
        this.originOptions(val)
      }
    }
  },
  created() {},
  beforeMount() {
    if (this.optionMode === 'origin') {
      this.originOptions(this.optionApi)
    } else {
      this.checkboxOptions = this.options
    }
  },
  mounted() {},
  methods: {
    handleChange(selectVal) {
      this.$emit('change', selectVal)
      if (selectVal instanceof Array) {
        const selectLabel = []
        selectVal.forEach(val => {
          // val 为 option 的value
          this.checkboxOptions.some(option => {
            if (option.value === val) {
              selectLabel.push(option.label)
              // 终止循环
              return true
            }
          })
        })
        this.$emit('changeObj', JSON.stringify(selectLabel))
      }
    },
    originOptions(config) {
      if (config.mode === 'builtIn') {
        if (config.builtIn === '') {
          this.$message('请配置内置api接口')
        } else {
          apiMap[config.builtIn](this, '', (res) => {
            if (res.data instanceof Array) {
              const optionArray = []
              res.data.forEach(item => {
                optionArray.push({
                  label: item.label || item.name,
                  value: item.value || item.businessId || item.id
                })
              })
              this.checkboxOptions = optionArray
            } else {
              this.checkboxOptions = []
            }
          })
        }
      } else {
      }
    }
  }
}
</script>
<style scoped lang="stylus">
  .check-box{
    width calc(100% - 75px)
    vertical-align middle
  }
</style>