自定义颜色选择器的实现与应用(react-color,二次封装)

在现代的前端开发中,颜色选择器是一个非常实用的组件,它允许用户通过图形界面选择颜色,并将其应用到应用程序中。本文将介绍如何实现一个自定义的颜色选择器,并支持多种颜色格式的返回值。

1. 引言

颜色选择器在许多应用场景中都非常有用,例如网页设计工具、图形编辑器、主题定制工具等。本文将使用 React 和 react-color 库来实现一个功能强大的颜色选择器,并支持用户选择不同的颜色格式(如 hex、rgb、rgba、hsl)。

2. 项目准备

首先,确保你已经安装了 React 和 react-color 库。如果没有安装,可以使用以下命令进行安装:

js 复制代码
npm install react react-dom react-color antd

3. 实现颜色选择器

3.1 引入必要的库

在你的 React 组件文件中引入必要的库和样式:

js 复制代码
import React, { useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import { ChromePicker } from 'react-color';
import styles from "./index.module.less";
import { Popover } from "antd";

3.2 定义组件

定义 ColorPicker 组件,并设置其属性和状态:

js 复制代码
const ColorPicker = (props) => {
  const {
    onChange,
    colorValue,
    disabled,
    colorTitle,
    triggerPicker,
    previewStyle,
    colorReturnType
  } = props;
  const [color, setColor] = useState('');

  // 选取颜色
  const handleChangeComplete = (color) => {
    if (disabled) {
      return;
    }
    let colorVal;
    switch(colorReturnType) {
      case 'hex':
        colorVal = color.hex;
        break;
      case 'rgba':
        colorVal = `rgba(${color.rgb.r}, ${color.rgb.g}, ${color.rgb.b}, ${color.rgb.a})`;
        break;
      case 'rgb':
        colorVal = `rgb(${color.rgb.r}, ${color.rgb.g}, ${color.rgb.b})`;
        break;
      case 'hsl':
        colorVal = `hsl(${Math.round(color.hsl.h)}, ${Math.round(color.hsl.s * 100)}%, ${Math.round(color.hsl.l * 100)}%)`;
        break;
      default:
        colorVal = color.hex;
    }
    setColor(colorVal);
    onChange(colorVal);
  };

  useEffect(() => {
    setColor(colorValue);
  }, [colorValue]);

  return (
    <>
      {
        !disabled &&
        <Popover
          overlayClassName={styles.popover}
          content={
            <ChromePicker
              className={styles.sketchPicker}
              color={color}
              onChangeComplete={handleChangeComplete}
            />
          }
          title={colorTitle}
          trigger={triggerPicker}
        >
          <div className={styles.colorPicker} style={previewStyle}>
            <div className={styles.colorPickerColor} style={{background: colorValue}}/>
          </div>
        </Popover>
      }
      {
        disabled &&
        <div className={`${styles.colorPicker} ${styles.colorPickerDisabled}`} style={previewStyle}>
          <div className={styles.colorPickerColor} style={{background: colorValue}}/>
        </div>
      }
    </>
  );
}

3.3 设置属性类型和默认值

使用 PropTypes 定义组件的属性类型,并设置默认值:

js 复制代码
ColorPicker.propTypes = {
  // 事件
  onChange: PropTypes.func,
  // 值
  colorValue: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
  // 是否禁用
  disabled: PropTypes.bool,
  // 显示拾色器标题,默认不展示
  colorTitle: PropTypes.string,
  // 预览区样式,自定义预览区
  previewStyle: PropTypes.object,
  // 触发方式
  triggerPicker: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),
  // 选择完颜色返回的格式
  colorReturnType: PropTypes.oneOf(['hex', 'rgb', 'rgba', 'hsl'])
};

ColorPicker.defaultProps = {
  disabled: false,
  colorTitle: '',
  previewStyle: {},
  triggerPicker: 'click',
  colorReturnType: 'hex',
}

3.4 样式文件

在 index.module.less 文件中添加样式:

css 复制代码
.colorPicker {
  display: inline-block;
  width: 24px;
  height: 24px;
  border: 1px solid rgba(33, 40, 61, 1);
  border-radius: 1px;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
  cursor: pointer;
}

.colorPickerColor {
  width: 100%;
  height: 100%;
}

.colorPickerDisabled {
  cursor: not-allowed;
  opacity: 0.5;
}

.popover {
  padding: 10px;
}

.sketchPicker {
  width: 100%;
}

4. 使用颜色选择器

在你的应用中使用 ColorPicker 组件。以下是一个示例:

js 复制代码
import React, { useState } from 'react';
import PanelTitle from './../PanelTitle';
import { Form, Select, Space, InputNumber, Switch, Radio } from 'antd';
import ColorPicker from './../ColorPicker';

const GlobalConfig = () => {
  const [bgColor, setBgColor] = useState('#ffffff');
  const [colorFormat, setColorFormat] = useState('hex');

  return (
    <div>
      <PanelTitle title='全局配置' />
      <Form name='form' autoComplete='off'>
        <Form.Item name='colorFormat' label='颜色格式'>
          <Select
            value={colorFormat}
            onChange={(format) => setColorFormat(format)}
            options={[
              { value: 'hex', label: 'HEX' },
              { value: 'rgba', label: 'RGBA' },
              { value: 'rgb', label: 'RGB' },
              { value: 'hsl', label: 'HSL' },
            ]}
          />
        </Form.Item>
        <Form.Item name='screenBgColor'>
          <ColorPicker
            previewStyle={{ width: '100%' }}
            onChange={(color) => {
              console.log(color, 'color----');
              setBgColor(color);
            }}
            colorValue={bgColor}
            colorReturnType={colorFormat}
          />
        </Form.Item>
      </Form>
    </div>
  );
};

export default GlobalConfig;

5. 总结

通过本文,我们实现了一个功能强大的自定义颜色选择器,并支持多种颜色格式的返回值。这个颜色选择器可以很容易地集成到任何 React 应用中,为用户提供直观且易于使用的颜色选择功能。 希望这篇文章对你们有所帮助!如果有任何问题或建议,请随时留言。

相关推荐
kovlistudio9 分钟前
红宝书第三十六讲:持续集成(CI)配置入门指南
开发语言·前端·javascript·ci/cd·npm·node.js
Danta17 分钟前
面试场景题:性能的检测
前端·javascript·面试
龙萌酱35 分钟前
力扣每日打卡 50. Pow(x, n) (中等)
前端·javascript·算法·leetcode
Tetap1 小时前
element-plus color-pick扩展记录
前端·vue.js
H5开发新纪元1 小时前
从零开发一个基于 DeepSeek API 的 AI 助手:完整开发历程与经验总结
前端·架构
HHW1 小时前
告别龟速下载!NRM:前端工程师的镜像源管理加速器
前端
伶俜monster1 小时前
Threejs 奇幻几何体:边缘、线框、包围盒大冒险
前端·webgl·three.js
用户11481867894841 小时前
大文件下载、断点续传功能
前端·nestjs
顾林海1 小时前
Flutter 文本组件深度剖析:从基础到高级应用
android·前端·flutter
eason_fan1 小时前
在 Windows 环境下使用 Linux 命令行:Cygwin 的安装与配置
前端·命令行