Приветствую друзей StackExchange!

У меня странная ситуация. У меня есть такой же шаблон проектирования для объекта «Контакт», и я пытаюсь воспроизвести его на объекте «Возможность».

Высокий уровень:

C-parent-component: получить данные записи и данные пользователя.

C-child-alert-component: будет получать данные и определять, следует ли отправлять предупреждение.

* примечание: дочерний компонент оповещения в настоящее время не вызывается в html родительского компонента, поэтому он пока не должен влиять на повторный запуск этого кода.

Проблема:

Родительский компонент использует @wire и getRecord. Когда возможность загружается, проводной метод срабатывает дважды. Я не уверен, почему это происходит, но это приводит к тому, что мой массив получает повторяющиеся значения и может создавать ненужные предупреждения.

Решение:

Пока нет. Пытался удалить @track в моем массиве, но это мало помогло. Я полагаю, что это может быть связано с тем фактом, что я извлекаю значения из родительской записи, а не напрямую из возможности.

JS: родительский компонент (HTML — это просто <template></template>)

import { LightningElement, api, wire } from 'lwc';
import { getRecord, getFieldValue } from 'lightning/uiRecordApi';
import {formatPhoneBare} from 'c/lwcFunctions'

//import methods
import getCurrentUser from '@salesforce/apex/LWC_ContactController.getCurrentUser';

//import fields
import USER_ID from '@salesforce/user/Id';
import PRIMARY_PHONE from '@salesforce/schema/Opportunity.Customer_Contact__r.Customer_Primary_Phone__c';
import PHONE_NUMBER_2 from '@salesforce/schema/Opportunity.Customer_Contact__r.Phone_2__c';
import PHONE_NUMBER_3 from '@salesforce/schema/Opportunity.Customer_Contact__r.Phone_3__c';

const fields = [PRIMARY_PHONE, PHONE_NUMBER_2, PHONE_NUMBER_3];

export default class OppCustomerPhoneData extends LightningElement {
    /* This component tree is used to alert agents if the customer contact on their opp needs an alternate phone added.
     * Structure:
     * Parent Component: OppCustomerPhoneData
     * * Child Component: OppContactPhoneAlert
    */

    @api objectApiName;
    @api recordId;

    // @track curPhoneNumber;
    // @track phone2;
    // @track phone3;
    phoneList = [];
    userObj = {
        ctmUserId: '',
        permission: ''
    }

    // test = this.isOpportunity(this.objectApiName);
    @wire(getRecord, {recordId: '$recordId', fields: fields})
    oppRecord({data,error}){
        if(data){
            console.log('OPP: Data Detected'); // The code block in the 'data' conditional is running 2x...not sure why?
            console.log(data)
            let curPhoneNumber = formatPhoneBare(getFieldValue(data,PRIMARY_PHONE));
            let phone2=formatPhoneBare(getFieldValue(data, PHONE_NUMBER_2));
            let phone3 = formatPhoneBare(getFieldValue(data, PHONE_NUMBER_3))
            // console.log(curPhoneNumber);
            // console.log(phone2);
            // console.log(phone3);


            if (curPhoneNumber) {
                this.phoneList.push(curPhoneNumber);
            }

            if (phone2) {
                this.phoneList.push(phone2);
            }

            if (phone3) {
                this.phoneList.push(this.phone3);
            }


        }else if (error) {
            console.log('Errors Detected');
            console.log(JSON.stringify(error));

        }

    }

    @wire(getCurrentUser, {userId: USER_ID})
    curUser({data, error}){
        if (data) {
            console.log('USER DATA');
            console.log(data);

            this.userObj.ctmUserId = data.Custom_Id__c;


        } else if(error){
            console.log('USER Data Not Found');

        }

    }
2
thinker 24 Июн 2020 в 20:53
Первый момент: есть проволока или императив, но нет такой вещи, как «императивная проволока». Я думаю, вы имеете в виду провод, использующий динамические реактивные переменные. Второй момент: провод срабатывает, когда все его параметры (которые могут быть динамическими реактивными переменными) имеют неопределенные значения и, для реактивных переменных, когда эти переменные изменяются. Вы также должны обнаружить, что он вызывается со значением {data: undefined, error: undefined} во время инициализации компонента. Однако, если значение recordId не изменяется во время инициализации компонента/страницы, я не уверен, как вы будете вызывать данные дважды.
 – 
Phil W
24 Июн 2020 в 20:32
1
Поскольку методы @wire используют (Cacheable=true), мне интересно, такое ли поведение, как описано здесь, где обратный вызов запускается дважды (один раз с кэшированными данными и один раз со свежими данными). В качестве обходного пути, не могли бы вы очищать this.phoneList каждый раз, когда получаете данные?
 – 
adriancg
24 Июн 2020 в 20:49
Спасибо за пояснение по императиву. Извините за путаницу, обновлю пост. Я тоже не уверен, почему это изменится, поскольку recordId не меняется. Единственное, что я могу понять, это то, что что-то еще работает на opp, что может меняться, вызывая повторный рендеринг?
 – 
thinker
24 Июн 2020 в 20:49
Казалось бы, когда новые данные будут доступны, функция запустится. Согласно документации: > Функция вызывается всякий раз, когда доступно значение, которое может быть до или после подключения или рендеринга компонента.
 – 
thinker
24 Июн 2020 в 20:53

1 ответ

Лучший ответ

Предполагая, что этот компонент находится в записи возможности, это вполне разумное поведение. Запись уже загружена один раз, поэтому возвращается кешированная версия, затем LDS (служба данных Lightning) проверяет обновленное значение, а затем снова вызывается проводной метод. Ваш код должен уметь определять, находится ли заданное значение уже в массиве, и не добавлять его снова, а вместо этого обновлять существующую запись.

2
sfdcfox 24 Июн 2020 в 22:04