| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- <template>
- <div class="wk-checkbox">
- <template v-if="valueIsObject">
- <el-select
- v-if="showType === 'default'"
- v-model="dataValue.select"
- :disabled="disabled"
- :clearable="clearable"
- :placeholder="placeholder"
- style="width: 100%;"
- multiple
- @change="valueChange">
- <el-option
- v-for="(item, index) in options"
- :key="index"
- :label="!isEmptyValue(item.value) ? item.label || item.name : item "
- :value="getValue(item)"/>
- </el-select>
- <el-checkbox-group
- v-else-if="showType === 'tiled'"
- v-model="dataValue.select"
- :disabled="disabled"
- @change="valueChange">
- <el-checkbox
- v-for="(item, index) in options"
- :key="index"
- :label="getValue(item)">
- {{ !isEmptyValue(item.value) ? item.label || item.name : item }}
- </el-checkbox>
- </el-checkbox-group>
- <el-input
- v-if="dataValue.select.includes('其他')"
- v-model="dataValue.otherValue"
- :disabled="disabled"
- :maxlength="100"
- placeholder="其他选项需填写,否则为无效选项"
- @blur="inputBlur"/>
- </template>
- </div>
- </template>
-
- <script>
- import { isObject, isEmpty, isArray } from '@/utils/types'
- import { valueEquals } from 'element-ui/lib/utils/util'
- import Emitter from 'element-ui/lib/mixins/emitter'
- export default {
- // 自定义字段库 多选
- name: 'WkCheckbox',
-
- components: {},
-
- mixins: [Emitter],
-
- props: {
- // eslint-disable-next-line vue/require-prop-types
- value: {},
- // 选择其他展示input输入框
- otherShowInput: {
- type: Boolean,
- default: false
- },
- disabled: Boolean,
- clearable: Boolean,
- placeholder: String,
- options: {
- type: Array,
- default: () => {
- return []
- }
- },
- showType: {
- type: String,
- default: 'default' // 下拉 default 平铺 tiled
- }
- },
-
- data() {
- return {
- dataValue: {
- select: [],
- otherValue: ''
- }
- }
- },
-
- computed: {
- valueIsObject() {
- return isObject(this.dataValue)
- }
- },
-
- watch: {
- value: {
- handler(newVal, oldVal) {
- this.validValue()
- },
- immediate: true
- },
- options: {
- handler() {
- this.validValue()
- },
- deep: true
- }
- },
-
- created() {
- },
-
- mounted() {},
-
- beforeDestroy() {},
-
- methods: {
- /**
- * 验证值
- */
- validValue() {
- if (isEmpty(this.value)) {
- this.dataValue = {
- select: [],
- otherValue: ''
- }
- } else {
- if (this.otherShowInput) {
- const value = isArray(this.value) ? this.value : []
- const otherItem = value.filter((name) => !this.options.includes(name))
- if (otherItem.length > 0) {
- const newValue = value.filter((name) => !otherItem.includes(name))
- newValue.push('其他')
- this.dataValue = {
- select: newValue,
- otherValue: otherItem[otherItem.length - 1]
- }
- } else {
- if (!valueEquals(value, this.dataValue.select)) {
- this.dataValue = {
- select: value,
- otherValue: ''
- }
- }
- }
- } else {
- this.dataValue = {
- select: this.value,
- otherValue: ''
- }
- }
- }
- },
-
- /**
- * 选项值
- */
- getValue(item) {
- return !this.isEmptyValue(item.value) ? item.value : item
- },
-
- /**
- * 判断是空值
- */
- isEmptyValue(value) {
- return value === null || value == undefined
- },
-
- /**
- * 值更新
- */
- valueChange() {
- if (this.dataValue.select.includes('其他')) {
- const newValue = this.dataValue.select.filter(item => item !== '其他')
- newValue.push(this.dataValue.otherValue.trim())
- this.$emit('input', newValue)
- this.$emit('change', newValue)
- this.dispatch('ElFormItem', 'el.form.change', newValue)
- } else {
- this.dataValue.otherValue = ''
- this.$emit('input', this.dataValue.select)
- this.$emit('change', this.dataValue.select)
- this.dispatch('ElFormItem', 'el.form.change', this.dataValue.select)
- }
- },
-
- /**
- * 失去焦点
- */
- inputBlur() {
- this.valueChange()
- // const value = this.dataValue.otherValue
- // const eIsObject = this.options.length > 0 && !this.isEmptyValue(this.options[0].value)
- // const has = this.options.find(item => {
- // if (eIsObject) {
- // return item.value === value.trim()
- // } else {
- // return item === value.trim()
- // }
- // })
- // if (has) {
- // this.dataValue.otherValue = ''
- // }
- // this.$emit('change', this.dataValue.select)
- // this.$emit('input', this.dataValue.select)
- }
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .wk-checkbox {
- .el-input {
- margin-top: 5px;
- }
-
- .el-checkbox-group {
- line-height: 1.5;
- }
- }
- </style>
|