Parte de un desarrollo que estoy realizando requiere integrar Vue.js y Summernote. Lamentablemente no existe una integración oficial por lo que anotaré los pasos que seguí por si le son de ayuda a alguien.
- Observemos que yo ya tengo un proyecto creado con vue-cli
-
Instalo las dependencias necesarias
- yarn add jquery
- yarn add summernote
-
Creo un componente al que llamaré Summernote.vue, con un contenido similar a:
::javascript
<template>
<div :id="element">
<slot></slot>
</div>
</template>
<script>
const $ = require("jquery")
import "summernote/dist/summernote-lite.min.css";
import "summernote/dist/summernote-lite.min";
export default {
name: "Summernote",
data() {
return {
element: `summernote_${new Date().getTime()}`
};
},
props: {
config: {
type: Object
},
ready: {
type: Function
}
},
mounted() {
this.$nextTick(() => {
let defaultConfig = {
//lang: "es-ES",
placeholder: "placeholder...",
height: 600,
width: 810,
focus: true,
callbacks: {
onInit: () => {
this.$emit("ready", this);
},
onChange: contents => {
this.$emit("change", contents);
},
onEnter: () => {
this.$emit("enter");
},
onFocus: () => {
this.$emit("focus");
},
onBlur: () => {
this.$emit("blur");
},
onKeyup: e => {
this.$emit("keyup", e);
},
onKeydown: e => {
this.$emit("keydown", e);
},
onPaste: e => {
this.$emit("paste", e);
},
}
};
let config = Object.assign({}, defaultConfig, this.config);
$("#" + this.element).summernote(config);
});
},
methods: {
summernote(...args) {
$("#" + this.element).summernote(...args);
},
ui() {
return $.summernote.ui;
}
}
};
</script>
<style scoped>
.summernote-img {
max-width: 100%;
}
</style>
Noten que estoy usando la versión lite de summernote, aquella que no requiere bootstrap.
Ahora, con lo anterior, puedo utilizar mi componente recién creado, por ejemplo:
::html
<template>
<div>
<summernote :config="summernoteConfig" @ready="readySummernote"></summernote>
</div>
<div class="preview">
<div v-html="contents"></div>
</div>
</template>
<script>
import Summernote from "../Summernote";
export default {
name: "AnotherComponent",
components: {
Summernote
},
data() {
return {
summernoteConfig: {
placeholder: '',
tabsize: 2,
height: 200,
toolbar: [
['font', ['bold', 'underline', 'clear']],
['font', ['superscript', 'subscript']],
['para', ['ul', 'ol', 'paragraph']],
['table', ['table']],
['insert', ['picture', 'hr']],
['view', ['codeview']],
]
},
contents: ""
}
},
methods: {
readySummernote(editor) {
editor.summernote('code', this.contents);
editor.$on("change", contents => {
this.contents = contents;
});
}
}
}
</script>
Lo que hicimos fue:
- Importar el componente que creamos para "Summernote"
- Crear una variable para la configuración del editor
- Creamos un método que reciba los cambios del contenido y los asigne a una variable que le indicamos.
- En el html también hemos incluido una vista previa de lo que genera el editor.
Debido a que mi conocimiento del javascript (vue) no es el suficiente, hay algunos otros puntos que intenté realizar y no pude, como por ejemplo:
- integrar katex (un plugin de summernote para utilizar latex)
- cambiar el idioma de summernote (tuve conflictos con jquery)
Pero espero que al menos como base lo anterior le sea de ayuda a alguien.
Referencias
- vue summernote lite: un repositorio del que me guié y a quien pertenece la mayoría de la lógica utilizada aquí
- How do I use Summernote with the Vue.js Framework? : un issue en el repositorio de summernote el cual da algunas otras ideas del cómo enfocar el problema
Si les fue de ayuda, compartan la publicación o dejen un comentario :)
Comentarios !
comments powered by Disqus