チュートリアル: MoonBit

バッチ更新

複数の Signal 更新をバッチ処理して、Effect を一度だけトリガーします。

問題

バッチなしでは、各 Signal 更新が Effect を即座にトリガー:

let first_name = signal("John")
let last_name = signal("Doe")

effect(fn() {
  println("Name: " + first_name.get() + " " + last_name.get())
})

// 2つの別々の更新 = 2回の Effect 実行
first_name.set("Jane")  // Effect 実行
last_name.set("Smith")  // Effect 実行

Batch の使用

using @luna { signal, effect, batch }

let first_name = signal("John")
let last_name = signal("Doe")

effect(fn() {
  println("Name: " + first_name.get() + " " + last_name.get())
})

// バッチ = 1回の Effect 実行
batch(fn() {
  first_name.set("Jane")
  last_name.set("Smith")
})
// Effect は一度だけ実行: "Jane Smith"

Batch を使うタイミング

関連する複数の更新

let user = signal(None : Option[User])
let loading = signal(true)
let error = signal(None : Option[String])

fn on_success(data : User) {
  batch(fn() {
    user.set(Some(data))
    loading.set(false)
    error.set(None)
  })
}

状態マシン

let status = signal("idle")
let data = signal(None : Option[Data])
let progress = signal(0)

fn start_download() {
  batch(fn() {
    status.set("downloading")
    data.set(None)
    progress.set(0)
  })
}

API サマリー

関数説明
batch(fn)複数の更新をバッチ処理

試してみよう

RGB カラーピッカーを作成し、すべてのスライダーが変更されたときにプレビューを一度だけ更新

次へ

Untrack → について学ぶ