Los estilos de componentes personalizados no se aplican tras la eliminación y la re-suma
Me estoy enfrentando a un problema similar, donde el componente reañadido tiene la propiedad de estilos correctos: <img width="1112" height="17" alt="Image" src="https://github.com/user-attachments/assets/474011c4-b1be-48df-9aa8-14c3dcdfc68d" /> Pero si uso el botón "Ver código", el CSS no se inyectó, en mi caso ni si...
Lee la respuesta completa abajo ↓Pregunta
Versión GrapesJS
- Confirmo que uso la última versión de GrapesJS
¿Qué navegador usas?
Chrome v143.0.7499.193
Enlace de demo reproducible
https://codesandbox.io/p/sandbox/2l3887
Describe el bicho
¿Cómo reproducir el bicho?
- Abre la página y carga el editor GrapesJS
- Selecciona el componente Fila y elimínalo
- Haz clic en el componente Fila en la barra lateral izquierda para añadir una Fila al lienzo
¿Cuál es el comportamiento esperado? El componente Row recién añadido debería mostrar los estilos correctos (fondo blanco, borde, radio de borde, relleno, etc.)
¿Cuál es el comportamiento actual? Tras volver a añadir el componente Fila, la clase CSS .gjs-row definida en la propiedad styles no se aplica al elemento DOM, lo que provoca la ausencia de estilos y el componente se muestra como un contenedor de texto plano sin estilo
Si es necesario ejecutar algo de código para reproducir el error, pégalo aquí abajo: '''js Definición de componentes de fila editor. Components.addType('row', { modelo: { Predeterminados: { nombre: 'Row', etiquetaNombre: 'div', Arrastrable: Cierto, Droppable: Cierto, atributos: { clase: 'gjs-row' }, Estilos: ' .gjs-row { pantalla: flex; Envoltura flexible: envolvente; Diferencia: 16px; acolchado: 16px; Color de fondo: #fff; borde: 1px sólido #e5e7eb; Radio de frontera: 8px; margen inferior: 16px; } `, Componentes: [ { tipo: 'columna' }, { tipo: 'columna' }, { tipo: 'column' } ] } } });
**Síntomas:**
1. El primer componente de Fila añadido muestra correctamente los estilos
2. Tras la eliminación y la reincorporación, se pierden los estilos de componentes de fila
3. El atributo clase existe en el DOM pero las reglas CSS no se inyectan
<img width="1886" height="875" alt="Image" src="https://github.com/user-attachments/assets/2a09f090-fbd8-41e1-a29d-7e0b90072e7b" />
<img width="1245" height="377" alt="Image" src="https://github.com/user-attachments/assets/98db4307-ef2a-4547-ae90-409f6640e060" />
<img width="1873" height="762" alt="Image" src="https://github.com/user-attachments/assets/dee28083-6cda-4ad6-b3f1-4cac2aa43533" />
### Código de conducta
- [x] Acepto seguir el Código de Conducta de este proyecto
Respuestas (4)
Me estoy enfrentando a un problema similar, donde el componente reañadido tiene la propiedad de estilos correctos:
<img width="1112" height="17" alt="Image" src="https://github.com/user-attachments/assets/474011c4-b1be-48df-9aa8-14c3dcdfc68d" />Pero si uso el botón "Ver código", el CSS no se inyectó, en mi caso ni siquiera están en el DOM. El componente en sí funciona, porque cuando se añadió por primera vez, los estilos estaban realmente inyectados y funcionaban bien. Solo después de quitarlo y volver a añadirlo falla.
También he probado usando la función "component.replaceWith(newComponent)" en lugar de "component.remove()" y "editor.addComponents(newComponent)".
Ejemplo de código: '''s Definición de componentes domComponents.addType('my-type', { modelo: { Predeterminados: { etiquetaNombre: 'div', nombre: 'My Type', atributos: { 'data-gjs-type': 'my-type' }, } } });
Añadir componente (aquí los estilos funcionan) editorInstance.Components.addComponent({ Tipo: 'Mi-Tipo', atributos: { id: 'mi-id' }, componentes: //varios componentes de texto e imagen, Styles: '#my-id #ir2o {\n relleno: 5px;\n izquierda: 94px;\n Arriba: 120px;\n posición: absoluta;\n}\n\n ....' }, { at: 0 });
Recuperación del componente en otra operación sea myComponent = editorInstance.Components.getComponents().find((component: Component) => component.getType() === 'mi-tipo');
Reemplazarlo (o quitarlo y volver a añadir) por uno actualizado myComponent.replaceWith({ Tipo: 'Mi-Tipo', atributos: { id: 'mi-id' }, componentes: //Actualizados varios componentes de texto e imagen, estilos: '#my-id #ir2o {\n relleno: 5px;\n izquierda: 94px;\n arriba: 140px;\n posición: absoluta;\n}\n\n ....' //Estilos actualizados });
Los componentes se añaden con éxito, pero los estilos actualizados no se inyectan.
@mdmontesinos tu uso no es correcto, los 'estilos' deben definirse en la definición de componentes, y no se espera que cambien. Además, es incorrecto usar IDs para la definición de componentes si se espera que el componente se reutilice, el ID se recreará, dependerá de clases, especialmente para estilos.
Pero el informe de @shery parece legítimo; Puede que haya un problema con el almacenamiento en caché de estilos.
@artf estoy usando un ID porque siempre habrá una instancia única de ese componente en mi proyecto. Mi caso de uso es que un componente está diseñado externamente para usarse como "fondo de fondo" y luego importado a proyectos que lo utilizan. Por lo tanto, cuando se actualiza el componente externo, también necesito actualizarlo en mi proyecto, por eso intento recrearlo, y puede que sus componentes o estilos hayan sido modificados. ¿Hay alguna forma de forzar que los estilos se actualicen a los estilos?
Gracias por informar de esto, @shery.
Buena pregunta sobre Los estilos de componentes personalizados no se aplican tras eliminarlos y volver a añadir. El enfoque recomendado con StyleManager es usar la API orientada a eventos.
Empieza aquí:
- Consulta la documentación de GrapesJS de tu módulo específico
- Busca el método del oyente de eventos 'on()'
- La mayoría de las operaciones se pueden realizar escuchando eventos del editor y de los componentes
Patrones comunes: '''javascript Prestad atención a los cambios editor.on('Change', () => console.log('Something Changed'));
Ciclo de vida de los componentes editor.on('component:mount', (c) => console.log('component ready', c)); editor.on('component:update', (c) => console.log('component updated', c));
**Si sigues atascado:**
- Compartir una reproducción mínima de CodeSandbox
- Incluye lo que ya has probado
- Menciona tu versión GrapesJS
- ¡La comunidad está aquí para ayudar!
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #4576
Al hacer clic en 'envolver para estilo' afecta los componentes internos de otros componentes dentro del mismo cuadro de texto
Versión GrapesJS[X] Confirmo que se debe usar la última versión de GrapesJS¿Qué navegador usas? Chrome 104.0.5112.101 Enlace de demo reprod...
Issue #6357
!important se añade a todos los estilos de componentes
Versión GrapesJS [X] Confirmo que se debe usar la última versión de GrapesJS ¿Qué navegador usas? Chrome Enlace de demo reproducible https:...
Issue #6666
Panel de capas: arrastrar y soltar hace que los objetos desaparezcan (Firefox y Chrome)
Versión GrapesJS [x] Confirmo que uso la última versión de GrapesJS ¿Qué navegador usas? Firefox 137.0 y Chrome 136.0.7103.92 Enlace de dem...
Issue #5990
Cuando eliminas un componente, las clases duplicadas entre componentes se eliminan.
Versión GrapesJS [X] Confirmo que se debe usar la última versión de GrapesJS ¿Qué navegador usas? Chrome 126.0.6478.127 (Windows) Enlace de...
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.
Tutorial
Ship to Production Faster: What’s New in GrapesJS Shadcn
Supercharge your page builder! GrapesJS Shadcn adds live drag previews, rich text / commands, dynamic data, and canvas presets to ship to prod faster.
Tutorial
How to Build a Production GrapesJS Editor: The Complete Walkthrough of Brief, Preset, Plugins, and Services
A complete walkthrough of building a production GrapesJS editor: how to choose a preset, pick plugins, and scope setup services without burning a sprint.
Tutorial
Embed GrapesJS in Your SaaS: A Weekend Guide
Embed GrapesJS in your SaaS and ship a white-label page builder over a weekend. Honest tradeoffs, real code, and the plugins that close the UX gap.
Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.