- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 react 钩子(Hook)useDbReadTable
,用于从接受tablename
和query
初始数据的数据库读取数据。它返回一个对象,除了数据库中的数据之外,还包含 isLoading
状态。
我想将此 Hook 包装在一个新 Hook 中,该 Hook 接受 { tablename, query }
的数组的初始数据,并返回一个包含来自每个表的数据库,但根据我的新钩子(Hook)中的逻辑,将 isLoading
状态合并为单个 bool 值。
其想法是,新 Hook 的调用者可以从多个表中请求数据,但只需检查一个状态值。
我的想法是让新钩子(Hook)看起来像,
编辑:更新了代码(我粘贴了错误的版本)
export const useDbRead = tableReads => {
let myState = {};
for (let i = 0; i < tableReads.length; ++i) {
const { tablename, query = {} } = tableReads[i];
const [{ isLoading, isDbError, dbError, data }] = useDbReadTable(tablename, query);
myState = { ...myState, [tablename]: { isLoading, isDbError, dbError, data }};
}
const finalState = {
...myState,
isLoading: Object.values(myState).reduce((acc, t) => acc || t.isLoading, false),
};
return [finalState];
};
但是,eslint 在我的 useDbReadTable
调用中给出了这个错误:
React Hook "useDbReadTable" may be executed more than once. Possibly because it is called in a loop. React Hooks must be called in the exact same order in every component render. react-hooks/rules-of-hooks
Only Call Hooks at the Top Level
Don’t call Hooks inside loops, conditions, or nested functions. Instead, always use Hooks at the top level of your React function. By following this rule, you ensure that Hooks are called in the same order each time a component renders. That’s what allows React to correctly preserve the state of Hooks between multiple useState and useEffect calls. (If you’re curious, we’ll explain this in depth below.)
阅读规则和解释后,似乎唯一的问题是确保在所有重新渲染时以相同的顺序调用钩子(Hook)。只要我确保传递给新钩子(Hook)的表列表永远不会改变,我的新钩子(Hook)不应该正常工作吗(正如我的初始测试所示)?或者我错过了什么?
更重要的是,是否有更好的想法如何实现这一点,并且不违反 Hooks 规则?
编辑2:如果它有帮助,这里是useDbReadTable
。请注意,它包含的功能比我在问题中提到的更多,因为我想让问题尽可能简单。我的问题是我的 useDbRead
是否是一个好的解决方案,或者是否有一个好的方法可以在不违反 Hooks 规则的情况下做到这一点?
export const useDbReadTable = (initialTableName, initialQuery = {}, initialData = []) => {
const dbChangeFlag = useSelector(({appState}) => appState.dbChangeFlag);
const [tableName, setTableName] = useState(initialTableName);
const [query, setQuery] = useState(initialQuery);
const [state, dispatch] = useReducer(dataFetchReducer, {
isLoading: false,
isDbError: false,
dbError: {},
data: initialData,
});
useEffect(() => {
let didCancel = false;
const fetchData = async () => {
dispatch({ type: dataFetch.FETCH_INIT });
try {
const result = Array.isArray(query) ?
await db[tableName].batchGet(query) // query is an array of Ids
:
await db[tableName].find(query);
if (!didCancel) {
dispatch({ type: dataFetch.FETCH_SUCCESS, payload: result });
}
} catch (error) {
if (!didCancel) {
dispatch({ type: dataFetch.FETCH_FAILURE, payload: error });
}
}
};
fetchData().then(); // .then() gets rid of eslint warning
return () => {
didCancel = true;
};
}, [query, tableName, dbChangeFlag]);
return [state, setQuery, setTableName];
};
最佳答案
您可以通过使 useDbRead
本身数组感知来避免使用 useDbReadSingle
。像这样的东西:
export const useDbRead = tableReads => {
const [loading, setLoading] = useState(true);
useEffect(() => {
const doIt = async () => {
// you would also need to handle the error case, but you get the idea
const data = await Promise.all(
tableReads.map(tr => {
return mydbfn(tr);
})
);
setLoading(false);
};
doIt();
}, [tableReads]);
return { loading, data };
};
当您需要使用它来读取单个表时,只需使用具有单个元素的数组来调用它即可。
const {loading, data: [d]} = useDbRead([mytableread])
关于javascript - react Hook : what is best practice for wrapping multiple instances of a hook with a single hook?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59460331/
在我的项目中,我使用了某种由外部团队编写的 SDK 库。这些图书馆正在使用 Prism。由于某些原因,我们不得不回滚到他们的 SDK 的以前版本,现在构建失败,试图找到对 Microsoft.Prac
我是基于 MVVM 的单元测试应用程序,它使用 prism 并使用模拟来测试 View 模型。我可以通过传递区域管理器和资源管理器的模拟对象来调用我的 viewmodel 类的构造函数,但是当控制进入
我需要将名为“practice”的列插入到表“cred_insurances”中,该表是一个 FK 引用表“practices” PK “id” 最佳答案 您需要通过在 mysql 提示符下运行以下命
我创建了一个项目来练习将 Git 与 Xcode 和 GitHub 结合使用。经过大量工作,我已经在本地和远程创建了存储库。我刚刚尝试提交并收到此错误: 这是我要 promise 的: 在出现此错误之
我正在考虑使用 DTO 而不是传递我的域对象。我在这里和其他地方都读过几篇文章,我知道有几种方法可以完成这项工作。 如果我总共只有大约 10 个域类,并且考虑到我想在我的 View (WPF 前端)中
我想知道 Django Rest Framework 的最佳实践。我一直通过每个用户使用不同的序列化程序(员工、帐户所有者、其他人)和 HTTP 方法来限制更改帐户上某些属性的访问权限,但我觉得这太不
场景:应用程序具有可以启用某些优化的算法。默认情况下,有些是打开的,有些是关闭的。在 Java 中是否有一种方便的方法来实现某种全局属性系统? 要求: 必须很容易两次使用不同的设置运行程序的多个实例
我的代码如下: public static final Condition.ActionCondition ACTION_CONDITION_ACTIVATE = new Condit
我从事嵌入式工作,我有一些管理硬件的软件模块。这个模块有状态,状态转换很复杂:根据事件,模块可以从状态 A 到状态 B 或者可能到 C .但是,当它退出某个状态时,它应该对硬件执行一些操作,以使其也保
考虑 an^2 + bn + c。我知道对于大的 n,bn 和 c 变得微不足道。 我还了解到,对于较大的 n,2n^2 和 n^2 之间的差异非常微不足道 n^2 和 n*log(n) 之间的区别。
我正在设计一个数据库并且我达到了(据我所知)Third Normal Form (3NF) 我的一些同事告诉我一个 Sixth Normal Form !!我想知道如何知道数据库的规范化水平是否足够。
我有一个.net 3.5网站,该网站使用Microsoft.Practices.EnterpriseLibrary调用数千个不同的存储过程。 我们已经遇到了很多超时,并且在播放和测试表末尾的(nolo
我使用 nuget 包管理器添加了最近的企业库,但在部署时(而不是在构建时)仍然低于错误。 包管理器:Install-Package EnterpriseLibrary.Data 谁能帮我 命名空间“
我一直在阅读关于版本控制主题的所有问题,但我认为我没有找到一个看起来像我自己的场景。 场景是: 我们有一个中型/大型 Web 应用程序,它有(至少应该有)一个部署到所有客户端的核心。当我们向客户演示应
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 8年前关闭
代码 (Java) 片段 ..... ..... if ( response.check() == checkNumber ) { String message = "You ar
我刚刚开始在我的(Delphi)应用程序中使用异常记录器(EurekaLog)。现在,我的应用程序每天都会通过电子邮件向我发送大量错误消息。这是我迄今为止发现的内容 大量重复错误 来自同一台电脑的多封
我想收集有关我的代码的特定例程的指标,以了解可以最好地优化的地方。让我们举一个简单的例子,假设我有一个包含多个“学生”的“类(class)”数据库。假设当前的代码为每个学生调用数据库,而不是一次性批量
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 2 年前。 Improv
我正在尝试加快查询速度。其中很多都非常复杂,目前我主要通过创建多个查询并通过联接链接它们来实现这一点。 这是最佳实践吗?还是我应该在 SELECT 中使用 SELECT 并尝试在一个查询中实现相同的目
我是一名优秀的程序员,十分优秀!