React.js - 有条件地调用 useDocument 挂钩
React.js - call useDocument hook conditionally
我在 React 中有以下代码:
export const useData= (previewMode: boolean) => {
if (previewMode) {
let [value_, loading, error]: any = useDocument(
doc(getFirestore(app), "settings", "content"),
{
snapshotListenOptions: { includeMetadataChanges: true },
},
);
const value: any =
value_?.data() === undefined ? { data: contentFile } : value_.data();
return { data: value, loading: loading };
}
return {data: contentFile, loading: false};
};
contentFile 是一个静态 JSON 文件,
问题是我不断收到以下错误:
src\lib\use-data.tsx
Line 11:41: React Hook "useDocument" is called conditionally. React Hooks must be called in the exact same order in every component render react-hooks/rules-of-hooks
现在我知道了 react-hooks 的规则,但问题是我需要一个条件,没有它,useDocument 钩子将始终被调用,我们将查询 firestore,但我不想要那个。
我只想在预览模式打开时加载文档,可以吗?
我是这样使用这个钩子的:
const { 值,数据 } = useData(previewMode);
提前致谢
您不能将挂钩放入条件中。它们必须在组件中声明为顶级,因为 React 会根据它们的顺序对它们进行索引,然后您在条件中使用声明的结果。
你的情况:
export const useData = (previewMode: boolean) => {
const document = useDocument(
doc(getFirestore(app), "settings", "content"),
{
snapshotListenOptions: { includeMetadataChanges: true },
}
);
if (previewMode) {
let [value_, loading, error]: any = document;
}
/* rest of component */
}
document
现在无论条件如何声明,React 可以跟踪它。
如果除非需要,否则不希望调用 firebase 文档,请考虑不渲染当前组件,除非 previewMode
为真。例如:
{ previewMode && <useData /> }
这意味着在您的组件中 previewMode
始终为真,因此可以简化:
export const useData = (previewMode: boolean) => {
let [value, loading, error]: any = useDocument(
doc(getFirestore(app), "settings", "content"),
{
snapshotListenOptions: { includeMetadataChanges: true },
},
);
return { data: value.data(), loading };
};
我在 React 中有以下代码:
export const useData= (previewMode: boolean) => {
if (previewMode) {
let [value_, loading, error]: any = useDocument(
doc(getFirestore(app), "settings", "content"),
{
snapshotListenOptions: { includeMetadataChanges: true },
},
);
const value: any =
value_?.data() === undefined ? { data: contentFile } : value_.data();
return { data: value, loading: loading };
}
return {data: contentFile, loading: false};
};
contentFile 是一个静态 JSON 文件,
问题是我不断收到以下错误:
src\lib\use-data.tsx
Line 11:41: React Hook "useDocument" is called conditionally. React Hooks must be called in the exact same order in every component render react-hooks/rules-of-hooks
现在我知道了 react-hooks 的规则,但问题是我需要一个条件,没有它,useDocument 钩子将始终被调用,我们将查询 firestore,但我不想要那个。
我只想在预览模式打开时加载文档,可以吗?
我是这样使用这个钩子的: const { 值,数据 } = useData(previewMode);
提前致谢
您不能将挂钩放入条件中。它们必须在组件中声明为顶级,因为 React 会根据它们的顺序对它们进行索引,然后您在条件中使用声明的结果。
你的情况:
export const useData = (previewMode: boolean) => {
const document = useDocument(
doc(getFirestore(app), "settings", "content"),
{
snapshotListenOptions: { includeMetadataChanges: true },
}
);
if (previewMode) {
let [value_, loading, error]: any = document;
}
/* rest of component */
}
document
现在无论条件如何声明,React 可以跟踪它。
如果除非需要,否则不希望调用 firebase 文档,请考虑不渲染当前组件,除非 previewMode
为真。例如:
{ previewMode && <useData /> }
这意味着在您的组件中 previewMode
始终为真,因此可以简化:
export const useData = (previewMode: boolean) => {
let [value, loading, error]: any = useDocument(
doc(getFirestore(app), "settings", "content"),
{
snapshotListenOptions: { includeMetadataChanges: true },
},
);
return { data: value.data(), loading };
};