element-ui的el-color-picker颜色选择器组件,弹窗定位在左上角的问题排查和解决

1.问题复现场景

拿官网实例截个图说明一下

由于需要替换第三方插件的颜色选择器,所以打算用element-ui直接替换,故在第三方插件初始化颜色选择器的类中返回element-uicolor-picker组件

typescript 复制代码
import { ColorPicker } from 'element-ui';

class ColorController {
    constructor(parent, object, property, rgbScale) {
        const Picker = Vue.extend(ColorPicker)
        const instance = new Picker({
            propsData: {
                value: object[property],
                showAlpha: true
            }
        })

        instance.$on('change', (v) => {
            console.log('color-change', v)
            this._setValueFromHexString(v);
        })
        let div = document.createElement('div')
        this.$widget.appendChild(div) // this.$widget为第三方插件生成颜色选择器的dom节点
        instance.$mount(div)
    }
  ... // 省略第三方插件其他源代码
}

2.问题根源

1.el-color-picker颜色选择器弹窗基于父级组件dom动态计算所在位置,显示定位; 2.由于第三方插件ColorController类构造函数内生成el-color-picker组件实例所挂载的dom节点被替换,导致获取到this.$parent.$el为空,在渲染颜色选择器弹窗时,无法得到有效的位置,所以弹窗只能显示在页面左上角

3.解决方案

1.自定义一个颜色选择器组件,导入el-color-picker组件进行包装套壳,确保颜色选择器弹窗能获取正确的父级节点

xml 复制代码
// 自定义颜色选择器组件 color-picker
<template>
  <div class="color-picker">
    <ColorPicker v-model="color" :showAlpha="showAlpha"></ColorPicker>
  </div>
</template>

<script>
import { ColorPicker } from 'element-ui';
export default {
  name: 'color-picker',
  props: {
    value: {
      type: String,
      default: '#ffffff',
    },
    showAlpha: {
      type: Boolean,
      default: true
    }
  },
  components: {
    ColorPicker,
  },
  data() {
    return {
    };
  },
  computed: {
    color: {
      get() {
        return this.value;
      },
      set(val) {
        this.$emit('change', val);
      },
    },
  },
  methods: {},
};
</script>

<style lang="scss" scoped>
.color-picker {
  background-color: transparent;
}
</style>

2.修改第三方组件库ColorController

javascript 复制代码
import ColorPicker from './color-picker.vue'; // 引入包装过的自定义组件

class ColorController {
    ... // 其它代码保持不变
}
相关推荐
方也_arkling28 分钟前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
毕设源码-朱学姐30 分钟前
【开题答辩全过程】以 基于web教师继续教育系统的设计与实现为例,包含答辩的问题和答案
前端
web打印社区44 分钟前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
RFCEO1 小时前
前端编程 课程十三、:CSS核心基础1:CSS选择器
前端·css·css基础选择器详细教程·css类选择器使用方法·css类选择器命名规范·css后代选择器·精准选中嵌套元素
Amumu121381 小时前
Vuex介绍
前端·javascript·vue.js
We་ct1 小时前
LeetCode 54. 螺旋矩阵:两种解法吃透顺时针遍历逻辑
前端·算法·leetcode·矩阵·typescript
2601_949480062 小时前
【无标题】
开发语言·前端·javascript
css趣多多2 小时前
Vue过滤器
前端·javascript·vue.js
理人综艺好会3 小时前
Web学习之用户认证
前端·学习
We་ct3 小时前
LeetCode 36. 有效的数独:Set实现哈希表最优解
前端·算法·leetcode·typescript·散列表