javascript - 如何为 map 函数中的每个迭代分配一个新的 ref?

标签 javascript reactjs react-hooks ref

我不确定如何提出这个问题,因为我仍然无法准确地界定问题。

我创建了一个 useHover 函数。在下面,您会看到我正在映射数据并渲染一堆照片。但是,useHover 仅适用于第一次迭代。

我怀疑这是因为我的引用。这是如何运作的?我应该在每次迭代中创建一个新的引用——还是那种错误的想法……?

我该怎么做?

这是我的 useHover 函数。

const useHover = () => {
  const ref = useRef();
  const [hovered, setHovered] = useState(false);

  const enter = () => setHovered(true);
  const leave = () => setHovered(false);

  useEffect(() => {
    ref.current.addEventListener("mouseenter", enter);
    ref.current.addEventListener("mouseleave", leave);

    return () => {
      ref.current.removeEventListener("mouseenter", enter);
      ref.current.removeEventListener("mouseleave", leave);
    };
  }, [ref]);

  return [ref, hovered];
};

这是我的 map 功能。如您所见,我已将 ref 分配给图像。

问题:悬停时只有一张图片有效。

const [ref, hovered] = useHover();

  return (
    <Wrapper>
      <Styles className="row">
        <Div className="col-xs-4">
          {data.map(item => (
            <div className="row imageSpace">
              {hovered && <h1>{item.fields.name}</h1>}
              <img
                ref={ref}
                className="image"
                key={item.sys.id}
                alt="fall"
                src={item.fields.image.file.url}
              />
            </div>
          ))}
        </Div>

最佳答案

如果可能的话,我会使用 CSS 来处理这个问题,而不是在我的 JavaScript 代码中处理悬停。

如果在 JavaScript 代码中执行此操作,我会通过为悬停的内容创建一个组件来处理此问题:

function MyImage({src, header}) {
    const [ref, hovered] = useHover();
    return (
        <div className="row imageSpace">
          {hovered && <h1>{header}</h1>}
          <img
            ref={ref}
            className="image"
            alt="fall"
            src={src}
          />
        </div>
    );
}

然后使用该组件:

return (
  <Wrapper>
    <Styles className="row">
      <Div className="col-xs-4">
        {data.map(item =>
          <MyImage
            key={item.sys.id}
            src={item.fields.image.file.url}
            header={item.fields.name}
          />
        )}
      </Div>

(显然,如果您愿意,可以配置更多 Prop 。)

关于javascript - 如何为 map 函数中的每个迭代分配一个新的 ref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59273754/

相关文章:

javascript - 使用 Javascript 设置 <div> 的宽度

javascript - React 路由器访问对象详细信息

javascript - 在React中访问子级的父级状态

node.js - 将 Sockets.io 与 React.js + Hooks 结合使用; sockets.emit 不工作

javascript - 子组件在 react 钩子(Hook)中调用useState()时如何实现条件渲染?

javascript - 我需要连接我的数据库然后将其显示在网页上

c# - 使用 ScriptManager.RegisterClientScriptIninclude 注册 JavaScript 文件

javascript - 未捕获的不变违规 : Target container is not a DOM element

reactjs - 在路由上重新渲染 Ionic React(不想重新加载数据)

javascript - 按位置 :absolute works only on chrome 垂直居中