TGViewer
πŸ‡ΊπŸ‡¦ Math.random(): community of engineers πŸ‡ΊπŸ‡¦ Math.random(): community of engineers @mathrandomcommunity Β· 1.26K subscribers
Post #607 798
Change detection & Reactivity

Начнём с Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΡƒΠ·Π½Π°Ρ‘Ρ‚ Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π² нашСй ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ измСнились ΠΈ Π΅Ρ‘ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ.
Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ славный ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Counter, Π²Ρ‹ всС Π΅Π³ΠΎ ΡƒΠΆΠ΅ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ Π²ΠΈΠ΄Π΅Π»ΠΈ: [-] count [+]. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠ°Π» ΠΊΠ½ΠΎΠΏΠΊΡƒ [+] ΠΈ ΠΌΡ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π½Π΅ΠΊΠΈΠΉ count Π½Π° +1. Π­Ρ‚ΠΎ просто. А Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ с Π½ΠΎΠ²Ρ‹ΠΌ count. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΊΠ°ΠΊ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…:


Dirty check
Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ простой ΠΌΠ΅Ρ‚ΠΎΠ΄: ΠΌΡ‹ сохраняСм ΡΠ½ΡΠΏΡˆΠΎΡ‚ состояния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΈ ΠΏΡ€ΠΈ любом взаимодСйствии с UI (ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅) Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ всС хэнлСры, Π° Π·Π°Ρ‚Π΅ΠΌ проходимся ΠΏΠΎ всСм ΠΊΠ»ΡŽΡ‡Π°ΠΌ состояния ΠΈ провСряСм Π½Π΅ измСнился Π»ΠΈ стэйт ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со ΡΠ½ΡΠΏΡˆΠΎΡ‚ΠΎΠΌ. Если измСнился β€” пСрСрисовываСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ. Для нас это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выглядит ΠΊΠ°ΠΊ простой this.count += 1.
Π’Π°ΠΊΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Angular ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (angular Π΅Ρ‰Ρ‘ Π±ΡƒΠ΄Π΅Ρ‚ Π² reactive streams Π½ΠΈΠΆΠ΅)

Reactive atoms / Invalidation API
НСкоторыС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ API для Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠ³ΠΎ измСнСния состояния. Когда ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ этот API (измСняСм стэйт) β€” Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ пСрСрисовку ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. Π’.ΠΊ. Javascript β€” довольно Π³ΠΈΠ±ΠΊΠΈΠΉ язык, Ρ‚Π°ΠΊΠΎΠΉ API ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹ΠΌ Π²ΠΈΠ΄ΠΎΠΌ: count(count() + 1) Π² Knockout, setCount(getCount() + 1) Π² React ΠΈ SolidJS.

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Svelte ΠΈ Vue, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ этот API прячут ΠΎΡ‚ Π΄Π΅Π²Π΅Π»ΠΎΠΏΠ΅Ρ€ΠΎΠ²:
Svelte ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ count += 1 Π² Π²Ρ‹Π·ΠΎΠ² API (ΠΌΡ‹ ΠΎ компиляторах Π΅Ρ‰Ρ‘ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ)
Π° Vue с ΠΈΡ… this.count += 1 Π² вСрсии 2.x использовал Object.defineProperty c get/set ΠΏΠ°Ρ€ΠΎΠΉ, Π° с 3-ΠΉ вСрсии ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ Π½Π° Proxy для Π²Ρ‹Π·ΠΎΠ²Π° своСго API "ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ".

N.B: Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ API Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ считываниС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π°Ρ‚ΠΎΠΌΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ DOM Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π³Π΄Π΅ этот стэйт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

Reactive streams
ΠœΡ‹, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, ΠΈΠ½ΠΎΠ³Π΄Π° Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π½Π΅ дискрСтными срСзами состояний, Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΡ‹ смоТСм ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ часто ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΊΠ»ΠΈΠΊΠ°Π΅Ρ‚ [-] ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ особый ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для Тёстких минусаторов. Для этого Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Они ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ API Π½Π°ΠΌ для добавлСния Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ для "слСТСния" Π·Π° измСнСниями.

clicks$.next(1);
count$ = clicks$.scan((acc, curr) => acc + curr, 0);

Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Аngular (Π² OnPush стратСгии) ΠΈ circlejs (Π½Ρƒ, ΠΈ ΠΌΠΎΠΉ ΡΠΊΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ recksjs, Ρ‚Π°ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π²Π΅Π·Π΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ).
Π Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΈΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊ Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Π°Ρ‚ΠΎΠΌΠ°ΠΌ / invalidation API, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄ Π±Π°Π·Π°Ρ… с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ.

