如何在反应中将钩子函数调用到地图中

How to call a hook function into a map in react

我正在为我的 React REST 客户端使用 ketting。 该库提供了访问一些数据的钩子,在我的例子中,就是这个钩子:

import { useResource } from 'react-ketting';
...
const { loading, error, data } = useResource('https://api.example/article/5');

我有多个资源,我想在它们上循环:

items.map(item => {
const { loading, error, data, resourceState } = useResource(item);

 myItems.push({
  title: data.name,
  onClick: () => go(resourceState.links.get('self').href),
 });
});

但是 React 不接受像这样循环 useResource 钩子。

所以我找到了一个我并不引以为豪的肮脏解决方案...

import React from 'react';
import { useCollection, useResource } from 'react-ketting';

let myItems = [];

const Collection = ({ resource, go }) => {
  const { items } = useCollection(resource);

  myItems = [];

  return (
    <div>
      {items.map(item => (
        <CollectionItem go={go} resource={item} />
      ))}
      <ElementsUser elements={myItems} />
    </div>
  );
};

const CollectionItem = ({ resource, go }) => {
  const { data, resourceState } = useResource(resource);

  myItems.push({
    title: data.name,
    onClick: () => go(resourceState.links.get('self').href),
  });
  return null;
};

你有什么解决这个问题的技巧吗?

它是否可能导致 :

Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.

每个资源使用 1 个组件正是推荐的模式。我什至会说这是最佳实践。请注意,如果存在缓存资源状态,则对 useResource 的调用不会导致 API 调用。

如果您发现每次迭代看到 1 个请求,您可能需要确保 collection returns 每个成员都作为嵌入式资源。如果您使用 useCollection 挂钩,请求将包含 Prefer: transclude=item header 以提示服务器可能需要嵌入。

此外,react-ketting在卸载时进行清理。