๐ก react-color ์ ์ฉํ์ฌ "๋ฒํผ์ ๋๋ฅด๋ฉด ์ปฌ๋ฌํ๊ฐ ๋ณด์ฌ์ง๋ ๊ธฐ๋ฅ" ๋ง๋ค๊ธฐ
react-color
๐จ ์ฌ์ฉ library
- react-color
- antd
๐จ ์ ์ฉ ๊ณผ์
- antd์ Dropdown์ผ๋ก ๋ฒํผ๊ณผ dropdown ์์ฑ
- dropdown list ์์ react color(sketch) ๋ฃ๊ธฐ
1) react-color ์ค์น
(typescript ์ ์ฉ๋์ด ์์)
yarn add @types/react-color
2) importํด์ฃผ๊ธฐ
import { SketchPicker, ColorResult } from 'react-color'; // SketchPicker ์ธ ๋ค์ํ Color Pickers Collection์ด ์๋ค. (์ ํ๊ฐ๋ฅ) import { Menu, Dropdown } from 'antd';
3) UI ๊ตฌ์ฑ
// antd "dropdown list" ๋ถ๋ถ const menu = ( <Menu> <Menu.Item> // react color ์ปดํฌ๋ํธ ์ฝ์ (dropdown list์์ SketchPicker ์ปฌ๋ฌํ ๋ณด์ฌ์ง๋๋ก) <SketchPicker // react color component APIs color={selectedColor} onChange={handleChangeSketchPicker} /> </Menu.Item> </Menu> ); // dropdown ๊ธฐ๋ฅ์ด ์ ์ฉ๋ "color point UI" ๋ถ๋ถ <Dropdown // dropdown component API overlay={menu} trigger={['click']} visible={isDropdownShow} onVisibleChange={(visible) => { setIsDropdownShow(visible); } }> <a className="ant-dropdown-link" onClick={(e) => { setIsDropdownShow(true); e.preventDefault(); } }> // color point ๋ฅผ styled component๋ก ๊ตฌ์ฑ, ๋ฐฐ๊ฒฝ์๋ง inline์ผ๋ก ์ ์ฉ <ColorPoint style={{ backgroundColor: selectedColor }}></ColorPoint> </a> </Dropdown>
โ๏ธ antd ์ react color ๊ฐ library์ธ ๋งํผ ๊ณต์ document ๋ด ๊ฐ ์ปดํฌ๋ํธ API๋ฅผ ์ ์ฝ์ด๋ณด๊ณ ์ ์ฉํด์ผ ํ๋ค.
โ๏ธ antd dropdown์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฒํผ์ ํด๋ฆญ(trigger={['click']} ์ ์ฉ)ํ๋ฉด dropdown์ด ์ด๋ฆฌ๊ณ , dropdown ๋ด list๋ฅผ ํด๋ฆญํ๋ฉด ๋ซํ๋ ๊ตฌ์กฐ์ด๋ค.
ํ์ง๋ง colorPicker๋ ๊ณ์ ํด๋ฆญํด๋ dropdown list๊ฐ ๋ซํ์ง ์์์ผ ํ๋ค.
๋ฐ๋ผ์ antd dropdown API ๋ด visible
์ ํ์ฉํด์ ํ ๋ฒ ํด๋ฆญํด์ list๋ฅผ ์ด์ ํ์๋ ํด๋ฆญํด๋ ๋ซํ์ง ์๋๋ก ์ง์ ํ ์ ์๋ค.
react color
๊ณต์ Component API
color
: ๊ธฐ๋ณธ ์์ ์ค์ onChange(color, event)
: ์์์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํธ์ถํ๋ ํจ์๋ฅผ ์ ๋ฌ
(color, event ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ค - ๋ณ๊ฒฝ์ ์ ์ฉ / ๋ฐ์ ์ด๋ฒคํธ ์ค์ ๊ฐ๋ฅ)onChangeComplete
: ์์ ๋ณ๊ฒฝ์ด ์๋ฃ๋๋ฉด ํธ์ถํ ํจ์ ์ ๋ฌ// ๊ธฐ๋ณธ color state ์ง์ const [selectedColor, setSelectedColor] = useState<string>('#ff9466'); //console.log('๋ณ๊ฒฝ๋ ์ปฌ๋ฌ : ', selectedColor). <- ์ปฌ๋ฌํฌ์ธํธ ์ฐ์ผ๋ฉด ๋ณ๊ฒฝ๋ ์ ์ถ๋ ฅ // ์์์ด ๋ณ๊ฒฝ๋ ๋ ์๋ํ๋ ํจ์ const handleChangeSketchPicker = (selectedColor: ColorResult, event: React.ChangeEvent<HTMLInputElement>) => { event.stopPropagation(); event.preventDefault(); setSelectedColor(selectedColor.hex); // ์์ ๋ณ๊ฒฝ ๊ฐ์ hex ์ ์ฉ }; // ์์ ๋ณ๊ฒฝ ํ ํธ์ถ ๋ฐ ์ ์ฉํ ํจ์(onChange๋ก ๋์ฒด ๊ฐ๋ฅํ๋ค) const handleChangeComplete = (color) => { setState( color.hex ); // hex ์ธ์๋ rgb, hsl ๋ฑ์ ๊ฐ์ ๋ถ๋ฌ์ฌ ์ ์๋ค. }; return ( <SketchPicker color={ selectedColor } onChange={handleChangeSketchPicker} onChangeComplete={ handleChangeComplete } /> );
antd
๊ณต์ Component API
visible
: (boolean) -> ํ์ฌ dropdown list๊ฐ ๋ณด์ด๋์ง ์๋ณด์ด๋์ง ์ค์ onVisibleChange
: (visible: boolean) => void -> visible state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ถ๋ฅด๋ ํจ์// ๊ธฐ๋ณธ Visible state ์ง์ const [isDropdownShow, setIsDropdownShow] = useState<boolean>(false); // ๊ธฐ๋ณธ์ ์ผ๋ก dropdown list๊ฐ ์๋ณด์ด๋๋ก(false) ์ค์ ํด๋๊ณ ์๋์ ์ ์ฉํ๋ค <Dropdown overlay={menu} trigger={['click']} visible={isDropdownShow} // console.log('๋น์ง๋ธ : ', visible); false onVisibleChange={(visible) => { // true๋ก ๋ฐ๋(์๋์์ true๋ก ๋ฐ๊ฟ์คฌ๊ธฐ ๋๋ฌธ) setIsDropdownShow(visible); } }> // true๋ก ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ color ํ๋ ํธ์ ๊ณ์ ํด๋ฆญ์ ํด๋ true์ํ์ด๋ค(์๋ซํ) <a className="ant-dropdown-link" onClick={(e) => { setIsDropdownShow(true); // true๋ก ๋ฐ๊ฟ, Color point๋ฅผ ํด๋ฆญํ๋ฉด ๋ณด์ด๋๋ก(true) e.preventDefault(); } }> // color point ๋ฅผ styled component๋ก ๊ตฌ์ฑ, ๋ฐฐ๊ฒฝ์๋ง inline์ผ๋ก ์ ์ฉ <ColorPoint style={{ backgroundColor: selectedColor }}></ColorPoint> </a> </Dropdown>
์๋ด๋! ๊พธ์คํ ๊ณต๋ถํ๊ณ velog ์ฐ๋ฉด์ ์ง๋ด๊ณ ๊ณ์ จ๊ตฐ์!ใ ใ ๋๋ฌด ๋ฐ๊ฐ๊ณ ๊ฐ๋... ์ ์ง๋ด์์ฃ ?