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
? 'Post yuklanishi...'
: `Post ${postId} ${comments.length} ta komentariyaga ega`
)
sample({
source: $currentPost,
clock: nextPost,
fn: postId => postId + 1,
target: getCommentsFx,
})
$status.watch(status => {
console.log(status)
})
// => Post 1 0ta komentariyaga ega
nextPost()
// => Post yuklanishi...
// => Post 2 5ta komentariyaga ega
Ustunliklari
Tipizatsiya
TypeScript ni to`la ta`minotini qo`llaydi
Freymvorklardan mustaqil
Har qanday UI va server freymvorklar bilan ishlay oladi
Dasturchilar uchun qulay
Mantiqiy API va do`stona hamjamiyat
Maksimal ishlash
Statik ishga tushishi ish faoliyatini tezlashtiradi
Kichik hajim
Effector TREE SHAKING ni qo`llaydigan ixcham biblioteka
Oddiy JavaScript
Hechqanday proksi va klasslarsiz