parent
04f8642c33
commit
61f60316f3
3 changed files with 127 additions and 13 deletions
@ -0,0 +1,106 @@ |
||||
<template> |
||||
<div class="theme-color" :style="{backgroundColor: color}" @click="toggle"> |
||||
<a-icon v-if="sChecked" type="check" /> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import AIcon from 'ant-design-vue/es/icon/icon' |
||||
|
||||
const Group = { |
||||
name: 'ColorCheckBoxGroup', |
||||
props: { |
||||
defaultValues: { |
||||
type: Array, |
||||
required: false, |
||||
default: () => [] |
||||
} |
||||
}, |
||||
data () { |
||||
return { |
||||
values: this.defaultValues |
||||
} |
||||
}, |
||||
provide () { |
||||
return { |
||||
groupContext: this |
||||
} |
||||
}, |
||||
methods: { |
||||
handleChange (value) { |
||||
if (!value.checked) { |
||||
const values = this.values.filter(item => item.value !== value.value) |
||||
this.values = values |
||||
} else { |
||||
this.values.push(value) |
||||
} |
||||
this.$emit('change', this.values) |
||||
} |
||||
}, |
||||
render (h) { |
||||
const clear = h('div', {attrs: {style: 'clear: both'}}) |
||||
return h( |
||||
'div', |
||||
{}, |
||||
[this.$slots.default, clear] |
||||
) |
||||
} |
||||
} |
||||
|
||||
export default { |
||||
name: 'ColorCheckBox', |
||||
Group: Group, |
||||
components: {AIcon}, |
||||
props: { |
||||
color: { |
||||
type: String, |
||||
required: true |
||||
}, |
||||
value: { |
||||
type: String, |
||||
required: true |
||||
}, |
||||
checked: { |
||||
type: Boolean, |
||||
required: false, |
||||
default: false |
||||
} |
||||
}, |
||||
data () { |
||||
return { |
||||
sChecked: this.checked |
||||
} |
||||
}, |
||||
inject: ['groupContext'], |
||||
watch: { |
||||
'sChecked': function (val) { |
||||
const value = { |
||||
value: this.value, |
||||
color: this.color, |
||||
checked: this.sChecked |
||||
} |
||||
this.$emit('change', value) |
||||
this.groupContext.handleChange(value) |
||||
} |
||||
}, |
||||
methods: { |
||||
toggle () { |
||||
this.sChecked = !this.sChecked |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style lang="less" scoped> |
||||
.theme-color{ |
||||
float: left; |
||||
width: 20px; |
||||
height: 20px; |
||||
border-radius: 2px; |
||||
cursor: pointer; |
||||
margin-right: 8px; |
||||
text-align: center; |
||||
color: #fff; |
||||
font-weight: bold; |
||||
} |
||||
</style> |
Loading…
Reference in new issue