В веб-компонентах Lightning (LWC) мы можем использовать JavaScript для извлечения значений элементов HTML с помощью манипулирования DOM (объектной моделью документа). Вот пример того, как мы можем получить значения элементов HTML в файле JavaScript в LWC:
Использование события onchange в LWC:
<template> <lightning-input label = "First Name" onchange={firstNameHandler}></lightning-input> <lightning-input label = "Last Name" onchange={lastNameHandler}></lightning-input> <div class="slds-m-around_medium"> First Name is {firstName} <br> Last Name is {lastName} </div> </template> import { LightningElement } from 'lwc'; export default class GetInput extends LightningElement { firstName; lastName; firstNameHandler(event) { this.firstName = event.target.value; } lastNameHandler(event) { this.lastName = event.target.value; } } <?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>56.0</apiVersion> <isExposed>true</isExposed> <targets> <target>lightning__RecordPage</target> <target>lightning__AppPage</target> <target>lightning__HomePage</target> </targets> </LightningComponentBundle>
Недостатки события onchange в LWC:
- Чрезмерное использование вызовов на стороне сервера: если событие onchange запускает действие на стороне сервера каждый раз, когда обнаруживается изменение, это может привести к чрезмерному количеству вызовов на стороне сервера. Это может повлиять на производительность и эффективность вашего компонента LWC, особенно в сценариях с частыми изменениями полей ввода.
- Возможные проблемы с производительностью: если обработчик события onchange включает сложную логику или выполняет трудоемкие операции, это может повлиять на производительность вашего компонента LWC. Это может привести к замедлению времени отклика и ухудшению взаимодействия с пользователем.
Таким образом, вместо события onchange мы можем использовать такие атрибуты, как атрибут data-id, data-prop-value и lwc:ref.
Использование директивы lwc:ref:
<template> <div class="slds-m-around_medium"> <lightning-input label = "First Name" lwc:ref="firstName"></lightning-input> <lightning-input label = "Last Name" lwc:ref="lastName"></lightning-input> <lightning-button label="Submit" onclick={submitHandler}></lightning-button> </div> <div class="slds-m-around_medium"> First Name is {firstName} <br> Last Name is {lastName} </div> </template> import { LightningElement } from 'lwc';export default class GetInput extends LightningElement { firstName; lastName; submitHandler() { this.firstName = this.refs.firstName.value; this.lastName = this.refs.lastName.value; } } <?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>56.0</apiVersion> <isExposed>true</isExposed> <targets> <target>lightning__RecordPage</target> <target>lightning__AppPage</target> <target>lightning__HomePage</target> </targets> </LightningComponentBundle>
Использование атрибута data-id:
<template> <div class="slds-m-around_medium"> <lightning-input label = "First Name" data-id="firstName"></lightning-input> <lightning-input label = "Last Name" data-id="lastName"></lightning-input> <lightning-button label="Submit" onclick={submitHandler}></lightning-button> </div> <div class="slds-m-around_medium"> First Name is {firstName} <br> Last Name is {lastName} </div> </template> import { LightningElement } from 'lwc'; export default class GetInput extends LightningElement { firstName; lastName; submitHandler() { this.firstName = this.template.querySelector('[data-id="firstName"]').value; this.lastName = this.template.querySelector('[data-id="lastName"]').value; } } <?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>56.0</apiVersion> <isExposed>true</isExposed> <targets> <target>lightning__RecordPage</target> <target>lightning__AppPage</target> <target>lightning__HomePage</target> </targets> </LightningComponentBundle>
Использование атрибута data-prop-name:
<template> <div class="slds-m-around_medium"> <lightning-input label="First Name" data-prop-name="firstName"></lightning-input> <lightning-input label="Last Name" data-prop-name="lastName"></lightning-input> <lightning-button label="Submit" onclick={submitHandler}></lightning-button> </div> <div class="slds-m-around_medium"> First Name is {firstName} <br> Last Name is {lastName} </div> </template> import { LightningElement } from 'lwc'; export default class GetInput extends LightningElement { firstName; lastName; submitHandler() { this.firstName = this.template.querySelector('[data-prop-name="firstName"]').value; this.lastName = this.template.querySelector('[data-prop-name="lastName"]').value; } } <?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>56.0</apiVersion> <isExposed>true</isExposed> <targets> <target>lightning__RecordPage</target> <target>lightning__AppPage</target> <target>lightning__HomePage</target> </targets> </LightningComponentBundle>
Вывод:
Ссылки находят элементы DOM без селектора и запрашивают только элементы, присутствующие в указанном шаблоне, что делает их более производительными, чем querySelector. Поэтому мы должны воспользоваться директивой lwc:ref.