Event
Event is an intention to change state. Let's imagine life situation, you come to a shop and on etiquette you should say "hello" - intention, then you say "hello" - event.
Event Methods
watch(watcher)
It is a function which allows you to watch or to create side-effects.
Arguments
watcher
(Function): 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)
Сreates 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.
Arguments
fn
(Function): A function that receivespayload
, must 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(name => console.log(`User's role is [${name}] now`))
userUpdated({name: 'john', role: 'admin'})
// => User's name is [john] now
// => User's role is [ADMIN] now
filter({fn})
Сreates a new event, which will be called after the original event is called, if fn
returns true.
Arguments
fn
(Function): A function that receivespayload
, must be pure.
Returns
(Event
): New event.
Example
import {createEvent, createStore} from 'effector'
const numbers = createEvent('event with {x: number}')
const positiveNumbers = numbers.filter({
fn: ({x}) => x > 0,
})
const lastPositive = createStore(0).on(positiveNumbers, (n, {x}) => x)
filterMap(fn)
Сreates a new event, which will be called after the original event is called, if fn
returns not undefined.
Arguments
fn
(Function): A function that receivespayload
, must be pure.
Returns
(Event
): New event.
Example
import React from 'react'
import {createEvent, createStore} from 'effector'
const openModal = createEvent('open that modal')
const openModalUnboxed = openModal.filterMap(ref => {
if (ref.current) return ref.current
})
openModalUnboxed.watch(modal => modal.showModal())
const closeModal = createEvent('close that modal')
closeModal
.filter(ref => {
if (ref.current) return ref.current
})
.watch(modal => modal.close())
const modalRef = React.createRef()
const App = () => (
<>
<dialog ref={modalRef}>
<form method="dialog">
<fieldset>
<legend>Modal</legend>
Tap to close
<button type="submit" onSubmit={() => closeModal(modalRef)}>
❌
</button>
</fieldset>
</form>
</dialog>
<button onClick={() => openModal(modalRef)}>Open modal</button>
</>
)
prepend(fn)
Creates an event, upon trigger it does send transformed data into source event. Works kind of like reverse .map
. In the case of .prepend
data transforms before the original event occurs and in the case of .map
, data transforms after original event occurred.
Arguments
fn
(Function): A function that receivespayload
, must be pure.
Returns
(Event
): New event.
Example
import {createEvent} from 'effector'
const nameChanged = createEvent()
nameChanged.watch(name => console.log(`Current name is: ${name}`))
const inputChanged = nameChanged.prepend(e => e.target.value) // event, which will be bound to DOM element
const input = document.createElement('input')
input.onchange = inputChanged
document.body.appendChild(input)
// input something in input, and press Enter
// => Current name is: something