【问题标题】:How to update image source on hover?如何在悬停时更新图像源?
【发布时间】:2022-02-14 05:44:25
【问题描述】:

我正在尝试使用 Next.js Image 组件在我的应用页面上呈现图像。我在理解如何选择和更新主图像 src 时遇到问题,以便我可以用 Next.js 为 Image 元素创建的所有响应大小替换它。

我的应用程序菜单中有一个导航链接列表,我想为每个链接分配数据属性,以便当这些链接悬停在上面时,它们会更新主 Image 元素并为悬停的每个链接显示不同的主图像结束了。

我是 React 及其工作方式的新手,所以我不确定我的问题是什么,但我已经从一些基本概念开始。我已经开始控制台记录我必须查看的数据,但现在我遇到了障碍。

这是我目前所拥有的:

import React, { useState, useEffect, useRef } from 'react';
import Image from 'next/image';

function Header() {

  const MenuHeroImg = useRef();

  function handleMouseEnter(e) {
    console.log(e.target.getAttribute('data-project-image-url'));
    console.log(MenuHeroImg.current);
  }

  return (
    <>
     <ul>
        <li
         onMouseEnter={handleMouseEnter}
         data-project-image-url="/public/images/projects/image_2.png"
         className={`${navigationStyles['c-navigation-menu-link']}`}>
         <Link href="/project-link-here">Link</Link>
        </li>
        <li
         onMouseEnter={handleMouseEnter}
         data-project-image-url="/public/images/projects/image_3.png"
         className={`${navigationStyles['c-navigation-menu-link']}`}>
         <Link href="/project-link-here_2">Link</Link>
        </li>
     <ul>
     <picture ref={MenuHeroImg}>
       <Image
        src="/public/images/projects/image_1.png"
        alt="Image"
        width={660}
        height={835}
        layout="responsive"
       />
     </picture>
    </>
  );
}

export default Header;

控制台日志:

【问题讨论】:

    标签: reactjs next.js nextjs-image


    【解决方案1】:

    与其使用data-* 属性来设置图像路径,不如将图像源移动到一个状态变量中,然后您可以在每个onMouseEnter 被触发时进行更新。

    另请注意,public 文件夹中的图像被引用为 /images/projects/image_1.png,没有 /public

    import React, { useState } from 'react';
    import Image from 'next/image';
    
    function Header() {
        const [image, setImage] = useState('/images/projects/image_1.png');
    
        function handleMouseEnter(imagePath) {
            return () => {
                setImage(imagePath);
            };
        }
    
        return (
            <>
                <ul>
                    <li
                        onMouseEnter={handleMouseEnter('/images/projects/image_2.png')}
                        className={`${navigationStyles['c-navigation-menu-link']}`}
                    >
                        <Link href="/project-link-here">Link</Link>
                    </li>
                    <li
                        onMouseEnter={handleMouseEnter('/images/projects/image_3.png')}
                        className={`${navigationStyles['c-navigation-menu-link']}`}
                    >
                        <Link href="/project-link-here_2">Link</Link>
                    </li>
                <ul>
                <Image
                    src={image}
                    alt="Image"
                    width={660}
                    height={835}
                    layout="responsive"
                />
            </>
        );
    }
    
    export default Header;
    

    【讨论】:

    • 谢谢你,但是'imagePath'是mouseEnter函数中的错字吗?当我实施您的建议时,我没有看到任何事情发生。我也没有看到错误
    • 这不是错字,这是你在每个onMouseEnter回调函数上传递的路径,即onMouseEnter={handleMouseEnter('/images/projects/image_2.png')
    • 是的,忽略我,我没有看到图像变化,因为我在悬停链接时尝试使用相同的图像(doh!)。它似乎工作得很好
    【解决方案2】:

    src 应该是这样的:/images/projects/image_1.png; 因为 nextjs 在根文件夹中寻找图片,即公用文件夹

    【讨论】:

    • 谢谢!但是如何使用 data 属性 url 并将其添加到 Image 标签元素中以查看它的变化?
    • 您可以使用 setState 设置 url,然后将其添加到图像 src,如下所示: const [image , SetImage] = useState("") 并将其添加到 src:src={ image} 当状态改变时,它会自动重新渲染图像并且图像会改变
    • 并且在 getattribute 中你应该发送两个参数第一个是你想要的属性,第二个是它的名称,它主要用于 id 和 classes 但对于 src 你可以使用 document.getElementById( ' data-project-image-url').querySelector("image").src
    • 或者直接给图片一个id,用document.getElementById("id").src获取它的src
    猜你喜欢
    • 2014-06-04
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2021-04-10
    • 2013-12-05
    相关资源
    最近更新 更多