Comunicación entre elemento secundario y principal
Objetivos de aprendizaje
En este proyecto, alcanzará los siguientes objetivos:
- Crear componentes web Lightning que se comuniquen entre ellos.
- Gestionar la comunicación desde un componente secundario hasta su componente principal.
- Gestionar la comunicación desde un componente principal hasta un componente secundario.
- Gestionar la comunicación desde un componente hasta un componente no relacionado.
Este proyecto está pensado para desarrolladores de Salesforce que tengan algo de experiencia con la creación de componentes web Lightning. Si todavía no domina mucho los componentes web Lightning, le recomendamos completar algunas de las insignias de la ruta Crear componentes web Lightning antes de seguir con este proyecto.
Cómo se comunican los componentes
Cuando varios componentes web Lightning conforman una aplicación, lo habitual es querer que compartan información entre ellos. La forma en que se comunican los componentes depende de si se relacionan y cómo lo hacen. Cuando hay un componente dentro de otro, se genera una relación principal-secundario. La comunicación desde un principal a un secundario es distinta de la comunicación desde un secundario a un principal. Y estos tipos de comunicación son distintas a la que se establece entre los componentes no relacionados (componentes en árboles secundarios de DOM diferentes).
En este proyecto, vamos a establecer comunicaciones entre componentes que tienen cada uno de estos tipos de relación.
Antes de comenzar
Se presupone que tiene configurado un entorno de desarrollo de Salesforce DX tiene experiencia utilizándolo para desarrollar componentes web Lightning e implementarlos en una organización. Si todavía no está familiarizado con este proceso, complete el proyecto Inicio rápido: Lightning Web Components antes de continuar con el proyecto.
Crear un nuevo Trailhead Playground
En este proyecto, tendrá que crear un nuevo Trailhead Playground. Desplácese hasta el final de la página, haga clic en el nombre del Playground y haga clic en Create a Trailhead Playground (Crear un Trailhead Playground). La creación de un nuevo Trailhead Playground suele tardar entre 3 y 4 minutos.
Obtener el nombre de usuario y la contraseña de su Trailhead Playground
Vamos a empezar. Vaya a su Trailhead Playground. Si no está abierto, desplácese hasta la parte inferior de esta página y haga clic en Launch (Iniciar). Si ve una ficha en su organización etiquetada como Obtener sus credenciales de inicio de sesión, ¡excelente! Vaya al primer paso. De lo contrario, en App Launcher (), busque y abra Playground Starter y siga los pasos.
- Haga clic en la ficha Get Your Login Credentials (Obtener sus credenciales de inicio de sesión) y anote su nombre de usuario.
- Haga clic en Reset My Password (Restablecer mi contraseña). Con esta acción se envía un correo electrónico a la dirección asociada a su nombre de usuario.
- Haga clic en el vínculo en el correo electrónico.
- Introduzca una nueva contraseña, confírmela y haga clic en Change Password (Cambiar contraseña).
Configurar el proyecto
- En Visual Studio Code, cree un proyecto de Salesforce DX con el nombre
Event Comms
.
- Autorice su Trailhead Playground.
Comunicarse con un evento personalizado
Vamos a empezar con un escenario sencillo. Un componente secundario envía un evento personalizado que desencadena una actualización en el componente principal.
Cuando se envía un evento, puede elegir entre enviar datos y permitir que el evento aparezca por el DOM. Vamos a empezar con un escenario sencillo. Un componente secundario envía un evento personalizado que desencadena una actualización en el componente principal.
Comunicación desde el componente "controls" hasta el componente "numerator"
- Cree una página de aplicación Lightning de tres regiones con el nombre
Event Comms
- En su organización (su Trailhead Playground), abra Setup (Configuración).
- En el cuadro Quick Find (Búsqueda rápida), escriba
Lightning App Builder
y, a continuación, seleccione Lightning App Builder.
- Haga clic en New (Nuevo).
- Con App Page (Página de aplicación) seleccionado, haga clic en Next (Siguiente).
- En Label (Etiqueta), escriba
Event Comms
y haga clic en Next (Siguiente).
- Seleccione Three Regions (Tres regiones) y luego haga clic en Done (Listo).
- Haga clic en Save (Guardar), Activate (Activar), Save (Guardar) y Skip and Save (Omitir y guardar).
- Haga clic en
para salir de Lightning App Builder.
- Cree el componente web Lightning principal con el nombre
numerator
.
- En Visual Studio Code, en force-app/main/default, haga clic con el botón derecho en la carpeta lwc y seleccione SFDX: Create Lightning Web Component (Crear un componente web Lightning).
- Escriba
numerator
como nombre del componente nuevo.
- Pulse Enter (Intro) y luego vuelva a pulsar Enter (Intro) para aceptar la carpeta predeterminada
force-app/main/default/lwc
.
- Codifique los archivos del componente "numerator":
- En numerator.js, pegue este código dentro de la clase
Numerador
(Numerador):counter = 0; handleIncrement() { this.counter++; } handleDecrement() { this.counter--; }
- Guarde el archivo.
- Abra numerator.html y agregue este código entre las etiquetas
template
:<lightning-card title="Numerator" icon-name="action:manage_perm_sets"> <p class="slds-text-align_center slds-var-m-vertical_medium"> Count: <lightning-formatted-number value={counter}></lightning-formatted-number> </p> <!-- controls go here --> </lightning-card>
- Guarde el archivo.
- Para que el componente "numerator" esté disponible en páginas de aplicación Lightning, abra numerator.js-meta.xml y sustituya la etiqueta
isExposed
por estas líneas:<isExposed>true</isExposed> <targets> <target>lightning__AppPage</target> </targets>
- Guarde el archivo.
- Agregue el componente "numerator" a la aplicación Event Comms:
- Haga clic con el botón derecho en la carpeta lwc y seleccione SFDX: Deploy This Source to Org (SFDX: Implementar este código fuente en la organización) para implementar la carpeta lwc en la organización.
- Desde App Launcher (Iniciador de aplicación,
) en su Playground, busque y abra Event Comms.
- Haga clic en
y seleccione Edit Page (Modificar página) para abrir la página de la aplicación Event Comms para editarla.
- Arrastre el componente numerator (en Custom [Personalizados] en la lista de componentes) a la región izquierda de la página.
- Haga clic en Save (Guardar).
- Haga clic en
para salir de Lightning App Builder.
- Cree y codifique el componente secundario con el nombre
controls
:
- Vuelva a Visual Studio Code y cree un componente web Lightning con el nombre
controls
.
- En controls.js, pegue este código dentro de la clase
Controls
(Controles):handleAdd() { this.dispatchEvent(new CustomEvent('add')); } handleSubtract() { this.dispatchEvent(new CustomEvent('subtract')); }
- Guarde el archivo.
- Abra controls.html y agregue este código entre las etiquetas
template
:<lightning-card title="Controls" icon-name="action:upload"> <lightning-layout> <lightning-layout-item flexibility="auto" padding="around-small"> <lightning-button label="Subtract" icon-name="utility:dash" onclick={handleSubtract}> </lightning-button> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="around-small"> <!-- buttons go here --> </lightning-layout-item> <lightning-layout-item flexibility="auto" padding="around-small"> <lightning-button label="Add" icon-name="utility:add" onclick={handleAdd} icon-position="right"> </lightning-button> </lightning-layout-item> </lightning-layout> </lightning-card>
- Guarde el archivo.
- Agregue el componente secundario (controls) al componente principal (numerator):
- Abra numerator.html y sustituya el comentario
controls go here
(aquí van los controles) por el siguiente código:<c-controls class="slds-show slds-is-relative" onadd={handleIncrement} onsubtract={handleDecrement}> </c-controls>
- Guarde el archivo.
- Verifique las comunicaciones:
- Para ver los cambios en Salesforce, implemente la carpeta lwc y actualice la página de la aplicación Event Comms en su organización de Trailhead Playground.
- Haga clic en Add (Sumar) y observe cómo aumenta el recuento.
- Haga clic en Substract (Restar) y observe cómo disminuye el recuento.
Ahora tenemos un componente secundario (controls) que enviar un evento add
(sumar) al componente principal (numerator), desencadenando así la función handleIncrement
en el componente principal (numerator).
Enviar datos con el evento personalizado
Ahora vamos a hacer que el componente secundario envíe datos con el evento al componente principal. La empresa quiere multiplicar el recuento. Vamos a ofrecerle más de una opción. Una opción es usar un evento personalizado para enviar datos del secundario al principal.
- Agregue botones de multiplicación y una función de multiplicación al componente secundario (controls):
- Abra controls.html y sustituya el comentario
buttons go here
(aquí van los botones) dentro de la segunda etiquetalightning-layout-item
por el siguiente código:<lightning-button label="2" data-factor="2" icon-name="utility:close" onclick={handleMultiply}> </lightning-button> <lightning-button label="3" data-factor="3" icon-name="utility:close" onclick={handleMultiply}> </lightning-button>
- Guarde el archivo.
- Abra controls.js y agregue esta función
handleMultiply
después de la funciónhandleSubstract
:Fíjese en que enviamos el eventohandleMultiply(event) { const factor = event.target.dataset.factor; this.dispatchEvent(new CustomEvent('multiply', { detail: factor })); }
onclick
a la funciónhandleMultiply
y esta envía el valor dedata-factor
del botón aevent.target.dataset.factor
. Después enviamos el valor defactor
junto con el nuevo evento personalizado (multiply
) al componente principal (numerator).
- Guarde el archivo.
- Actualice el componente principal (numerator):
- Abra numerator.html y agregue este atributo a la etiqueta
c-controls
:onmultiply={handleMultiply}
- Guarde el archivo.
- Abra numerator.js y agregue esta función
handleMultiply
después de la funciónhandleDecrement
:Aquí, la funciónhandleMultiply(event) { const factor = event.detail; this.counter *= factor; }
handleMultiply
obtiene el eventoonmultiply
enviado y utiliza sus datos (event.detail
) para actualizar el recuento (counter).
- Guarde el archivo.
- Verifique las comunicaciones:
- Para ver los cambios en Salesforce, implemente la carpeta lwc y actualice la aplicación Event Comms.
- Haga clic en Add (Sumar) y observe cómo aumenta el recuento.
- Haga clic en X 2 y observe cómo se multiplica el recuento por dos.
- Haga clic en X 3 y observe cómo se multiplica el recuento por tres.
El componente "controls" envía datos (data-factor
) a su componente principal (numerator) junto el evento personalizado multiply
.
Permitir que aparezcan eventos personalizados
Los dos botones de multiplicación han sido todo un éxito. Ahora la empresa quiere más opciones para multiplicar. Vamos a hacer que sea fácil agregar todos los botones que quieran. Vamos a agregar otro componente web Lightning para los botones. Para permitir las comunicaciones, vamos a usar la opción de propagación de eventos. La propagación permite que el evento personalizado del componente de botón se propague al árbol de DOM.
- Cree un componente con el nombre
button
(botón):
- Cree un componente web Lightning con el nombre
button
(botón).
- En button.js, pegue este código dentro de la clase
Button
(Botón):@api label; @api icon; handleButton(event) { this.dispatchEvent(new CustomEvent('buttonclick',{ // bubbles: true })); }
- Importe el decorador
api
desde el módulolwc
.import { LightningElement, api } from 'lwc';
- Guarde el archivo.
- Abra button.html y agregue este código entre las etiquetas
template
:<lightning-button label={label} data-factor={label} icon-name={icon} onclick={handleButton}> </lightning-button>
- Guarde el archivo.
- Convierta el componente "button" en un componente secundario del componente "controls":
- Abra controls.html y elimine el
lightning-layout-item
que contiene dos etiquetaslightning-button
.
- En su lugar, pegue el siguiente código:Observe que hemos trasladado la llamada a la función
<lightning-layout-item flexibility="auto" padding="around-small" onbuttonclick={handleMultiply}> <template for:each={factors} for:item="factor"> <c-button key={factor} label={factor} data-factor={factor} icon="utility:close"> </c-button> </template> </lightning-layout-item>
handleMultiply
al controladoronbuttonclick
enlightning-layout-item
. Esto nos permite ahorrarnos tener que agregar un controlador en todos los botones, por lo que se genera un código más limpio de forma más rápida.
- Guarde el archivo.
- Abra controls.js y agregue esta propiedad
factors
en la claseControls
(Controles):factors = [0,2,3,4,5,6];
- Guarde el archivo.
- Verifique las comunicaciones:
- Para ver los cambios en Salesforce, implemente la carpeta lwc y actualice la página de la aplicación Event Comms.
- Haga clic en Add (Sumar) y observe cómo aumenta el recuento.
- Haga clic en X 2 y verá que no ocurre nada. ¿Por qué? De forma predeterminada, un evento personalizado no se propaga pasando por el host.
[Texto alternativo: Evento personalizado que no pasa por su contenedor.]
Para que el evento (buttonclick
) se propague alightning-layout-item
, tenemos que agregarbubbles:true
enCustomEvent
.
- Abra button.js y quite el comentario (elimine las barras
//
de delante)bubbles:true
.
[Texto alternativo:: Ahora, el evento personalizado se propaga pasando por su contenedor.]
- Guarde el archivo y vuelva a llevar a cabo la implementación.
- Actualice la página de la aplicación Event Comms.
- Ahora haga clic en Add (Sumar) para definir el recuento en 1.
- Haga clic en X 2 y observe cómo se multiplica el recuento por dos.
- Haga clic en X 6 y observe cómo se multiplica el recuento por seis.
- Haga clic en X 0 y observe se restablece el recuento en cero.
- Pruebe con los siguientes clics: Add (Sumar), X 2, X 5, X 2, Add (Sumar), X 2. O bien: Add (Sumar), X 3, X 2, X 2, Subtract (Restar), X 2, Subtract (Restar), X 2. También puede probar con otra combinación.
Póngase a prueba (es opcional, no vamos a revisar el código)
Agregue una segunda instancia del componente "button" (botón) en el componente "controls" (controles) para crear botones de división que aparezcan en el componente "numerator".
Resumen
En este paso, ha establecido la comunicación desde un componente secundario a su principal mediante un evento personalizado. Ha enviado el evento con y sin datos, y ha visto cómo afecta la propagación a las comunicaciones de componente secundario a componente principal. En el siguiente paso, vamos a centrarnos en las comunicaciones de componente principal a secundario.
Recursos
- Trailhead: Inicio rápido: Explore the LWC Recipes Sample App (Explorar la aplicación de muestra LWC Recipes)
- Guía del desarrollador de componentes web Lightning: Create and Dispatch Events (Crear y enviar eventos)
- GitHub: LWC Recipes: eventSimple (Recetas de LWC: eventSimple)
- GitHub: LWC Recipes: eventWithData (Recetas de LWC: eventWithData)
- GitHub: LWC Recipes: eventBubbling (Recetas de LWC: eventBubbling)
- MDN Web Docs: Creating and triggering events (Creación y desencadenamiento de eventos)
- Blog de Salesforce Developers: Inter-Component Communication Patterns for Lightning Web Components (Comunicación entre componentes web Lightning)
- Blog de Salesforce Developers: How Events Bubble in Lightning Web Components (Cómo se propagan los eventos en los componentes web Lightning)