Issue #3289💬 RespondidoAbierto el 23 de febrero de 2021por bgrand-chReacciones 2

Los componentes han perdido sus estilos

Respuesta rápidapor artf1

Eso porque has actualizado los comandos originales con tus versiones (incorrectamente). De hecho, si elimino tu plugin de la demo, todo funciona como se espera. Por favor, revisa el comando original de copiar y pegar, deberías clonar componentes antes de pegar, así que tu implementación no podría funcionar.

Lee la respuesta completa abajo ↓

Pregunta

Versión: 0.16.41

¿Puedes reproducir el error de la demo?

[X] Sí [ ] No

¿Cuál es el comportamiento esperado?

  1. Copiar el componente padre seleccionado (contenedor) al portapapeles.
  2. Pegar el componente padre seleccionado (contenedor) del portapapeles (en la misma página u otra página).
  3. Todos los componentes mantienen estilos de ID y estilos en línea.

¿Cuál es el comportamiento actual?

  1. Copiar el componente padre seleccionado (contenedor) al portapapeles.
  2. Pegar el componente padre seleccionado (contenedor) del portapapeles (en la misma página u otra página).
  3. Los componentes han perdido sus estilos de identificación, pero no sus estilos en línea.

Los componentes no tienen un ID de estilo regenerado, sino el mismo ID anterior con un "-2" añadido.

¿Puedes adjuntar capturas de pantalla, screencasts o una demo en directo?

[X] Sí (adjuntar) [ ] No

https://jsfiddle.net/bgrand_ch/71yuz26p/33/

Desde el jsfiddle anterior, sigue los siguientes pasos:

  1. Seleccionar un componente.
  2. Copia este componente con 'Ctrl/Cmd + C'.
  3. Pega el componente copiado con 'Ctrl/Cmd + V'.
  4. Todo el 'estilo' definido ha perdido, el estilo en línea se ha conservado.

Plugin de copiar-pegar (con sistema de notificaciones Quasar):

'''js importar { Notify } de 'quasar'

/**

try { timeoutId = showNotification({ mensaje: 'Élément en cours de copie...', Tipo: 'info', Tiempo muerto: 600 })

await navigator.clipboard.writeText( JSON.stringify( getSelectedParent() ) )

showNotification({ mensaje: '¡Elemento copié avec succès!', Tipo: 'Éxito' }) } catch (error) { showNotification({ mensaje: 'Impossible de copier l'élément.', Error }) } finalmente { clearTimeout(timeoutId) } })

/**

try { timeoutId = showNotification({ mensaje: 'Élément en cours de collage...', Tipo: 'info', Tiempo muerto: 600 })

const selectedParent = JSON.parse( await navigator.clipboard.readText() )

editor.getWrapper().append(selectedParent, { en: getSelectedParent().index() + 1 })

showNotification({ mensaje: '¡Elemento collé avec succès!', Tipo: 'Éxito' }) } catch (error) { showNotification({ mensaje: 'Impossible de coller l'élément.', Error }) } finalmente { clearTimeout(timeoutId) } })

/**

/**

  • Muestra una notificación al usuario
  • @see https://quasar.dev/quasar-plugins/notify
  • @param mensaje {string}
  • @param {cuerda} [tipo]
  • @param {objeto} [error]
  • @param {número} [tiempo muerto]
  • @returns {número|vacío} */ función showNotification ({ mensaje, tipo = 'error', error = {}, Tiempo muerto = 0 } = {}) { const notifType = { info: { icon: 'info', color: 'blue' }, Éxito: { icono: 'check_circle', color: 'verde' }, Error: { icon: 'error', color: 'red' } } const options = { mensaje, color: notifType[type].color, icon: notifType[type].icon }

if (error instance of Error) { options.caption = 'Pour l'IT : ${error?. mensaje}' }

const notify = () => Notify.create(options)

if (tiempo muerto > 0) { return setTimeout(() => notify(), timeout) }

notificar() } }

Respuestas (4)

artf4 de marzo de 2021

Eso porque has actualizado los comandos originales con tus versiones (incorrectamente). De hecho, si elimino tu plugin de la demo, todo funciona como se espera. Por favor, revisa el comando original de copiar y pegar, deberías clonar componentes antes de pegar, así que tu implementación no podría funcionar.

bgrand-ch4 de marzo de 2021

@artf Gracias por tu respuesta. ¿Un enlace, un ejemplo o más explicaciones, por favor? 😅

ClaudeCode17 de mayo de 2026

Gracias por informar de esto, @bgrand-ch.

El error **error: { icon: 'error', color: 'red' } ** ocurre cuando StyleManager intenta acceder a propiedades antes de que el ciclo de vida del componente esté completamente inicializado. Esta es una condición común de raza en GrapesJS.

Solución inmediata: Si controlas el código, envuelve las llamadas con comprobaciones nulas: '''javascript if (component && typeof component.readText === 'función') { tu código }


**Análisis de causa raíz:**
El StyleManager no valida el estado antes de invocar 'readText()', 'getWrapper()'. Esto crea una vulnerabilidad temporal cuando se realizan múltiples operaciones simultáneamente.

**Próximos pasos:**
1. Prueba la solución alternativa del nulo de guardia anterior
2. Actualización a la última versión de GrapesJS — muchas condiciones de carrera han sido corregidas
3. Si esto persiste, comparte tus pasos exactos de reproducción con el equipo
4. Considera añadir comprobaciones defensivas en la inicialización de tu propio componente

Esto se está monitorizando activamente y debería mejorarse en próximas versiones.

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

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 →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.