Element UI ColorPicker 实时更新绑定值并转换 Hex 颜色的完整方案
在 Element UI 的 ColorPicker 组件中,默认需要通过确认按钮(或关闭颜色选择面板)才会触发 v-model 的更新。若希望实时更新绑定值(如拖动选色时立即生效),可以通过监听 active-change 事件实现。以下是具体解决方案:
html
<template>
<el-color-picker
v-model="color"
@active-change="handleActiveChange"
/>
</template>
<script>
export default {
data() {
return {
color: ''
}
},
methods: {
handleActiveChange(newColor) {
// 直接更新绑定值,无需等待确认
this.color = newColor;
}
}
}
</script>
至此,不需要颜色转换的童鞋已经可以右上角点叉了。但是我们项目里面用hex格式会方便一些,然而此处的active-change的参数中color字符串的格式是rgb的,因此还需要找一下有没有方案能转换成hex格式。于是看到colorPicker的配置项里面有color-format,于是就走了以下弯路:
html
<template>
<el-color-picker
v-model="color"
color-format="hex"
@active-change="handleActiveChange"
/>
</template>
结果就是配置了之后active-change中还是接收到rgb格式的字符串。这个时候必须狠狠的阅读一下源码,准备在心里制裁审判写这个代码的家伙学习一下大佬的思路
这里的displayedRgb是把颜色统一成rgb格式,方便后面对比颜色是否相同。所以color-format并不能影响active-change的传参,那么只能考虑自行转换了。本来已经准备在AI上面copy一段rgb转hex的代码,转头又想看看element-ui的大佬是怎么转换的颜色,结果发现人家早就在colorPicker中提供了一个处理颜色Color类。于是再次狠狠阅读一下Color的源码。
好好好,原来谜底就在谜面上
改造一下代码
html
<script>
import Color from 'element-ui/packages/color-picker/src/color';
export default {
data() {
return {
color: ''
}
},
methods: {
handleActiveChange(newColor) {
const newColor = new Color({
enableAlpha: false,
format: 'hex'
})
newColor.fromString(colorStr);
this.value = newColor.value;
}
}
}
</script>
okk, 问题解决,下班收工