# #javascript #reactjs #firebase #google-cloud-firestore #recoiljs
Вопрос:
TypeError: Cannot assign to read only property 'dc' of object '#lt;tgt;'
Чтобы реализовать разбиение на страницы, я использовал startAfter(lastVisible)
метод в firebase
и. recoil.js
Поэтому я сохранил lastVisible
значение, используя useRecoilState()
in recoil
.
Но в процессе хранения lastVisible
значения useRecoilState
возникает вышеуказанная проблема.
Это мои приблизительные коды о пользовательском крючке.
const [posts, setPosts] = useRecoilState(postsState); const [lastVisiblePost, setLastVisiblePost] = useRecoilState(lastVisiblePostState); ... const fetchPosts = async () =gt; { if (!posts.length) { const response: any = await getInitialPosts({ orderBy, category }); const __posts = response?.data; const __lastVisiblePost = response?.lastVisiblePost; setPosts(__posts); setLastVisiblePost(__lastVisiblePost); return; } setPosts(posts); setLastVisiblePost(lastVisiblePost); }; const fetchMorePosts = async () =gt; { if (lastVisiblePost) { const response: any = await getMorePosts({ orderBy, category, lastVisiblePost }); const __posts = response?.data; const __lastVisiblePost = response?.lastVisiblePost; setPosts((prevPosts) =gt; [...prevPosts, ...__posts]); setLastVisiblePost(__lastVisiblePost); return; } }; ...
Ниже приведены функции вызова API
export const getInitialPosts = async ({ orderBy, category }: IgetPostParams) =gt; { try { const res = await dbService .collection('posts') .orderBy(orderBy, 'desc') .where('category', '==', category) .limit(CARD_LIMIT) .get() const data = res.docs.map((doc) =gt; ({ id: doc.id, ...doc.data(), })); const lastVisiblePost = res.docs[res.docs.length - 1]; return { data, lastVisiblePost }; } catch (error) { console.log(error); return; } }; export const getMorePosts = async ({ lastVisiblePost, category, orderBy }: IgetPostParams) =gt; { try { const res = await dbService .collection('posts') .where('category', '==', category) .orderBy(orderBy, 'desc') .startAfter(lastVisiblePost) .limit(CARD_LIMIT) .get(); const data = res.docs.map((doc) =gt; ({ id: doc.id, ...doc.data(), })); const __lastVisiblePost = res.docs[res.docs.length - 1]; return { data, lastVisiblePost: __lastVisiblePost }; } catch (error) { console.log(error); return; } };
This is about recoil
atom
codes.
export const lastVisiblePostState = atomlt;stringgt;({ key: 'posts/lastVisible', default: '', });