Los componentes han perdido sus estilos
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?
- Copiar el componente padre seleccionado (contenedor) al portapapeles.
- Pegar el componente padre seleccionado (contenedor) del portapapeles (en la misma página u otra página).
- Todos los componentes mantienen estilos de ID y estilos en línea.
¿Cuál es el comportamiento actual?
- Copiar el componente padre seleccionado (contenedor) al portapapeles.
- Pegar el componente padre seleccionado (contenedor) del portapapeles (en la misma página u otra página).
- 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:
- Seleccionar un componente.
- Copia este componente con 'Ctrl/Cmd + C'.
- Pega el componente copiado con 'Ctrl/Cmd + V'.
- 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'
/**
- Copiar y pegar en la misma página y entre páginas
- @see https://grapesjs.com/docs/modules/Plugins.html
- @param {object} editor
- @param {objeto} opciones
- @returns {vacío}
/
Función por defecto de exportación (editor, opciones) {
/*
- Copiar un componente a la carpeta
- @see https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/writeText
- @returns {vacío} */ editor. Commands.add('core:copy', async () => { sea timeoutId = null
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) } })
/**
- Pegar un componente de la tabla
- @see https://grapesjs.com/docs/api/editor.html
- @see https://grapesjs.com/docs/api/component.html
- @see https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/readText
- @returns {vacío} */ editor. Commands.add('core:paste', async () => { sea timeoutId = null
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) } })
/**
- Recupera el componente padre
- @see https://grapesjs.com/docs/api/editor.html
- @see https://grapesjs.com/docs/api/component.html
- @returns {objeto} */ función getSelectedParent () { Editor de regreso .getSelected() .más cercano(¿opciones?). ParentSelector || '#wrapper > div') }
/**
- 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)
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.
@artf Gracias por tu respuesta. ¿Un enlace, un ejemplo o más explicaciones, por favor? 😅
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.
Issue #3259
v0.16.27 - El estilo/ID desaparece cuando se anida el span
Versión: 0.16.27 ¿Puedes reproducir el error de la demo? [ ] Sí [ ] No [X] Vídeo pero sin demo ¿Cuál es el comportamiento esperado? Añade t...
Issue #3693
AdoptStylesheet no soportado en grapesJS
Versión: Puedes obtener la versión escribiendo 'grapesjs.version' en la consola 0.17.22 ¿Puedes reproducir el error de la demo?[x] Sí[ ] No...
Issue #3397
Dirección incorrecta del clasificador con la ranura de componentes web
Versión: 0.16.45 ¿Puedes reproducir el error de la demo?[x] Sí[ ] No ¿Cuál es el comportamiento esperado? Dada una instancia de componente...
Issue #3131
Pegar como texto plano en el componente de texto añade <tipo de fuente /> envoltorio al texto pegado
Versión: 0.16.27 ¿Puedes reproducir el error de la demo? [] Sí [X] No ¿Cuál es el comportamiento esperado? Pegar como texto plano (nodo 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 →Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.