Come registrare gli stili di allineamento in React-Quill
Sto usando il pacchetto npm react-quill e lo sto importando dinamicamente in nextjs e sto anche usando il boilerplate create-next-app. Sono in grado di far funzionare l'editor di reattività ma non sono in grado di ottenere gli stili di immagine / stili di paragrafo impostati con il pulsante di allineamento dalla barra degli strumenti e visualizzare nuovamente i contenuti - immagine / paragrafo.
Caso d'uso:
- Aggiungi immagine / paragrafo e aggiungi l'allineamento dalla barra degli strumenti nell'editor.
- Salva il contenuto dell'editor in un database
- Visualizza nuovamente il contenuto dell'editor di react-quill dal database utilizzando il pacchetto npm htmr
Previsto: il contenuto dell'immagine / paragrafo deve essere comunque allineato a destra / al centro / giustificato.
Effettivo: al contenuto dell'immagine / paragrafo sono stati rimossi tutti gli attributi di stile.
Di seguito è riportato il mio codice, come registrare lo stile per l'immagine / paragrafo della penna di reazione in nextjs è la mia domanda
import { useState,useEffect } from 'react'
import Router from 'next/router'
import dynamic from 'next/dynamic'
import { withRouter } from 'next/router' // used to get access to props of react-dom
import { getCookie,isAuth } from '../../actions/auth';
import { createBlog } from '../../actions/blog'
// dynamically importing react-quill
const ReactQuill = dynamic( ()=> import('react-quill'), {ssr:false} )
import '../../node_modules/react-quill/dist/quill.snow.css'
const CreateBlog = ( {router} ) => {
const [ body,setBody ] = useState( blogFromLS() )
const [ values,setValues ] = useState({
error : '',
sizeError : '',
success : '',
formData : '',
title : '',
hidePublishButton : false
})
const { error, sizeError, success, formData, title, hidePublishButton } = values;
const token = getCookie('token')
useEffect(()=>{
setValues({...values, formData: new FormData()})
initCategories()
intiTags()
},[router])
const handleChange = name => e => {
//console.log(e.target.value)
const value = name === 'photo' ? e.target.files[0] : e.target.value
formData.set(name,value)
setValues({...values, [name]:value, formData : formData , error:''})
};
const handleBody = e => {
//console.log(e)
setBody(e)
formData.set('body',e)
if(typeof window !== 'undefined'){
localStorage.setItem('blog',JSON.stringify(e))
}
}
const publishBlog =(e) => {
e.preventDefault();
// console.log('ready to publish')
createBlog(formData, token).then(data => {
if(data.error){
setValues({...values,error:data.error})
// console.log('error macha')
}
else{
setValues({...values,title:'' ,error:'', success:' Blog was Published
successfully '})
setBody('')
setCategories([]);
setTags([])
}
})
}
const createBlogForm = () => {
return <form onSubmit= { publishBlog }>
<div className="form-group">
<label className="text-muted"> Title </label>
<input type="text" className="form-control"
value= { title } onChange={handleChange('title')} ></input>
</div>
<div className="form-group">
<ReactQuill style={{height:'30rem',marginBottom:'8rem'}} value={body}
placeholder="Write here, minimum of 200 charaters is required"
modules={CreateBlog.modules} formats={ CreateBlog.formats } onChange={ handleBody } >
</ReactQuill>
</div>
<div className="form-group">
<button type="submit" className="btn btn-primary" > Publish </button>
</div><br></br>
</form>
}
const showError = () => (
<div className="alert alert-danger" style={{display : error ? '' : 'none'}}> {error} </div>
)
const showSuccess = () => (
<div className="alert alert-success" style={{display : success ? '' : 'none'}}> {success} </div>
)
return (
<div className="container-fluid">
<div className="row">
<div className="col-md-8">
{ createBlogForm() }
<div>
{showError()}
{showSuccess()}
</div>
</div>
<div className="col-md-4">
<div className="form-group pb-2">
<h5>Featured Image</h5>
<hr></hr>
<small className="text-muted">Max.size upto 2mb</small><br></br>
<label className="btn btn-outline-info">
Upload Featured Image
<input onChange={handleChange('photo')} type="file" accept="image/*" hidden></input>
</label>
</div>
</div>
</div>
</div>
)
}
CreateBlog.modules = {
toolbar : [
[{ header:'1' }, {header:'2'}, {header:[3,4,5,6] } , {font:[]} ],
[{ size:[] }],
['bold','italic','underline','strike','blockquote'],
[{ list:'ordered' }, {list:'bullet'},{'indent': '-1'}, {'indent': '+1'} ],
[{ align: '' }, { align: 'center' }, { align: 'right' }, { align: 'justify' }],
['link','image','video'],
['clean'],
['code-block']
]
};
CreateBlog.formats = [
'header',
'font',
'size',
'bold',
'italic',
'underline',
'strike',
'blockquote',
'list',
'bullet',
'indent',
'align',
'link',
'image',
'video',
'code-block',
];
export default withRouter(CreateBlog);
Risposte
Per quanto ho provato, il modulo di ridimensionamento dell'immagine non funzionerà con boilerplate di Nextjs e gli stili stessi non verranno registrati durante la visualizzazione dei contenuti. È necessario espellere il boilerplate o utilizzare webpack.
Preferisco che tu usi SunEditor per il rich text editor di React che funziona molto bene con Nextjs. SunEditor github Link . Devi solo importare il foglio di stile globalmente nel tuo _document.js o _app.js.
Puoi vedere la demo qui
Per registrare uno stile globale, devi inserirlo in pages/_app.js
( docs ):
import '../../node_modules/react-quill/dist/quill.snow.css'
export default function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
Esiste una RFC per consentire questa importazione CSS per pagina. E anche una questione che parla anche di questo.