React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼
背景
在標(biāo)簽功能中,由于有「背景色」屬性,每次新增標(biāo)簽時(shí)都為選擇哪種顏色犯難。因此,我們思考如何通過JS代碼生成隨機(jī)顏色,提取一個(gè)通用的隨機(jī)顏色生成工具,并基于React框架封裝隨機(jī)顏色選擇器組件。
實(shí)際效果

原理與思路
作為前端開發(fā)人員,我們知道HTML接受 RGB、HEX、HSL三種格式的顏色。雖然是不同的格式,但是它們的本質(zhì)都是通過數(shù)字表達(dá)出顏色。
因?yàn)镽GB、HEX、HSL 本身都是數(shù)字,那么通過生成隨機(jī)數(shù)并組裝成符合格式要求的數(shù)字,也就達(dá)到預(yù)期隨機(jī)生成顏色的想法。
下面分別列舉RGB和HEX格式的隨機(jī)顏色生成思路
- 以RGB格式為例,rbg(0,0,0)代表黑色,rbg(255,255,255)代表白色。所以我們通過JS的Math.random方法隨機(jī)生成3個(gè)0~255之間的隨機(jī)數(shù),并且取整,將生成的三個(gè)隨機(jī)數(shù)進(jìn)行字符串拼接即可得到一個(gè)RGB格式的顏色。
- 以HEX格式為例,#000000代表黑色, #FFFFFF代表白色??梢园l(fā)現(xiàn)hex格式通常都是6位16進(jìn)制的數(shù)字,每?jī)晌?6進(jìn)制數(shù)字分為一組,比如1~2位代表red,3~4代表blue,5~6代表green。同樣的道理,通過Math.random方法隨機(jī)生成3個(gè)0~255之間的隨機(jī)數(shù),通過JS的toString(16)方法將10進(jìn)制隨機(jī)數(shù)轉(zhuǎn)化成16進(jìn)制格式,最后通過字符串拼接得到HEX格式的顏色。
核心代碼
- RBG格式隨機(jī)顏色生成方法
export function getRandomRGBColor(limit: number = 256) { //十六進(jìn)制顏色隨機(jī) const r = Math.floor(Math.random() * limit); const g = Math.floor(Math.random() * limit); const b = Math.floor(Math.random() * limit); const color = `rgb(${r},${g},$)`; return color; } - HEX格式隨機(jī)顏色生成方法
export function getRandomHEXColor(limit: number = 256) { const getRandomHexNumber = (limit: number): string => { let randomNum = Math.floor(Math.random() * limit).toString(16); if (randomNum.length < 2) { randomNum = "0" + randomNum; } return randomNum; }; //十六進(jìn)制顏色隨機(jī) const r = getRandomHexNumber(limit); const g = getRandomHexNumber(limit); const b = getRandomHexNumber(limit); const color = `#${r}${g}$`; return color; }
React組件
這是標(biāo)簽背景隨機(jī)顏色選擇器的React組件代碼,實(shí)現(xiàn)是非常簡(jiǎn)單的,可以直接復(fù)制使用。
實(shí)際運(yùn)行效果可以看本文最開始的「實(shí)際效果」截圖。
import { useMemo, useState } from "react";
import { getRandomColor } from "@/utils/color";
import classnames from "classnames";
import { Check, Refresh } from "@icon-park/react";
import { nanoid } from "nanoid";
interface ColorSelectProps {
defaultValue: string;
value?: string;
onChange?: (value: string) => void;
}
export default function ColorSelect(props: ColorSelectProps) {
const { defaultValue, value, onChange } = props;
// 用于重新生成顏色
const [randomId, setRandomId] = useState("");
const colors = useMemo(() => {
// 隨機(jī)生成6個(gè)顏色
return new Array(6).fill(0).map(() => getRandomColor());
}, [randomId]);
const targetColors = useMemo(() => {
// 過濾是否存在默認(rèn)值的情況
return [...colors, defaultValue || ""].filter(
v => !!v && !["#"].includes(v),
);
}, [defaultValue, colors]);
return (
<div className="flex gap-2">
{targetColors.map(color => {
console.log("color--->", color);
return (
<div
key={color}
data-color={color}
onClick={() => onChange?.(color)}
className={classnames(
"h-8 w-8 cursor-pointer flex justify-center items-center",
)}
style={{ backgroundColor: color }}>
{value === color && (
<Check theme="multi-color" size="24" fill="#fff" />
)}
</div>
);
})}
<div
className="h-8 w-8 cursor-pointer flex justify-center items-center border border-solid border-color-BGBrown text-color-BGBrown text-P4-Regular"
onClick={() => setRandomId(nanoid())}>
<Refresh theme="outline" size="18" fill="#333" />
</div>
</div>
);
}到此這篇關(guān)于React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼的文章就介紹到這了,更多相關(guān)React 隨機(jī)顏色選擇器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用React手寫一個(gè)對(duì)話框或模態(tài)框的方法示例
這篇文章主要介紹了使用React手寫一個(gè)對(duì)話框或模態(tài)框的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
關(guān)于React動(dòng)態(tài)加載路由處理的相關(guān)問題
這篇文章主要介紹了關(guān)于React動(dòng)態(tài)加載路由處理的相關(guān)問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01
詳解React Native 屏幕適配(炒雞簡(jiǎn)單的方法)
React Native 可以開發(fā) ios 和 android 的 app,在開發(fā)過程中,勢(shì)必會(huì)遇上屏幕適配,這篇文章主要介紹了詳解React Native 屏幕適配(炒雞簡(jiǎn)單的方法),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06
React?Hooks項(xiàng)目實(shí)戰(zhàn)
React?Hooks是React?16.8版本引入的新特性,它使得在函數(shù)組件中也能夠使用狀態(tài)(state)和其他React特性,本文就來詳細(xì)介紹一下React?Hooks項(xiàng)目實(shí)戰(zhàn),感興趣的可以了解一下2023-11-11

