Rerenderizar el componente en Canvas cuando el nombre de la etiqueta ha cambiado
@z1lk ya he añadido algo así para la próxima versión '''js Modelo Dentro de Init this.listenTo(this, 'change:tagName', this.tagUpdated); // ... tagUpdated() { const coll = this.collection; const at = coll.indexOf(this); col.remove(this); coll.add(esto, { at }); }, ```
Lee la respuesta completa abajo ↓Pregunta
Estoy intentando construir un componente básico de encabezado que te permita seleccionar de H1 a H6 con un rasgo. Pero cuando se selecciona una opción, el lienzo no se actualiza. El cambio es visible en la vista de código, y si muevo el elemento en el lienzo con la herramienta de arrastre, la etiqueta cambia. He estado leyendo la documentación de la API así como el código fuente, pero no puedo hacer que el componente se vuelva a renderizar automáticamente. Sospecho que Grapes no está escuchando un cambio en el nombre de la etiqueta del componente. ¿Cuál es la forma adecuada de forzar una re-renderización en este caso?
'''js VAR Comps = Editor. DomComponents; Bloqueos VAR = editor. Jefe de bloque; var textType = comps.getType('text'); var textModel = textType.model; var textView = textType.view;
comps.addType('header', { model: textModel.extend({ defaults: Object.assign({}, textModel.prototype.defaults, { 'nombre personalizado': 'Cabecera', etiquetaNombre: 'h1', Rasgos: [ { tipo: 'select', Opciones: [ {valor: 'h1', nombre: 'Uno (el más grande)'}, {valor: 'h2', nombre: 'Dos' }, {valor: 'h3', nombre: 'Three '}, {valor: 'h4', nombre: 'Cuatro '}, {valor: 'h5', nombre: 'Five '}, {valor: 'h6', nombre: 'Seis (el más pequeño)'}, ], etiqueta: 'Tamaño', Nombre: 'tamaño de cabecera', cambioprop: 1 } ] }),
init() { this.listenTo(this, 'change:header-size', this.changeTagName); },
changeTagName() { view.tagName es un archivo que devuelve model.tagName this.set('tagName', this.get('tamaño de cabecera')); }
}, { isComponent: function(el) { if(el && ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(el.tagName)) { return {type: 'header'}; } } }), ver: textoVer });
blocks.add('header', { etiqueta: 'Cabezal', categoría: 'Básico', atributos: {clase:'fa fa-cabecera'}, Contenido: { tipo:'encabezado', contenido: 'Inserta aquí el texto de tu cabecera', activeOnRender: 1 } });
Respuestas (3)
@z1lk ya he añadido algo así para la próxima versión '''js Modelo Dentro de Init this.listenTo(this, 'change:tagName', this.tagUpdated); // ... tagUpdated() { const coll = this.collection; const at = coll.indexOf(this); col.remove(this); coll.add(esto, { at }); },
No estoy seguro de por qué 'el' sería una cadena, pero mira el commit que cerró el problema: https://github.com/artf/grapesjs/commit/e450cb98855d16ad819f1214350825a50e45e910
Si usas la última versión de Grapes, el Componente escucha el cambio de 'tagName' y hace el reemplazo del nodo él mismo. Así que deberías poder eliminar las funciones 'init' y 'tagUpdated'. El rasgo se actualizará con 'NombreEtiqueta' y el Componente hará el resto.
Edito:
Otra cosa que se me ocurrió es: a veces el objeto que se pasa a 'isComponent' no tiene el método que llamo, y en ese caso aparece un error. Podrías hacer primero una revisión de seguridad: '''js if(el && el.tagName && ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(el.tagName)) { ...
Sí, esto es porque no puedes cambiar el nombre de la etiqueta de un elemento DOM existente. Probablemente la solución sería, al cambiar 'NombreEtiqueta', eliminar y reemplazar el nodo (en la misma posición)
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #460
Cuando la vista del componente modifica el HTML, los componentes de texto ya no son editables
Estoy intentando crear un componente personalizado que contenga algo de texto lorem ipsum en el contenido, para editarlo una vez que esté e...
Issue #835
Actualizar el lienzo con una función personalizada
Estoy intentando crear una función que reemplace todos los atributos de link, estos hacen el cambio en el lienzo, pero no lo guardan cuando...
Issue #1895
[PREGUNTA] Arrastra el componente sobre el lienzo con script, script añadido varias veces.
Hola, no estoy seguro de si esto es un error o no. Pero he notado un comportamiento extraño: cuando arrastro un bloque que tiene un compone...
Issue #1535
[Bug]: Después de eliminar un componente personalizado, la vista del rasgo no se limpia
Hola, Estoy usando la biblioteca grapesjs versión 0.14.33. He creado algunos componentes personalizados y he notado que al eliminar los com...
Plugins de pago que cumplen con este problema
Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.
Cargando recomendaciones de plugins de pago...
Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.
Explora plugins gratuitos →Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.
Explora plugins premium →Tutoriales relacionados
Guías detalladas sobre el mismo tema.
Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.