🧱 Π‘ΡƒΡ‚ΡŒ

reaction Π² MobX – это инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт дСйствиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ отслСТиваСмыС значСния.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°:

reaction(
  () => отслСТиваСмыС_значСния,
  (Π½ΠΎΠ²Ρ‹Π΅_значСния) => {
    // дСйствиС
  }
);

Главная идСя: ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° состояниСм β†’ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅

πŸ“¦ ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

1. НС всСгда Π½ΡƒΠΆΠ΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ автоматичСский ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚Π΅Π»ΡŒ

autorun Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° всё, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
Иногда Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ зависимости.

2. Π›ΠΎΠ³ΠΈΠΊΠ° состояния ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

НапримСр:

useEffect(() => {
  if (count > cols * rows) {
    setRows(...);
  }
}, [count, cols, rows]);

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° UI, Π½ΠΎ ΠΈ Π·Π° бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ.

βœ… РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ reaction Π²Π½ΡƒΡ‚Ρ€ΠΈ store.
Π›ΠΎΠ³ΠΈΠΊΠ° остаётся рядом с состояниСм ΠΈ Π½Π΅ зависит ΠΎΡ‚ React-Ρ€Π΅Π½Π΄Π΅Ρ€Π°.

πŸ’» Код

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

reaction(
  () => [this.count, this.grid[0], this.grid[1]],
 
  ([count, cols, rows]) => {
    if (count > cols * rows) {
      this.setGrid([
        cols,
        Math.ceil(count / cols)
      ]);
    }
  }
);

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ reaction

reaction состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй:

1. Ѐункция отслСТивания

() => [
  this.count,
  this.grid[0],
  this.grid[1]
]

MobX смотрит, ΠΊΠ°ΠΊΠΈΠ΅ observable значСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ.

Π—Π΄Π΅ΡΡŒ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ:

count β†’ количСство элСмСнтов
grid[0] β†’ количСство ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ
grid[1] β†’ количСство строк

2. Ѐункция Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ

([count, cols, rows]) => {
  if (count > cols * rows) {
    this.setGrid(...);
  }
}

Она запускаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС измСнСния отслСТиваСмых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Аналогия с useEffect

React:

useEffect(() => {
  // дСйствиС
}, [count, cols, rows]);

MobX:

reaction(
  () => [count, cols, rows],
  () => {
    // дСйствиС
  }
);

Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅:

useEffect β†’ ΠΆΠΈΠ²Ρ‘Ρ‚ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅
reaction β†’ ΠΆΠΈΠ²Ρ‘Ρ‚ Π² store

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚:

  • Π½ΡƒΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° нСсколькими значСниями состояния
  • Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ дСйствиС ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ MobX state
  • Π»ΠΎΠ³ΠΈΠΊΠ° относится ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, Π° Π½Π΅ ΠΊ UI

НС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚:

  • подписки Π½Π° внСшниС события

НапримСр:

window.addEventListener(...)

Для этого всё Π΅Ρ‰Ρ‘ Π½ΡƒΠΆΠ΅Π½:

useEffect()

🎯 Π’Ρ‹Π²ΠΎΠ΄

  • reaction слСдит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ значСниями
  • запускаСт дСйствиС ΠΏΡ€ΠΈ ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ
  • ΠΏΠΎΡ…ΠΎΠΆ Π½Π° useEffect с зависимостями
  • отличаСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΆΠΈΠ²Ρ‘Ρ‚ Π² store, Π° Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅
  • ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ рядом с состояниСм

πŸ”— Бвязано