A watcher with immediate is a computed you should have written

A watcher that runs immediately and assigns to another ref is deriving a value, which is what computed is for and does better.

// the shape to be suspicious of
const total = ref(0)
watch(items, () => {
  total.value = items.value.reduce((a, i) => a + i.price, 0)
}, { immediate: true, deep: true })

// what it wanted to be
const total = computed(() =>
  items.value.reduce((a, i) => a + i.price, 0)
)

The computed version tracks its dependencies automatically, so deep is unnecessary and adding a second source needs no change. It is also lazy — nothing recomputes until something reads it — where the watcher runs on every change whether or not anybody cares. A watcher earns its place when the reaction is a side effect rather than a value: a fetch, a route change, a write to storage.