๋ธ๋ก๊ทธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๋ณด๋ Text-editor library๊ฐ ํ์ํ์ฌ Quill ๊ณผ ReactQuill Library๋ฅผ ์ฌ์ฉํด๋ณด์๋ค.
Quill๊ณผ ReactQuill์ ๋ ๋ค text๋ฅผ ํธ์งํ ์ ์๊ฒ ํด์ฃผ๋ library์ด๋ค.
๋ธ๋ก๊ทธ ํฌ์คํ ์ ์์ฑํ ๋ ์์ฒ๋ผ ๋ด๊ฐ ์์ฑํ text๋ฅผ ์์ ๊ฐ์ด UI๋ฅผ ์ฌ์ฉํ์ฌ text ๋ณํ์ ํ๋ ๊ฒ์ด ํ์ํ๋ฐ ์ด์ ๊ฐ์ UI๋ฅผ ์ฌ์ฉํ๊ฒ ํด์ฃผ๋ Library๊ฐ Quill์ธ ๊ฒ์ด๋ค.
๋๋ React๋ก ํ๋ก์ ํธ๋ฅผ ํ๊ณ ์๋๋ฐ ๋ ์ค์ ์ฌ์ฉํ๊ธฐ ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณ ๋ฅด์๋ฉด ๊ฒฐ๋ก ์ ์ผ๋ก๋ Quill๊ณผ ReactQuill ์ค์ ReactQuill ์ฌ์ฉํ๊ธฐ์ ํจ์ฌ ํธํ๋ค.
์ด์ ๋ํ ์ด์ ๋ ์ฌ์ฉ๋ฒ์ ๋ณด๋ฉด ๊ทธ ์ด์ ๋ฅผ ์ ์ ์๋ค.
npm i quill
quill์ ์์ ๊ฐ์ด npm ์ค์น ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ฉด ๋๋ค.
Quill์ด๋ผ๋ ์์ฑ์ํจ์์ ์ฒซ๋ฒ์งธ ์ธ์์ quill์ ์ฌ์ฉํ UI๋ฅผ ํ ๋นํด์ค๋ค.
๋๋ฒ์งธ ์ธ์๋ก๋ quill์ต์
์ ์ค์ ํ ์ ์๋ค.
react์ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด quill์ ์ฌ์ฉํ react ์์๋ฅผ ref๋ก ์ง์ ํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
์๋ ์ฝ๋ ์ฃผ์์ ์ฐธ๊ณ ํ๋ผ.
<!-- Include Quill stylesheet -->
<link href="https://cdn.quilljs.com/1.0.0/quill.snow.css" rel="stylesheet" />
<!-- Create the toolbar container -->
<div id="toolbar">
<button class="ql-bold">Bold</button>
<button class="ql-italic">Italic</button>
</div>
<!-- Create the editor container -->
<div id="editor"> <!-- quill์ ์ฌ์ฉํ ์์-->
<p>Hello World!</p>
</div>
<!-- Include the Quill library -->
<script src="https://cdn.quilljs.com/1.0.0/quill.js"></script>
<!-- Initialize Quill editor -->
<script>
// editor๋ quill contents์ instance์ด๋ค.
// ์ฒซ๋ฒ์งธ ์ธ์๋ ์์ DOM์์์ด๊ณ ๋ ๋ฒ์งธ ์ธ์๋ text-editor์ ์ต์
์ ์ค์ ํ ์ ์๋ค.
var editor = new Quill("#editor", {
modules: { toolbar: "#toolbar" },
theme: "snow",
});
</script>
์์ ๊ฐ์ด quill์ ์ ์ฉํ์ฌ id๊ฐ editor์ธ ์์๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ UI๋ฅผ ๋ณด์ฌ์ค๋ค.(์์ธํ ์ต์ ์ ๋ค๋ฅด๋ค. ๊ทธ๋ฅ ๋์ฒด์ ์ธ UI๊ฐ ์ด๋ ๋ค๋ ๊ฒ์ ๋งํ๊ธฐ ์ํ ์์์ฌ์ง์ด๋ค.)
์ ์ฝ๋ ์์๋ ์ผ๋ฐ Vanilla์์ ์ฌ์ฉํ ๋์ ์์์ด๊ณ Quill์ React์ฌ์ฉํ ๋์ ์์๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ฐ์ quill์ ์ฌ์ฉํ React ์์๋ฅผ ์ฐธ์กฐํด์ค์ผํ๊ธฐ ๋๋ฌธ์ useRef()๋ฅผ ์ฌ์ฉํ์ฌ ์ฐธ์กฐํด์ค๋ค.
๋ค์์ผ๋ก useEffect์์์ quill์ ์ค์ ํด์ค๋ค.
(useEffect์์์ ์ค์ ํด์ฃผ๋ ์ด์ ๋ react ์์๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํด์ ๋ ๋๋ง์ด ๋ ์ดํ์ ์ฐธ์กฐํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.)
์์ ๊ฐ์ด ์ค์ ํด์ฃผ๋ฉด ๋ค์๊ณผ ๊ฐ์ UI๋ฅผ ๋ณผ ์ ์๋ค.
์ด ๋ ๋ง์ฝ state๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋ฉด quill์ value๊ฐ์ state๋ก ์ค์ ํ์ฌ onChange๋ ๋๋ง๋ค state๊ฐ ๋ฐ๋๊ฒ ์ค์ ํด์ผํ๋ค.
ํ์ง๋ง quill์ ๊ทธ๋ฅ text๊ฐ ์๋ html์ด๋ฉฐ ์ด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ๊น๋ค๋กญ๋ค.
์ด์ด์ ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
import Quill from "quill";
import React, { useRef, useEffect, useState } from "react";
import "quill/dist/quill.bubble.css";
const Example = () => {
const quillElement = useRef();
const [quillText, setQuillText] = useState("");
console.log(quillText);
useEffect(() => {
const options = {
theme: "bubble",
placeholder: "๋น์ ์ ํ๋ฃจ๋ฅผ ๋ค๋ ค์ฃผ์ธ์...,",
modules: {
toolbar: [
[{ header: "1" }, { header: "2" }],
["bold", "italic", "underline", "strike"],
[{ list: "ordered" }, { list: "bullet" }],
["blackquote", "code-block", "link", "image"],
],
},
};
const instance = new Quill(quillElement.current, options);
instance.on("text-change", (delta, oldDelta, source) => {
if (source === "user") {
setQuillText(instance.root.innerHTML);
}
});
}, []);
return (
<div>
<div ref={quillElement}></div>
</div>
);
};
export default Example;
์ค์ ํ quill์ ๋ํ instance๋ฅผ ์ค์ ํ์ฌ text-change๋ผ๋ quill ์ด๋ฒคํธ๋ฅผ ์ค์ ํ๋ค.
์ด ๋ source===user์์ source text๋ฅผ ์
๋ ฅํ๋ ์ฃผ์ฒด์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ฌ์ฉ์๊ฐ text๋ฅผ ๋ณํํ๋ฉด setQuillText๊ฐ ๊ณ์ ์คํ๋๋ค.
์ฌ๊ธฐ์ setQuillText()์ ํ์์ฒ๋ผ e.target.value๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ด ํ ๋น๋๋ค.
์ด๋ ์ด๋ฒคํธ๊ฐ ์ถ์ ํ value๊ฐ ์ด๋ฒคํธ ๊ฐ์ฒด๊ฐ ์๋ instance์ root๋ผ๋ ๊ฐ์์ ์ถ์ ๋๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ฌธ์ ์๋ก์ด value state๊ฐ์ ์ค์ ํ ๋ setQuillText(instance.root.innerHTML)
์ ํ์ธํ ์ ์๋ค.
ํ๋์ element ์์์ text-editor๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ๋ง์ ์ฝ๋๋ฅผ ์ ์ฉํด์ผํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
ํ์ง๋ง ReactQuill์ ์ฌ์ฉํ๋ฉด ์ด์ ๋นํด ๋งค์ฐ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
ReactQuill์ ์ดํด๋ณด์.
npm i react-quill
import React, { useState } from "react";
import ReactQuill from "react-quill";
import "react-quill/dist/quill.bubble.css";
const ReactQuillEX = () => {
const [quillText, setQuillText] = useState("");
return (
<div>
<ReactQuill
theme="bubble"
value={quillText}
onChange={(e) => setQuillText(e)}
/>
</div>
);
};
export default ReactQuillEX;
์๋ react-quill์ ์ฌ์ฉํ ์ฝ๋์ด๋ค.
original quill์ ์ฌ์ฉํ ๋๋ณด๋ค ํจ์ฌ ์ฝ๋๊ฐ ์งง์์ก๋ค.
๋ฐ๋ก ref๋ก ์์๋ฅผ ์ง์ ํ ํ์์์ด ์ปดํฌ๋ํธ๋ก ์ฌ์ฉํ๋ฉด ๋๊ณ ๋๋ฌธ์ useEffect์์์ ์ฒ๋ฆฌํ ํ์๋ ์์ด์ก๋ค.
๋ํ ์ด๋ฐ์ ๋ฐ ์ค์ ์ฝ๋๋ฅผ ์ค์ ํ ํ์๋ ์๋ค.
state๊ฐ๋ ์ปดํฌ๋ํธ๋ด์์ ํ ๋นํ๊ณ onChange์ด๋ฒคํธ๋ ์ ์ฉํ์ฌ ์ค์ ํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ๊ฒ์ setQuillText์์ ์ค์ ํ ๊ฐ์ e.target.value๊ฐ ์๋ e๋ก ์ค์ ํด์ผํ๋ค. (e๋ก value๊ฐ์ ๋ฐ๊ธฐ๋๋ฌธ์ด๋ค.)
Quill๊ณผ ReactQuill์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ดค๋๋ฐ ๋ฆฌ์กํธ์ ํจ๊ป ์ฌ์ฉํด์ผํ๋ค๋ฉด ReactQuill์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ํธํ๋ค๋ ๊ฒ์ ์ ์ ์์๋ค.
์ด์ฒ๋ผ ์ด๋ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณ ๋ฅผ ๋ ์ถฉ๋ถํ ๋๊ตฌ์ ๋ํ ํ์์ด ์ด๋ค์ง๋ฉด ์ํฉ์ ๋ฐ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฉํ ์๊ฐ์ ์๋ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์์๊ณ ์ถํ์ ์๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฉํ ์์ ์ฌ๋ฌ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํด๋ณด๊ณ ์ฌ์ฉํ๊ธฐ ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํด์ผ๊ฒ ๋ค.