feat: convert color select component to composition API

This commit is contained in:
IchliebedichZhu 2024-03-08 14:54:48 +00:00
parent 8de5dc08f8
commit 9f95a64582

View File

@ -6,67 +6,75 @@
<div class="content"> <div class="content">
<el-popover placement="left-end" trigger="click" width="auto" @after-enter="enter" @before-leave="hide"> <el-popover placement="left-end" trigger="click" width="auto" @after-enter="enter" @before-leave="hide">
<!-- eslint-disable-next-line vue/no-v-model-argument --> <!-- eslint-disable-next-line vue/no-v-model-argument -->
<color-picker v-model:value="innerColor" :modes="modes" @change="colorChange" @nativePick="dropColor" /> <color-picker v-model:value="state.innerColor" :modes="modes" @change="colorChange" @nativePick="dropColor" />
<template #reference> <template #reference>
<div class="color__bar" :style="{ background: innerColor }"></div> <div class="color__bar" :style="{ background: state.innerColor }"></div>
</template> </template>
</el-popover> </el-popover>
</div> </div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
const NAME = 'color-select' // const NAME = 'color-select'
import { defineComponent, toRefs, reactive, computed, onMounted, watch } from 'vue' import {reactive, onMounted, watch } from 'vue'
import { useStore } from 'vuex' import { useStore } from 'vuex'
// import { debounce } from 'throttle-debounce' // import { debounce } from 'throttle-debounce'
// import { toolTip } from '@/common/methods/helper' // import { toolTip } from '@/common/methods/helper'
// import colorPicker from '@/utils/plugins/color-picker/index.vue' // import colorPicker from '@/utils/plugins/color-picker/index.vue'
import colorPicker from '@palxp/color-picker' import colorPicker from '@palxp/color-picker'
export default defineComponent({ type TProps = {
name: NAME, label?: string
components: { colorPicker }, modelValue?: string
inheritAttrs: false, width?: string
props: { modes?: string[]
label: { }
default: '',
}, type TEmits = {
modelValue: { (event: 'finish', data: string): void
default: '', (event: 'update:modelValue', data: string): void
}, (event: 'change', data: string): void
width: { }
default: '100%',
}, type TState = {
modes: { innerColor: string
default: () => ['纯色'], }
},
}, const props = withDefaults(defineProps<TProps>(), {
emits: ['finish', 'update:modelValue', 'change'], label: '',
setup(props, { emit }) { modelValue: '',
const store = useStore() width: '100%',
const state: any = reactive({ modes: () => (['纯色'])
})
const emit = defineEmits<TEmits>()
const store = useStore()
const state = reactive<TState>({
innerColor: '', innerColor: '',
// colorLength: 0, // colorLength: 0,
// hasEyeDrop: 'EyeDropper' in window, // hasEyeDrop: 'EyeDropper' in window,
}) })
let first = true let first = true
// const dColorHistory = computed(() => { // const dColorHistory = computed(() => {
// return store.getters.dColorHistory // return store.getters.dColorHistory
// }) // })
onMounted(() => { onMounted(() => {
if (props.modelValue) { if (props.modelValue) {
let fixColor = props.modelValue + (props.modelValue.length === 7 ? 'ff' : '') let fixColor = props.modelValue + (props.modelValue.length === 7 ? 'ff' : '')
// @palxp/color-picker16 // @palxp/color-picker16
state.innerColor = fixColor.toLocaleUpperCase() state.innerColor = fixColor.toLocaleUpperCase()
} }
}) })
const dropColor = async (e: any) => {
console.log('取色: ', e)
}
watch( const dropColor = async (color: string) => {
console.log('取色: ', color)
}
watch(
() => state.innerColor, () => state.innerColor,
(value) => { (value) => {
activeChange(value) activeChange(value)
@ -76,48 +84,51 @@ export default defineComponent({
} }
// addHistory(value) // addHistory(value)
}, },
) )
watch(
watch(
() => props.modelValue, () => props.modelValue,
(val) => { (val) => {
val !== state.innerColor && (state.innerColor = val) val !== state.innerColor && (state.innerColor = val)
}, },
) )
const updateValue = (value: any) => { const updateValue = (value: any) => {
emit('update:modelValue', value) emit('update:modelValue', value)
} }
const activeChange = (value: any) => {
const activeChange = (value: any) => {
updateValue(value) updateValue(value)
} }
const onChange = () => {
const onChange = () => {
emit('finish', state.innerColor) emit('finish', state.innerColor)
} }
// const addHistory = debounce(300, false, async (value) => {
// store.dispatch('pushColorToHistory', value)
// })
// const colorChange = debounce(150, false, async (e) => {
// state.innerColor = e + (e.length === 7 ? 'ff' : '')
// })
const inputBlur = (color: string) => { // const addHistory = debounce(300, false, async (value) => {
// store.dispatch('pushColorToHistory', value)
// })
// const colorChange = debounce(150, false, async (e) => {
// state.innerColor = e + (e.length === 7 ? 'ff' : '')
// })
const inputBlur = (color: string) => {
state.innerColor = color state.innerColor = color
} }
const enter = () => { const enter = () => {
store.commit('setShowMoveable', false) // store.commit('setShowMoveable', false) //
} }
const hide = () => { const hide = () => {
store.commit('setShowMoveable', true) // store.commit('setShowMoveable', true) //
} }
const colorChange = (e) => { const colorChange = (color: string) => {
emit('change', e) emit('change', color)
} }
return { defineExpose({
...toRefs(state),
// dColorHistory, // dColorHistory,
activeChange, activeChange,
onChange, onChange,
@ -126,8 +137,6 @@ export default defineComponent({
enter, enter,
hide, hide,
colorChange, colorChange,
}
},
}) })
</script> </script>