import {configure} from 'mobx'
configure({
reactionScheduler: (f) => {
setTimeout(f)
},
})
export const Parent = observer(() => {
...
const [page, setPage] = useState(parseInt(searchParams.get('page')) || 1)
const fetchData = async () => {
try {
const {id} = await categoriesStore.getCategoryId({
slug: categorySlug,
})
const feed = await productsFeedStore.getProductsFeed({
filters: {
category: {exact: id},
},
perPage: perPage,
page: page,
})
return feed
} catch (error) {
console.error('Fetching data failure', error)
}
}
useEffect(() => {
const getFeed = async () => {
const {results, count} = await fetchData()
setProductsCount(count)
if (isFirstRender) {
const [minPrice, maxPrice] = calculatePriceRange(results)
productsFeedStore.setFilters(minPrice, maxPrice)
setMinPrice(minPrice)
setMaxPrice(maxPrice)
}
}
getFeed()
}, [page, categorySlug])
return (
<>
...
<Children
products={productsFeedStore.data}
applyFilters={setFilters}
minPrice={minPrice}
maxPrice={maxPrice}
feedFilters={productsFeedStore.filters}
className={styles.productsFeed}
/>
<Pagination
totalRecords={productsCount}
elementsPerPage={perPage}
currentPage={page}
changePage={setPage}
className={styles.pagination}
/>
...
</>
)
})
import {makeAutoObservable} from 'mobx'
import productsApi from 'src/api/products'
const productsFeed = makeAutoObservable({
data: null,
filteredData: null,
filters: null,
isLoading: false,
error: null,
getProductsFeed({filters, perPage, page}) {
this.data = null
this.error = null
this.isLoading = true
return new Promise((resolve) => {
productsApi
.getProductsFeed(filters, perPage, page)
.then((data) => {
this.isLoading = false
this.data = data.results
resolve(data)
})
.catch((error) => {
this.isLoading = false
this.error = error
})
})
},
})
export default productsFeed
setTimeout(()=>{setPage(2)}, 3000)
При таком подходе данные попадают в дочерний. А если вручную менять page - нет.