Issue #2043💬 RespondidoAbierto el 28 de mayo de 2019por megargReacciones 0

Añadir componentes personalizados no funciona

Respuesta rápidapor artf

En primer lugar, usa la API mejorada. El 'isComponent' solo se activa si necesitas analizar una cadena HTML; si pasas el objeto component (por ejemplo, '{ type: 'input2', }') el análisis no es necesario. No ves nada en el lienzo porque obviamente no hay ningún elemento INPUT2 en HTML5

Lee la respuesta completa abajo ↓

Pregunta

He investigado mucho, pero aún así no he podido añadir un componente personalizado. Probé el ejemplo en la documentación oficial (para modificar el comportamiento del elemento "input" y funciona bien). https://grapesjs.com/docs/modules/Components.html#define-new-component

Pero el ejemplo anterior es para modificar el componente existente ("entrada").

Estoy intentando averiguar cómo crear un nuevo componente. A continuación está mi código, pero no funciona (no imprimo nada en consola cuando lo arrastro en el formulario). - ten en cuenta que usé el ejemplo oficial y lo cambié un poco para crear este componente personalizado.

Por favor, ayudadme con qué puedo estar haciendo mal aquí...

comps.addType('input2', { Defina el modelo model: defaultModel.extend({ Extender propiedades predeterminadas defaults: Object.assign({}, defaultModel.prototype.defaults, { Solo puede ser eliminado dentro de elementos de 'forma' arrastrable: 'forma, forma *', No puedes meter otros elementos dentro Droppable: falso,

Fragmento de códigoTEXT
Rasgos (Escenarios)
            
}),
          },
          El segundo argumento de .extend son los métodos estáticos y pondremos dentro de nuestro
          método isComponent(). Mientras pones un nuevo tipo de Componente encima de la pila,
          No declarar isComponent() probablemente podría romper cosas, especialmente si extiendes
          el predeterminado.
          {
            isComponent: function(el) {
              if(el.tagName == 'INPUT2'){
                console.log('Estoy en isComponent: el:', el);
                return {type: 'input2'};
              }
            },
          }),

Definir la vista
          view: defaultType.view.extend({
          Eventos de vinculación
          eventos: {
            Si quieres vincular el evento a elementos infantiles
            'haz clic en .someChildrenClass': 'métodoNombre',
            clic: 'handleClick',
            dblclick: function(){
              alerta ('¡Hola!');
            }
          },

No tiene mucho sentido que este método esté dentro del componente
          Pero está bien como ejemplo
          randomHex: función() {
            return '#' + Math.floor(Math.random()*16777216).toString(16);
          },

handleClick: function(e) {
            this.model.set('style', {color: this.randomHex()}); <- Afecta al código HTML final
            this.el.style.backgroundColor = this.randomHex(); <- No afecta al código HTML final
            Consejo: actualizar el modelo reflejará los cambios en la vista, así que, en este caso,
            si pones el cambio de modelo después del del DOM, esto sobrescribirá el Color de fondo
            Cambios realizados antes
          },

El render() debería devolver 'esto'
          render: función () {
            Extiende el método de renderizado original
            defaultType.view.prototype.render.apply(esto, argumentos);
            this.el.placeholder = 'Mi texto aquí'; <- No afecta al código HTML final
            devuelvo esto;
          },
        }),
      });

Un bloque para el componente personalizado
       editor. BlockManager.add('input2', {
          etiqueta: 'Mi componente personalizado',
          atributos: {
            clase:'input2'
          },
          Contenido: {
            Componente de 'mapa' incorporado
            tipo: 'input2',
            etiquetaNombre: 'INPUT2',
           Estilo: { Altura: '350px'},
            Una vez insertado, no se puede quitar (solo un ejemplo)
            Removible: falso
          }
        
contenido: (<div>Foo</div>),
      });

Respuestas (1)

artf30 de mayo de 2019

En primer lugar, usa la API mejorada. El 'isComponent' solo se activa si necesitas analizar una cadena HTML; si pasas el objeto component (por ejemplo, '{ type: 'input2', }') el análisis no es necesario.

No ves nada en el lienzo porque obviamente no hay ningún elemento INPUT2 en HTML5

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.