Reactive Utilties

on

Edit this page
function on<T extends Array<() => any> | (() => any), U>(
deps: T,
fn: (input: T, prevInput: T, prevValue?: U) => U,
options: { defer?: boolean } = {}
): (prevValue?: U) => U | undefined

on is designed to be passed into a computation to make its dependencies explicit. If an array of dependencies is passed, input and prevInput are arrays.

createEffect(on(a, (v) => console.log(v, b())))
// is equivalent to:
createEffect(() => {
const v = a()
untrack(() => console.log(v, b()))
})

You can also not run the computation immediately and instead opt in for it to only run on change by setting the defer option to true.

// doesn't run immediately
createEffect(on(a, (v) => console.log(v), { defer: true }))
setA("new") // now it runs

Using on with stores

const [state, setState] = createStore({ a: 1, b: 2 })
// this will not work
createEffect(on(state.a, (v) => console.log(v)))
setState({ a: 3 }) // logs nothing
// instead, use an arrow function
createEffect(
on(
() => state.a,
(v) => console.log(v)
)
)
setState({ a: 4 }) // logs 4

Arguments and Options

ArgumentTypeDescription
depsTThe dependencies to watch.
fn(input: T, prevInput: T, prevValue?: U) => UThe function to run when the dependencies change.
options{ defer?: boolean }Options to configure the effect.
Report an issue with this page