.

Как Π²ΠΈΠ΄Π½ΠΎ, Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅, Π½ΠΎ Ρ†Π΅Π»ΡŒ ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅: ΠΏΠ½ΡƒΡ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ пСрСрисовал ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ.
Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ… ΠΌΡ‹ Π·Π°Π΄Π°Ρ‘ΠΌ этот самый UI, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ.
ΠžΡΡ‚Π°Π²Π»ΡΠΉΡ‚Π΅ свои ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ math.random ΠΊΠΎΠΌΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ β€” ΠΌΡ‹ любим Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ тСхнологиях.
Π”ΠΎ Π·Π°Π²Ρ‚Ρ€Π°!

___

Если Ρƒ вас ΠΌΠ°Π»ΠΎ Π²ΠΊΠ»Π°Π΄ΠΎΠΊ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅:
A Hands-on Introduction to Fine-Grained Reactivity β€” https://dev.to/ryansolid/a-hands-on-introduction-to-fine-grained-reactivity-3ndf
Reactivity in Depth β€” https://v3.vuejs.org/guide/reactivity.htm
Angular Change Detection - How Does It Really Work? β€” https://blog.angular-university.io/how-does-angular-2-change-detection-really-work/

#thematicweek #frameworksweek
More from @mathrandomcommunity
  1. Oct 9, 2026Π―ΠΊ Π±Π΅Π·ΠΊΠΎΡˆΡ‚ΠΎΠ²Π½ΠΎ ΠΎΡ‚Ρ€ΠΈΠΌΠ°Ρ‚ΠΈ Ρ€Ρ–ΠΊ Claude Team Ρ– $1 000 Π½Π° API. ΠŸΠΎΡ‚Ρ€Ρ–Π±Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ–Π· власним домСно…
  2. Oct 7, 2026πŸ“Œ ΠšΠ°Ρ€Ρ‚Π° ΠΊΠ°Π½Π°Π»Ρƒ: Π· Ρ‡ΠΎΠ³ΠΎ ΠΏΠΎΡ‡Π°Ρ‚ΠΈ «Код став Ρ‡ΠΈΡΡ‚Ρ–ΡˆΠΈΠΌΒ» β€” Ρ†Π΅ Π΄ΡƒΠΌΠΊΠ°. Π¦ΠΈΡ„Ρ€Π° β€” Π΄ΠΎΠΊΠ°Π·. Π¦Π΅ΠΉ ΠΊΠ°Π½Π°Π» пр…
  3. Oct 7, 2026Π’ΠΈΠΉΡˆΠ»Π° стаття Π½Π° DOU: як виміряти Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ AI-Π°Π³Π΅Π½Ρ‚Π° Π½Π° ΠΊΠΎΠ΄ΠΎΠ²Ρ–ΠΉ Π±Π°Π·Ρ– Ρƒ 200 000 рядків.…
  4. Oct 7, 2026Π₯ΠΎΡ‡Π΅Ρˆ Π·Ρ€ΠΎΠ·ΡƒΠΌΡ–Ρ‚ΠΈ, Ρ‰ΠΎ Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ Ρ‚Π²Ρ–ΠΉ Π°Π³Π΅Π½Ρ‚ ΠΌΡ–ΠΆ ΠΏΡ€ΠΎΠΌΠΏΡ‚ΠΎΠΌ Ρ– Β«Π³ΠΎΡ‚ΠΎΠ²ΠΎΒ»? Π—Π±Π΅Ρ€ΠΈ ΠΉΠΎΠ³ΠΎ сам. Π’ ololo Ρ” г…
  5. Oct 6, 2026GitSpawn Ρ– Plugin4Shell β€” Π΄Π²Ρ– вСрСснСві вразливості Π² ΠΊΠΎΠ΄ΠΈΠ½Π³-Π°Π³Π΅Π½Ρ‚Π°Ρ…. ΠžΠ±ΠΈΠ΄Π²Ρ– Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡŒ чу…
  6. Sep 30, 2026Подивись, як AI-судді Ρ€ΠΎΠ·Π±ΠΈΡ€Π°ΡŽΡ‚ΡŒ ΠΊΠΎΠ΄ Π°Π³Π΅Π½Ρ‚Π°πŸ‘† Π¦Π΅ тСстова Π³Ρ€Π° Π½Π°ΡˆΠΎΡ— ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π² ololo. Навіщо…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook β†’Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 β†’