【发布时间】:2022-10-07 06:36:13
【问题描述】:
我想知道我们可以在 React 中使用带有 Redux-toolkit createAsyncThunk 或 RTK Query 的 firebase 查询吗?
-
morioh.com/p/d1995e04dd56 你可能会觉得这很有用,这是一个使用 Firestore 数据库和 RTK Query 的教程
标签: reactjs firebase redux-toolkit
我想知道我们可以在 React 中使用带有 Redux-toolkit createAsyncThunk 或 RTK Query 的 firebase 查询吗?
标签: reactjs firebase redux-toolkit
是的,不是用query 属性编写RTK 查询端点,而是用queryFn 编写它们,并使用fakeBaseQuery 而不是fetchBaseQuery。
import { createApi, fakeBaseQuery } from '@reduxjs/toolkit/query'
const api = createApi({
baseQuery: fakeBaseQuery(),
endpoints: (build) => ({
getSomeDataFromFirebase: build.query({
queryFn(arg) {
try {
const result = ... // call firebase here
return { data: result.something }
} catch (e) {
return { error: e }
}
},
}),
}),
})
【讨论】:
通常在 redux 查询中我们使用 fetchBaseQuery 但由于我们只是查询数据库,因为使用 firebase 我们没有任何 put、delete、update api。
import {collection,doc,getDoc,getDocs} from "firebase/firestore";
export const postsApi = createApi({
reducerPath: "posts",
baseQuery: fakeBaseQuery(),
tagTypes: ["Post"],
endpoints: (builder) => ({
fetchPosts: builder.query({
// since we are using fakeBaseQuery we use queryFn
async queryFn() {
try {
// blogs is the collection name
const blogRef = collection(db, "posts");
const querySnaphot = await getDocs(blogRef);
let posts = [];
querySnaphot?.forEach((doc) => {
posts.push({ id: doc.id, ...doc.data() });
});
return { data: posts };
} catch (error) {
return { error };
}
},
providesTags: ["Post"],
}),
//***************SINGLE ITEM FETCHING*************** */
fetchSinglePost: builder.query({
async queryFn(id) {
try {
const docRef = doc(db, "posts", id);
const snapshot = await getDoc(docRef);
return { data: snapshot.data() };
} catch (error) {
return { error };
}
},
providesTags: ["Post"],
}),
}),
});
export const { useFetchPostsQuery, useFetchSinglePostQuery } = postsApi;
【讨论】: