vue颜色选择器插件

样式效果

在这里插入图片描述

说明

以上效果是基于第三方插件二次封装得来。 默认第三方插件只有如下样式:
在这里插入图片描述
第三方插件源码地址: vColorPicker

使用 :

1. 安装插件
npm install vcolorpicker -S
2. 全局注册
# main.js
import vcolorpicker from 'vcolorpicker'
Vue.use(vcolorpicker)
3. 基于vColorPicker二次封装子组件 : ColorPick
子组件文档说明
传参props :

color:数据类型(字符),默认颜色值(非必须)

插槽slot:

inset:自定义按钮样式

事件event:

change :颜值值改变, 参数:(新的颜色 )

<template>
  <div
    style="height:38px;"
    @click="openColor"
  >
    <slot
      name="inset"
      :row="nowColor"
    ></slot>
    <colorPicker
      style="marginLeft:10px;marginTop:-20px"
      ref="colorPicker"
      v-model="nowColor"
      @hide="close"
      :defaultColor="nowColor"
      @change="headleChangeColor"
    ></colorPicker>
  </div>
</template>

<script>
export default {
  data () {
    return {
      nowColor: ""
    }
  },
  created () {
    this._initData()
  },
  watch: {
    color: '_initData'
  },
  beforeMount(){
    this._close = (e)=>{
      if(this.$el.contains(e.target)) return
        this.$emit('hide')
    }
    document.body.addEventListener('click', this._close)
  },
  beforeDestroy(){
    document.body.removeEventListener('click',this._close)
  },
  props: {
    color: {
      type: String,
      default: "#7993ae"
    }
  },
  methods: {
    _initData () {
      this.nowColor = this.$props.color
    },
    headleChangeColor (item) {
      this.$emit('change', item)
    },
    openColor () {
      this.$refs.colorPicker.openPanel()
      this.$emit('open')
    },
  },
}
</script>

<style scoped lang="less">
/deep/ .m-colorPicker .colorBtn {
  width: 0;
  height: 0;
}
</style>

4. 父组件调用
<template>
  <div style="width:100px">
    <ColorPick
      @change="change"
      @open="changeDom(true)"
      @hide="changeDom(false)"
      :color="color"
    >
      <template v-slot:inset="{row}">
        <div class="selectColor">
          <div
            class="box"
            :style="{backgroundColor:row}"
          ></div>
          <div
            class="el-icon-arrow-up change"
            ref="rotate"
          ></div>
        </div>
      </template>
    </ColorPick>
  </div>
</template>

<script>
import ColorPick from "./children/index.vue"

export default {
  data () {
    return {
      color: '#ccc'
    }
  },
  methods: {
    // change颜色改变
    change () { 
      this.changeDom(false)
    },
    // 边框和连接线的颜色选择样式切换
    changeDom (item) {
      this.$refs.rotate.className = item ? "el-icon-arrow-up change rotate" : "el-icon-arrow-up change"
    },

  },
  components: {
    ColorPick
  }
}
</script>

<style scoped lang="less">
.selectColor {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
  height: 40px;
  border: 1px solid #dcdfe6;
  box-sizing: border-box;
  border-radius: 6px;
  cursor: pointer;
  .box {
    position: static;
    width: 48px;
    height: 20px;
    left: 8px;
    top: 6px;
    background: #6866ff;
    border-radius: 4px;
    flex: none;
    order: 0;
    flex-grow: 0;
    margin: 0px 4px;
  }
 
  .change {
    transition: all 0.5s;
    transform: rotate(180deg);
    margin-right: 10px !important;
    color: #dccfce;
  }
  .rotate {
    transform: rotate(0deg);
  }
}
</style>

补充说明

如果该功能作用在 el-popover中, 就会存在在el-popover组件中无法执行给body添加的click事件,因此,就无法执行回调的hide参数。
解决办法:

  1. 不需要ui样式切换效果。三角箭头直接朝下即可
  2. 修改导入的插件加上emit事件。如下:
    2.1 复制node_modules下的vColorPicker插件,拷贝出来到自定义组件中。
    2.2 修改对应文件,下图中lib文件夹下第一个为未压缩的,第二个为压缩的。默认使用的是压缩文件。因此需要修改压缩文件。全局找到 closePanel 方法,添加如下代码 this. e m i t ( ′ h i d e ′ ) ; 上 一 行 可 加 上 t h i s . emit('hide'); 上一行可加上this. emit(hide);this.emit(‘show’); 作为传参出来。
    在这里插入图片描述

2.3 最终子组件需要为如下, 父组件调用不做修改

<template>
  <div
    style="height:38px;"
    @click="openColor"
  >
    <slot
      name="inset"
      :row="nowColor"
    ></slot>
    <colorPicker
      style="marginLeft:10px;marginTop:-20px"
      ref="colorPicker"
      v-model="nowColor"
      @hide="close"
      :defaultColor="nowColor"
      @change="headleChangeColor"
    ></colorPicker>
  </div>
</template>

<script>
export default {
  data () {
    return {
      nowColor: ""
    }
  },
  created () {
    this._initData()
  },
  watch: {
    color: '_initData'
  },
  
  props: {
    color: {
      type: String,
      default: "#7993ae"
    }
  },
  methods: {
    _initData () {
      this.nowColor = this.$props.color
    },
    headleChangeColor (item) {
      this.$emit('change', item)
    },
    openColor () {
      this.$refs.colorPicker.openPanel()
      this.$emit('open')
    },
    close () {
      this.$emit('hide');
    }
  },
}
</script>

<style scoped lang="less">
/deep/ .m-colorPicker .colorBtn {
  width: 0;
  height: 0;
}
</style>

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值