IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue自定义颜色选择器 -> 正文阅读

[JavaScript知识库]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>

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:52:39  更:2022-01-14 01:55:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:05:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码