Issue #2999💬 RespondidoAbierto el 3 de septiembre de 2020por jenterReacciones 0

Problemas de ordenación de arrastre en el Componente Web con Shadow Dom desactivado

Respuesta rápidapor artf

Este bug/solicitud no es solo para StencilJS, sino en general con Web Components y el Shadow DOM. ¿Existen buenas prácticas con uvas y componentes web para habilitar o rastrear eventos que medien estos problemas? No trabajo mucho con Web Components, así que si puedes crear una demo reproducible (por ejemplo, un compon...

Lee la respuesta completa abajo ↓

Pregunta

Version 16.10

¿Puedes reproducir el error de la demo?

[X] Sí [ ] No

¿Cuál es el comportamiento esperado?

Que GrapesJS puede soportar la interacción de arrastrar y ordenar con Web Components personalizados que no tienen activado el Shadow DOM.

Describe el bicho

Hola, usamos GrapesJS extensamente e integramos muchos de nuestros componentes web personalizados, que se generan usando el proyecto StencilJS. Un problema que encontramos es arrastrar elementos a los Componentes Web. Sin embargo, esto solo es problemático si el DOM de la sombra está deshabilitado ('sombra: falso').

DOM de sombra activado: [Sin error]

! ShadowON

DOM de sombra desactivado: [Bug]

! ShadowOFF

El problema es que cuando intentas eliminar un elemento HTML en el Componente Web, Grapes no parece entender las referencias DOM / Node (suponiendo) y por tanto no puede hacer drop dentro de ellas. Lo curioso es que este bug no es un problema (incluso con el dom de sombras desactivado) si envuelves cualquier contenido ranurado en un DIV.

# Bicho 
<faux-grid-item>
      <p>Ejemplo</p>
       ...
# Sin Bugs 
<faux-grid-item>
   <div>
      <p>Ejemplo</p>
       ...

Este bug/solicitud no es solo para StencilJS, sino en general para Web Components y el Shadow DOM. ¿Existen buenas prácticas con uvas y componentes web para habilitar o rastrear eventos que medien estos problemas?

Ejemplo de una captura de pantalla de un componente personalizado en stenciljs:

@Component({
  etiqueta: 'objeto de cuadrícula falsa',
  styleUrl: 'faux-grid-item.css',
  sombra: falso, // <<=== causa problemas
})

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

[X] Sí (adjuntar) [ ] No

Respuestas (3)

artf8 de septiembre de 2020

Este bug/solicitud no es solo para StencilJS, sino en general con Web Components y el Shadow DOM. ¿Existen buenas prácticas con uvas y componentes web para habilitar o rastrear eventos que medien estos problemas?

No trabajo mucho con Web Components, así que si puedes crear una demo reproducible (por ejemplo, un componente personalizado usando Web Components en el fondo), eso nos ayudaría a depurar y entender el problema.

jenter9 de septiembre de 2020

@artf de nada, gracias por la rápida respuesta.

He importado mi biblioteca personalizada de componentes web aquí en este Fiddle para demostrar el problema: https://jsfiddle.net/jenter77/5btn2ao7/25/

! violínOrden

Si haces referencia a mi repositorio público y al ejemplo del componente web "faux-grid-item" aquí, verás que es simplemente un componente sencillo que se retrasa un par de segundos y luego carga. Si shadowDOM está desactivado, ocurre el error de ordenar/arrastrar.

importar { Componente, Estado, h } de '@stencil/core';

@Component({
  etiqueta: 'objeto de cuadrícula falsa',
  styleUrl: 'faux-grid-item.css',
  sombra: falso, // <<=== causa problemas
})

...
artf14 de septiembre de 2020

Hola Jason, he intentado ver qué está pasando dentro del editor y no estoy seguro de cómo la opción 'sombra' afecta realmente a este comportamiento, pero el principal problema que veo es ese elemento dinámico '<div class="delayed--wrapper">'. Básicamente, el editor, en el análisis posterior, tiene esta estructura de componentes '''html <faux-grid-item> <p>Hola</p> <p>Hola</p> <p>Hola</p> </faux-grid-item>

pero el DOM real sí
'''html
<faux-grid-item>
   <div class="delayed--wrapper">
        <p>Hola</p>
        <p>Hola</p>
        <p>Hola</p>
   </div>
</faux-grid-item>

Este desalineamiento confunde al clasificador porque 'div.delayed--wrapper' no está conectado a ningún componente. De hecho, para "fingir" tu comportamiento esperado tendrías que mantener un solo div dentro de tu plantilla '''html <faux-grid-item>

<div> <p>Hola</p> <p>Hola</p> <p>Hola</p> </div> </faux-grid-item> ```

Desafortunadamente, no veo cómo se pueda solucionar esto (por eso cerraré el tema). Cuando el clasificador indica que se elimine un Bloque en la posición X (por ejemplo, después de los 2 hijos) de FauxGridItem, añadirá el nuevo componente eliminado dentro de la colección de hijos de FauxGridItem y entonces la vista del componente renderizará el DOM en la misma posición, pero en este caso no será posible porque FauxGridItem solo tiene 1 hijo ('div.delayed--wrapper').

Así que, para recapitular, modificar el DOM fuera del editor crea efectos secundarios impredecibles. Lo mismo ocurre con los frameworks que dependen del DOM virtual (por ejemplo, React, Vue, etc.) siempre se recomienda evitar tratar directamente con el DOM, ya que podrías romper su estado virtual.

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.