Javascript React钩子:用一个钩子包装一个钩子的多个实例的最佳实践是什么?
我有一个react钩子,用于从接受tablename和query初始数据的数据库中读取数据。它返回一个对象,该对象除了来自数据库的数据外,还包括一个isLoading状态 我想将这个钩子包装在一个新的钩子中,它接受{tablename,query}数组的初始数据,并返回一个对象,其中包含每个表的数据库数据,但isLoading状态根据我的新钩子中的逻辑合并为一个布尔值 其思想是,新钩子的调用方可以从多个表中请求数据,但只需检查一个状态值 我的想法是让新的钩子看起来像 编辑:更新了我粘贴了错误版本的代码Javascript React钩子:用一个钩子包装一个钩子的多个实例的最佳实践是什么?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我有一个react钩子,用于从接受tablename和query初始数据的数据库中读取数据。它返回一个对象,该对象除了来自数据库的数据外,还包括一个isLoading状态 我想将这个钩子包装在一个新的钩子中,它接受{tablename,query}数组的初始数据,并返回一个对象,其中包含每个表的数据库数据,但isLoading状态根据我的新钩子中的逻辑合并为一个布尔值 其思想是,新钩子的调用方可以从多个表中请求数据,但只需检查一个状态值 我的想法是让新的钩子看起来像 编辑:更新了我粘贴了错误版本
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];
};
通过使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])
请显示UsedReadSingle抱歉,不知何故,我粘贴了错误版本的代码。它应该是useDbReadTable。请显示useDbReadTable是什么。我添加了useDbReadTable。提前感谢您给我的任何指导。这正是我想看看UsedReadTable做什么的原因。我正试图在UsedReadTable中实现这个想法。但我想知道:您将[tableReads]作为useffect的第二个参数传递。既然tableReads是一个对象数组,那么在每次重新呈现使用UsedRead的组件时不会导致效果重新运行吗?是的。在这种情况下,您可能需要使用useDeepCompareEffect之类的工具
const {loading, data: [d]} = useDbRead([mytableread])