react-quill


react-quillのインストール

yarn add react-quill

import

import ReactQuill from 'react-quill';
import 'react-quill/dist/quill.snow.css';

return(
  <div>
  내용 : <ReactQuill onChange={onChangeContents} />
  </div>
)

糸開発時のプリレンダリングの問題



->ダイナミックインポートが必要
// import ReactQuill from 'react-quill';
import 'react-quill/dist/quill.snow.css'; // ES6
import dynamic from 'next/dynamic';
// 다이나믹 임포트

const ReactQuill = dynamic(()=> import("react-quill"), {ssr : false})
                                   // 서버사이트렌더링(ssr) false -> 브라우저에서만 그리겠다

react-hook-formとreact-quillを使用する場合


registerとして登録せずに値を強制入力する機能
    const {register, handleSubmit, setValue} = useForm({
        mode : "onChange"
    })

    const onChangeContents = (value:string) =>{
        console.log(value)
        // register로 등록하지 않고 강제로 값을 넣어주는 기능
        setValue("contents", value)
    }
setValueを使用します.

trigger


onChangeがreact-hook-formに伝える機能
   const {register, handleSubmit, setValue, trigger } = useForm({
       mode : "onChange"
   })

   const onChangeContents = (value:string) =>{
       console.log(value)


       // register로 등록하지 않고 강제로 값을 넣어주는 기능
       setValue("contents", value === "<p><br></p>" ? "" : value)
                                   // 내용부분 다 지워도 남는 태그들 때문에 빈칸으로 처리 안되므로 저 태그들만 있을때 빈칸으로 만들어줌

       trigger("contents")
       // onChange 됐다고 react-hook-form에 알려주는 기능
   }
react-quillですべてのコンテンツが削除されても、「」タグは空の値に保持されません.

条件をsetValueに挿入し、コンテンツがある場合にのみ[登録](Register)ボタンを有効にします.

タグを削除して印刷しますか?


出力時

このようなラベルが一緒に現れないようにするには、
            <div dangerouslySetInnerHTML={{
                __html: data?.fetchBoard.contents,
            }}></div>
でもSetInnerHTMLは危ない!
react-quillハンマーを直接入力すると<ランプで仕切られます(
コートから直接送ると


サイトに入ると、このようにコイン(Cross-Site-Script,XSS)を奪うことができます.

これを止めるなら?


  • dompurifyライブラリの適用
    yarn add dompurify
    import Dompurify from 'dompurify'
    
     <div dangerouslySetInnerHTML={{
                  __html: Dompurify.sanitize(data?.fetchBoard.contents),
              }}></div>
    するとレンダリングエラーが発生します
    解決する
                {typeof window !== "undefined" && (<div dangerouslySetInnerHTML={{
                  __html: Dompurify.sanitize(data?.fetchBoard.contents),
              }}></div>)}