Effector-react
React bindings for effector
Installation
npm install --save effector effector-react
Or using yarn
yarn add effector effector-react
Usage
import {createStore, combine, createEvent} from 'effector'
import {useStore} from 'effector-react'
const inputText = createEvent()
const text = createStore('').on(inputText, (state, payload) => payload)
const size = createStore(0).on(inputText, (state, payload) => payload.length)
const form = combine({
text,
size,
})
const Form = () => {
const {text, size} = useStore(form)
return (
<form>
<input
type="text"
onChange={e => inputText(e.currentTarget.value)}
value={text}
/>
<p>Length: {size}</p>
</form>
)
}
Try it
useStore in docs
createStore in docs
combine in docs
createEvent in docs
effector 21.0.0
- Add object form of
split
for pattern-matching without additional forwards
split
in documentation
import {split, createEffect, createEvent} from 'effector'
const messageReceived = createEvent()
const showTextPopup = createEvent()
const playAudio = createEvent()
const reportUnknownMessageTypeFx = createEffect({
handler({type}) {
console.log('unknown message:', type)
},
})
split({
source: messageReceived,
match: {
text: msg => msg.type === 'text',
audio: msg => msg.type === 'audio',
},
cases: {
text: showTextPopup,
audio: playAudio,
__: reportUnknownMessageTypeFx,
},
})
showTextPopup.watch(({value}) => {
console.log('new message:', value)
})
messageReceived({
type: 'text',
value: 'Hello',
})
// => new message: Hello
messageReceived({
type: 'image',
imageUrl: '...',
})
// => unknown message: image
Try it
You can match directly to store api as well:
import {split, createStore, createEvent, createApi} from 'effector'
const messageReceived = createEvent()
const $textContent = createStore([])
split({
source: messageReceived,
match: {
text: msg => msg.type === 'text',
audio: msg => msg.type === 'audio',
},
cases: createApi($textContent, {
text: (list, {value}) => [...list, value],
audio: (list, {duration}) => [...list, `audio ${duration} ms`],
__: list => [...list, 'unknown message'],
}),
})
$textContent.watch(messages => {
console.log(messages)
})
messageReceived({
type: 'text',
value: 'Hello',
})
// => ['Hello']
messageReceived({
type: 'image',
imageUrl: '...',
})
// => ['Hello', 'unknown message']
messageReceived({
type: 'audio',
duration: 500,
})
// => ['Hello', 'unknown message', 'audio 500 ms']
Try it
- Merge
effector/fork
into effector
. Now all methods required for SSR are exported from the library itself, making effector/fork
an alias - Make
Scope
type alias for Fork
- Add support for es modules:
import {createStore} from 'effector/effector.mjs'
- Effect without a handler now throws an error during a call instead of calling
console.error
with undefined return, which was violating the type of effect - Remove
restore
aliases, event.filter(fn)
alias for event.filterMap(fn)
, greedy
in sample
as separate last argument and unused blocks
and Kind