import {createEvent, createStore, createEffect, combine, sample} from 'effector'
const nextPost = createEvent()
const getCommentsFx = createEffect(async postId => {
const url = `posts/${postId}/comments`
const base = 'https://jsonplaceholder.typicode.com'
const req = await fetch(`${base}/${url}`)
return req.json()
})
const $postComments = createStore([])
.on(getCommentsFx.doneData, (_, posts) => posts)
const $currentPost = createStore(1)
.on(getCommentsFx.done, (_, {params: postId}) => postId)
const $status = combine(
$currentPost, $postComments, getCommentsFx.pending,
(postId, comments, isLoading) => isLoading
? 'Загрузка поста...'
: `Пост ${postId} имеет ${comments.length} комментариев`
)
sample({
source: $currentPost,
clock: nextPost,
fn: postId => postId + 1,
target: getCommentsFx,
})
$status.watch(status => {
console.log(status)
})
// => Пост 1 имеет 0 комментариев
nextPost()
// => Загрузка поста...
// => Пост 2 имеет 5 комментариев
Преимущества
Типизация
Поддержка TypeScript в комплекте поставки
Независимость от фреймворков
Работает с любыми UI и серверными фреймворками
Удобство в разработке
Логичный API и отзывчивое сообщество
Производительность
Статическая инициализация улучшает производительность
Малый размер
Эффектор - компактная библиотека и поддерживает tree-shaking
Чистый, предсказуемый javascript
Никаких прокси и классов