💪
リッチテキストエディタの作成 - ReactやDraft.jsを活用
はじめに
リッチテキストエディタは、テキストを装飾する、リンクを挿入する、画像を埋め込むなど、多彩な操作が可能なツールです。エディタはブログ記事作成ツールやCMSなど、さまざまな用途で利用されています。本記事では、ReactとDraft.jsを活用して、基本的なリッチテキストエディタを自作する方法を解説します。
なぜDraft.jsを選ぶのか?
Draft.jsは、Facebookが開発したリッチテキストエディタのためのフレームワークです。
以下の特徴があります:
- 豊富な拡張性:プラグインやカスタムデータ構造の追加が容易。
- リアルタイム編集:状態管理がしやすく、エディタ内容をReactのstateに保存可能。
- コミュニティサポート:オープンソースで情報も多い。
環境構築
必要なライブラリ
以下のコマンドを使用して、プロジェクトにDraft.jsを導入します:
npm install draft-js
また、Reactのプロジェクトを用意するために、以下のコマンドを実行します:
npx create-react-app my-text-editor
cd my-text-editor
Draft.jsでリッチテキストエディタを実装する
エディタの基礎構築
Draft.js
を活用して、基本的なエディタを構築します。
import React, { useState } from "react";
import { Editor, EditorState } from "draft-js";
import "draft-js/dist/Draft.css";
const RichTextEditor = () => {
const [editorState, setEditorState] = useState(() =>
EditorState.createEmpty()
);
const handleEditorChange = (state) => {
setEditorState(state);
};
return (
<div style={{ border: "1px solid #ccc", padding: "10px" }}>
<Editor editorState={editorState} onChange={handleEditorChange} />
</div>
);
};
export default RichTextEditor;
このコードは、シンプルなエディタを表示します。editorState
は現在のエディタ内容を保持し、リアルタイムで状態を更新します。
基本機能の追加
次に、文字の装飾(太字、斜体など)のツールバーを実装します。Draft.jsのRichUtils
を使うことで簡単に操作が可能です。
import React, { useState } from "react";
import { Editor, EditorState, RichUtils } from "draft-js";
import "draft-js/dist/Draft.css";
const RichTextEditor = () => {
const [editorState, setEditorState] = useState(() =>
EditorState.createEmpty()
);
const handleEditorChange = (state) => {
setEditorState(state);
};
const handleBoldClick = () => {
setEditorState(RichUtils.toggleInlineStyle(editorState, "BOLD"));
};
return (
<div>
<div style={{ marginBottom: "10px" }}>
<button onClick={handleBoldClick}>Bold</button>
</div>
<div style={{ border: "1px solid #ccc", padding: "10px" }}>
<Editor editorState={editorState} onChange={handleEditorChange} />
</div>
</div>
);
};
export default RichTextEditor;
カスタムスタイルの適用
さらに、エディタのカスタムスタイルを定義することで、独自の見た目を実現できます。
const customStyleMap = {
HIGHLIGHT: {
backgroundColor: "yellow",
},
};
const handleHighlightClick = () => {
setEditorState(RichUtils.toggleInlineStyle(editorState, "HIGHLIGHT"));
};
return (
<div>
<button onClick={handleHighlightClick}>Highlight</button>
<div style={{ border: "1px solid #ccc", padding: "10px" }}>
<Editor
editorState={editorState}
onChange={handleEditorChange}
customStyleMap={customStyleMap}
/>
</div>
</div>
);
応用: 保存機能の実装
リッチテキストを保存する際、Draft.jsではconvertToRaw
を使い、エディタの状態をシリアライズします。以下のコードは、エディタ内容をJSONとして保存する例です。
import { convertToRaw } from "draft-js";
const saveContent = () => {
const contentState = editorState.getCurrentContent();
const rawContent = convertToRaw(contentState);
console.log("Saved Content:", JSON.stringify(rawContent));
};
終わりに
Draft.jsは柔軟性が高く、カスタムのリッチテキストエディタを簡単に構築できます。今回の例では基本的なエディタ機能を紹介しましたが、これを基にして、画像埋め込み、リンク機能、プラグインの実装など多くの機能を追加できます。
リッチテキストエディタを構築し、自社製品やプロジェクトで活用してみてください!
Discussion