Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React钩子:用一个钩子包装一个钩子的多个实例的最佳实践是什么?_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript React钩子:用一个钩子包装一个钩子的多个实例的最佳实践是什么?

Javascript React钩子:用一个钩子包装一个钩子的多个实例的最佳实践是什么?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我有一个react钩子,用于从接受tablename和query初始数据的数据库中读取数据。它返回一个对象,该对象除了来自数据库的数据外,还包括一个isLoading状态 我想将这个钩子包装在一个新的钩子中,它接受{tablename,query}数组的初始数据,并返回一个对象,其中包含每个表的数据库数据,但isLoading状态根据我的新钩子中的逻辑合并为一个布尔值 其思想是,新钩子的调用方可以从多个表中请求数据,但只需检查一个状态值 我的想法是让新的钩子看起来像 编辑:更新了我粘贴了错误版本

我有一个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])