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 {
    ... // 其它代码保持不变
}
相关推荐
漂流瓶jz19 分钟前
Webpack中各种devtool配置的含义与SourceMap生成逻辑
前端·javascript·webpack
前端架构师-老李30 分钟前
React 中 useCallback 的基本使用和原理解析
前端·react.js·前端框架
木易 士心1 小时前
CSS 中 `data-status` 的使用详解
前端·css
明月与玄武1 小时前
前端缓存战争:回车与刷新按钮的终极对决!
前端·缓存·回车 vs 点击刷新
牧马少女1 小时前
css 画一个圆角渐变色边框
前端·css
zy happy2 小时前
RuoyiApp 在vuex,state存储nickname vue2
前端·javascript·小程序·uni-app·vue·ruoyi
小雨青年2 小时前
Cursor 项目实战:AI播客策划助手(二)—— 多轮交互打磨播客文案的技术实现与实践
前端·人工智能·状态模式·交互
小光学长2 小时前
基于Vue的儿童手工创意店管理系统as8celp7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
meichaoWen2 小时前
【Vue】Vue框架的基础知识强化
前端·javascript·vue.js
jingling5552 小时前
Flutter | 基础环境配置和创建flutter项目
前端·flutter