前提
ReactとJavascriptとEditor.jsでNotionのようなノートアプリを作ろうと思っているのですが、save()をした際に詰まったので質問させてください。
生じた問題
文字が書かれていない場合にそのブロックが保存されません。コンソールには
editor.js:2 [Editor.js saving]: editor.js:2 Paragraph editor.js:2 Block «paragraph» skipped because saved data is invalid
と表示されます。
別のWYSIWIGを使うことも検討しています。
試したこと
save()で保存する方法を試しました。
補足情報(FW/ツールのバージョンなど)
Editorjsのバージョンは2.26.4です。
react-editor-jsを使っています。
今のコード
Javascript
1import { createReactEditorJS } from "react-editor-js"; 2import React, { useEffect, useReducer, useState, useRef } from "react"; 3import DragDrop from "editorjs-drag-drop"; 4import { useParams } from "react-router"; 5import Marker from "@editorjs/marker"; 6import Header from "@editorjs/header"; 7import CodeTool from "@editorjs/code"; 8import Quote from "@editorjs/quote"; 9import Embed from "@editorjs/embed"; 10import List from "@editorjs/list"; 11import InlineCode from "@editorjs/inline-code"; 12import Head from "../components/Head"; 13import { db } from "../firebase"; 14 15function NoteApp() { 16 const ReactEditorJS = createReactEditorJS(); 17 const instanceRef = useRef(null); 18 const params = useParams(); 19 console.log(instanceRef); 20 const [note, setNote] = useState(); 21 const [pageTitle, setPagetitle] = useState(); 22 23 const editorCore = React.useRef(null); 24 const handleInitialize = React.useCallback((instance) => { 25 editorCore.current = instance; 26 }, []); 27 28 const handleReady = () => { 29 const editor = editorCore.current._editorJS; 30 new DragDrop(editor); 31 let codexeditor = document.getElementsByClassName("codex-editor"); 32 for (let i = 0; i < codexeditor.length; i++) { 33 codexeditor[i].classList.remove("codex-editor--narrow"); 34 } 35 }; 36 37 const handleSave = React.useCallback(async () => { 38 let savedData = await editorCore.current.save(); 39 console.log(savedData); 40 // ここでFirestoreにデータを格納 41 db.collection("workspaces") 42 .doc(params.workspace) 43 .collection("projects") 44 .doc(params.project) 45 .collection("note") 46 .doc(document.getElementById("textedit").className) 47 .update({ note: savedData }); 48 }, []); 49 50 useEffect(() => { 51 // ここでFirestoreからデータを取得 52 db.collection("workspaces") 53 .doc(params.workspace) 54 .collection("projects") 55 .doc(params.project) 56 .collection("note") 57 .doc(params.page) 58 .get() 59 .then((snapshot) => { 60 console.log(snapshot.data()); 61 setNote([]); 62 setNote(snapshot.data().note); 63 }); 64 db.collection("workspaces") 65 .doc(params.workspace) 66 .collection("projects") 67 .doc(params.project) 68 .collection("note") 69 .doc(params.page) 70 .onSnapshot((snapshot) => { 71 setPagetitle(snapshot.data().title); 72 }); 73 }, [params]); 74 75 useEffect(async () => { 76 var noteDoc = await db 77 .collection("workspaces") 78 .doc(params.workspace) 79 .collection("projects") 80 .doc(params.project) 81 .collection("note") 82 .doc(params.page) 83 .get(); 84 if (!noteDoc.exists) { 85 window.location.href = "/app/" + params.workspace + "/" + params.project; 86 } 87 }, []); 88 89 return ( 90 <div id="app" className={localStorage.getItem("handleBanner")}> 91 {console.log(note)} 92 <div id="textedit" className={params.page}> 93 {note == undefined ? ( 94 <Head title="Newtron" /> 95 ) : ( 96 <> 97 <ReactEditorJS 98 instanceRef={(instance) => (instanceRef.current = instance)} 99 onReady={handleReady} 100 onInitialize={handleInitialize} 101 placeholder="何か入力" 102 onChange={handleSave} 103 value={note} 104 defaultValue={note} 105 autofocus="true" 106 defaultBlock="paragraph" 107 tools={{ 108 marker: Marker, 109 heading: Header, 110 codetool: CodeTool, 111 quote: Quote, 112 embed: Embed, 113 inlinecode: InlineCode, 114 list: List, 115 }} 116 /> 117 </> 118 )} 119 </div> 120 </div> 121 ); 122} 123 124export default NoteApp;
あなたの回答
tips
プレビュー