Практичний посібник по сигналах — Частина I

У постійному розвитку світі веб-розробки Angular представляє новий реактивний примітив під назвою сигнали, який спрощує управління станом і робить реактивне програмування більш інтуїтивно зрозумілим. Цей посібник надає огляд сигналів, їхніх основних концепцій та практичних застосувань, що покращують ваш досвід розробки в Angular.

У першій частині ми детально розглянемо нюанси сигналів.

Що таке сигнали?

Сигнал — це особливий тип змінної, яка зберігає значення і сповіщає підписників про зміни цього значення. На відміну від традиційних змінних, сигнали є:

  • Реактивними: автоматично поширюють зміни на залежні обчислення.
  • Завжди мають значення: сигнали зберігають синхронний і консистентний стан.
  • Легкими: це не заміна для RxJS та обсервабель, а простіша альтернатива для конкретних випадків.

Можна уявити сигнал як змінну з механізмом сповіщення про зміни.

Давайте подивимося на приклад.

Ось я створив компонент слайдера, де користувач може переміщувати повзунок, щоб збільшити кількість ліцензій, і відповідно буде обчислено новий загальний обсяг. Ви помітите, що тут є два сигнали: “noOfLicenses” та “maxPricePerUser” разом із обчисленим сигналом “maxTotalPayable”.

pic

Приклад сигналів разом з обчисленим сигналом

Обчислені сигнали

Похідна реактивність

Сигнали можуть отримувати свої значення з інших сигналів, створюючи обчислені сигнали. Коли вихідний сигнал оновлюється, всі залежні обчислені сигнали оновлюються автоматично. Це надає елегантний, декларативний спосіб роботи з похідними станами.

  • API обчислення працює, приймаючи один або кілька вихідних сигналів і створюючи новий сигнал.
  • Коли вихідний сигнал змінюється (у нашому випадку це maxTotalPayable або totalPayable сигнал), обчислений сигнал totalSavings оновлюється негайно.

pic

Приклади обчислених сигналів.

Чи потрібно підписуватися на сигнал?

Немає потреби в ручних підписках.

Немає потреби в ручних підписках! Сигнали та обчислені сигнали автоматично відстежують залежності:

  • Коли обчислювальна функція викликається вперше, Angular визначає залежності на основі використаних сигналів.
  • Подальші зміни вихідних сигналів спричиняють автоматичне оновлення обчисленого сигналу.

Це усуває необхідність у шаблонних підписках, роблячи ваш код чистішим і легшим для обслуговування.

pic

Angular знає, що існує залежність між сигналами maxTotalPayable, totalPayable та totalSavings.

Що, якщо нам потрібно зчитати значення сигналу з обчисленого сигналу без створення залежності?

Використовуйте untracked. Давайте подивимося на приклад:

pic

Ми не хочемо відстежувати зміни, що викликаються сигналом “maxPricePerUser”

API ефекту: Реакція на зміни сигналу

Хоча обчислені сигнали обробляють похідні стани, API ефекту дозволяє виконувати побічні ефекти, коли сигнал змінюється.
Приклади побічних ефектів:

  • Логування значень
  • Зберігання значень сигналів у localStorage
  • Синхронізація даних з базою даних

Ось приклад, де ми виводимо користувача з додатку, якщо його електронна пошта не підтверджена, використовуючи API ефекту.

pic

Загальні проблеми з API ефекту:

pic

Помилка NG0600: Запис у сигнали за замовчуванням не дозволено в обчисленому чи ефекті.

Однією з найбільш поширених помилок, коли ви починаєте вивчати сигнали, є спроба set значення сигналу в межах ефекту, як показано нижче:

pic

Отже, яке рішення?

По-перше, якщо ви зустріли таку ситуацію, варто переглянути дизайн вашого коду. Однак ви можете використати allowSignalWrites.

pic

Помилка NG0203: effect() може бути використаний тільки в контексті ін’єкцій......

Це помилка, з якою ви можете стикатися досить часто, поки не зрозумієте концепцію. Подивіться на приклад нижче, де ми намагаємось використовувати effect всередині ngOnInit, і бум! Отримуємо помилку:

pic

Ви можете легко виправити це, використовуючи будь-який з трьох наведених нижче способів:

pic

Приклади контексту ін’єкцій

Хороша стаття про контекст ін’єкцій.

Механізми очищення

Ви можете використовувати manualCleanup для знищення своїх ефектів.

pic

Використання "manualCleanup"

Angular також надає утиліти, такі як onCleanup для управління ресурсами. Ви можете використовувати це, коли потрібно зробити наступне:

  • Відписатися від обсервабель
  • Очистити setTimeout або setInterval
  • Закрити мережеві з'єднання

pic

Використання "onCleanup"

Хороша стаття про знищення ефектів

Angular активно розширює можливості сигналів, з такими новими функціями, як:

Ці можливості прокладають шлях до глибшої інтеграції сигналів в Angular-додатках.

Нове API output імітує введення сигналу, але важливо зазначити, що воно не засноване на сигналах. Приклад використання:

pic

Приклад використання нового API виводу

За подібною схемою можна використовувати API viewChild та viewChildren.

pic

Використання “viewChild” та “viewChildren”

Чи є варіанти для автоматичного досягнення цієї міграції?

pic

Якщо ви хочете впровадити сигнали в існуючі проекти, Angular надає міграційні схематики, щоб спростити перехід.
Після успішної міграції ви зможете скористатися реактивністю сигналів, зменшуючи складність традиційних технік управління станом.

Ось список офіційних міграційних схем:

А відчуття після успішної міграції нічим не гірше:

pic

Ми вже багато чого дізналися, давайте подивимось на фрагмент коду нижче, як ви вважаєте, чи правильний він, чи є у нього вплив на продуктивність?

pic

https://www.linkedin.com/posts/daniel-glejzner-271281159angular-activity-7249407983103733762-I333?utmsource=share&utmmedium=memberdesktop

Відповідь: це абсолютно правильний підхід при використанні сигналів. Ніякого впливу на продуктивність. 🚀

Давайте подивимося, що нового нас чекає.

Функції в режимі попереднього перегляду для розробників

pic

Я додав посилання на офіційну документацію Angular, але якщо ви любите відео, ось два чудових навчальних ресурси від Deborah Kurata:

Готові побачити демо? Давайте створимо лічильник!

pic

Більше немає демо лічильника

Хочете побачити робочий приклад? 🚀

Перейдіть до Практичного посібника з сигналів — Частина II (час демо)

Сигнали в Angular вводять потужний та інтуїтивно зрозумілий спосіб управління станом і реактивністю. Завдяки використанню обчислених сигналів та API ефектів, розробники можуть писати більш чистий і підтримуваний код без надмірної залежності від зовнішніх бібліотек, таких як RxJS.

Оскільки Angular продовжує розвиватися, сигнали стають основою його моделі реактивного програмування. Почніть експериментувати з сигналами вже сьогодні та відкрийте нові можливості у ваших Angular-додатках!

Якщо вам сподобалося те, що ви дізналися, відзначте це аплодисментами 👏.

Перекладено з: A Pragmatic Guide To Signals — Part I

Leave a Reply

Your email address will not be published. Required fields are marked *