チュートリアル: MoonBit

Untrack

依存関係を作成せずに Signal を読み取ります。

問題

Signal の値を読み取りたいが、その変更を購読したくない場合があります:

let count = signal(0)
let multiplier = signal(2)

effect(fn() {
  // この Effect は count か multiplier のどちらかが変更されると実行
  println((count.get() * multiplier.get()).to_string())
})

Untrack の使用

using @luna { signal, effect, untrack }

let count = signal(0)
let multiplier = signal(2)

effect(fn() {
  // `count` のみ追跡、`multiplier` は追跡しない
  let mult = untrack(fn() { multiplier.get() })
  println((count.get() * mult).to_string())
})

count.set(5)        // Effect 実行: 10
multiplier.set(3)   // Effect 実行されない
count.set(6)        // Effect 実行: 18

一般的なユースケース

値の比較

let current = signal(0)
let previous = signal(0)

effect(fn() {
  let curr = current.get()

  // 追跡せずに前の値と比較
  let prev = untrack(fn() { previous.get() })

  if curr != prev {
    println("Changed from " + prev.to_string() + " to " + curr.to_string())
    previous.set(curr)
  }
})

購読なしのログ

let user = signal(None : Option[User])

effect(fn() {
  match user.get() {
    Some(u) => {
      // 購読せずに他の状態をログ
      untrack(fn() {
        println("User logged in: " + u.name)
        println("Current page: " + page.get())
      })
    }
    None => ()
  }
})

API サマリー

関数説明
untrack(fn)依存関係を追跡せずにコードを実行

試してみよう

count が変更されたときにログを記録し、timestamp も含めるが、count の変更時のみ再実行する Effect を作成

次へ

ネストした Effects → について学ぶ