Event
Event is an intention to change the state. Let's imagine life situation, you enter a shop and, according to etiquette, you have to say "hello" - intention, then you say "hello" - event.
Event calls always return its payload:
import {createEvent} from 'effector'
const event = createEvent()
console.log(event(1))
// => 1
console.log(event())
// => undefined
Event Methods
watch(watcher)
It is a function which allows you to watch the event or to create side effects.
Formulae
const unwatch = event.watch(fn)
- Call
fn
on eachevent
trigger, pass payload ofevent
as argument tofn
- When
unwatch
is called, stop callingfn
on eachevent
trigger
Arguments
watcher
(Watcher): A function that receivespayload
.
Returns
Subscription: Unsubscribe function.
Example
import {createEvent} from 'effector'
const sayHi = createEvent()
const unwatch = sayHi.watch(name => console.log(`${name}, hi there!`))
sayHi('Peter') // => Peter, hi there!
unwatch()
sayHi('Drew') // => nothing happened
map(fn)
Creates a new event, which will be called after the original event is called, applying the result of a fn
as a payload. It is special function which allows you to decompose dataflow, extract or transform data.
Formulae
const second = first.map(fn)
- When
first
is triggered, pass payload fromfirst
tofn
- Trigger
second
with the result of thefn()
call as payload
Arguments
fn
(Function): A function that receivespayload
, should be pure.
Returns
Event: New event.
Example
import {createEvent} from 'effector'
const userUpdated = createEvent()
const userNameUpdated = userUpdated.map(({name}) => name) // you may decompose dataflow with .map() method
const userRoleUpdated = userUpdated.map(({role}) => role.toUpperCase()) // either way you can transform data
userNameUpdated.watch(name => console.log(`User's name is [${name}] now`))
userRoleUpdated.watch(role => console.log(`User's role is [${role}] now`))
userUpdated({name: 'john', role: 'admin'})
// => User's name is [john] now
// => User's role is [ADMIN] now
prepend(fn)
Creates an event, upon trigger it sends transformed data into the source event. Works kind of like reverse .map
. In case of .prepend
data transforms before the original event occurs and in the case of .map
, data transforms after original event occurred.
If original event belongs to some domain then new event will belong to it as well
Formulae
const second = first.prepend(fn)
- When
second
event is triggered - Call
fn
with payload fromsecond
- Trigger
first
with result offn()
Arguments
fn
(Function): A function that receivespayload
, should be pure.
Returns
Event: New event.
Example
import {createEvent} from 'effector'
const userPropertyChanged = createEvent()
userPropertyChanged.watch(({field, value}) => {
console.log(`User property "${field}" changed to ${value}`)
})
const changeName = userPropertyChanged.prepend(name => ({
field: 'name',
value: name,
}))
const changeRole = userPropertyChanged.prepend(role => ({
field: 'role',
value: role.toUpperCase(),
}))
changeName('john')
// => User property "name" changed to john
changeRole('admin')
// => User property "role" changed to ADMIN
changeName('alice')
// => User property "name" changed to alice
filterMap(fn)
effector 20.0.0
Creates a new event, which will be called after the original event is called if fn
returns a value other than undefined.
Consider a scenario where you walk into a grocery store with a specific task: you need to purchase 10 apples, but only if they're red. If they're not red, you're out of luck.
Let's consider by steps:
- Take one apple;
- Have a look, is it red(put in a pack) or not(take another).
And you repeat this until you complete the task. Now think about it in the effector terms, and we consider the positive case:
- Take an apple - event;
- Have a look, red or no - filter;
- You keep it - map;
- Put in pack - event.
- Pack - store
You may see that we united filter()
and map()
methods, the reason for creating was an impossibility to event filtering.
The method is useful with JavaScript APIs those returns undefined
.
Formulae
const second = first.filterMap(fn)
- When
first
is triggered, callfn
with payload fromfirst
- If
fn()
returnedundefined
do not triggersecond
- If
fn()
returned some data, triggersecond
with data fromfn()
- If
Arguments
fn
(Function): A function that receivespayload
, should be pure.
Returns
Event: New event.
Example
const listReceived = createEvent<string[]>()
const effectorFound = listReceived.filterMap(list => list.find(name => name === 'effector'))
effectorFound.watch(name => console.info("found", name))
listReceived(["redux", "effector", "mobx"]) // found effector
listReceived(["redux", "mobx"])
filter({fn})
Creates a new event, which will be called after the original event is called if fn
returns true
.
Let's assume a standard situation when you want to buy sneakers in the shop, but there is no size. You subscribe to a particular size of the sneakers model, and in addition, you want to receive a notification if they have it, and ignore any other notification. Therefore, filtering can be helpful for that. Event filtering works in the same way. If filter returns true
, the event will be called.
Formulae
const second = first.filter({fn})
- When
first
is triggered, pass payload fromfirst
tofn
- If
fn()
returnstrue
,second
will be triggered with payload fromfirst
Arguments
fn
(Function): A function that receivespayload
, should be pure.
Returns
Event: New event.
Object form is used because event.filter(fn)
was an alias for event.filterMap
guard
method is the preferred filtering method
Example
import {createEvent, createStore} from 'effector'
const numbers = createEvent()
const positiveNumbers = numbers.filter({
fn: ({x}) => x > 0,
})
const $lastPositive = createStore(0).on(positiveNumbers, (n, {x}) => x)
$lastPositive.watch(x => {
console.log('last positive:', x)
})
// => last positive: 0
numbers({x: 0})
// no reaction
numbers({x: -10})
// no reaction
numbers({x: 10})
// => last positive: 10