如何在悬停时更新图像源?
How to update image source on hover?
我正在尝试使用 Next.js Image
组件在我的应用程序页面上呈现图像。我在理解如何 select 和更新主图像 src
时遇到问题,以便我可以用 Next.js 为 Image
元素创建的所有响应尺寸替换它。
我的应用程序菜单中有一个导航列表 link,我想为每个导航分配数据属性,这样当这些 link 悬停在上面时,它们会更新主 Image
元素并为每个 link 悬停显示不同的主图像。
我是 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;
控制台日志:
src 应该是这样的:/images/projects/image_1.png;
因为 nextjs 在 public 文件夹
的根文件夹中查找图像
与其使用 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;
我正在尝试使用 Next.js Image
组件在我的应用程序页面上呈现图像。我在理解如何 select 和更新主图像 src
时遇到问题,以便我可以用 Next.js 为 Image
元素创建的所有响应尺寸替换它。
我的应用程序菜单中有一个导航列表 link,我想为每个导航分配数据属性,这样当这些 link 悬停在上面时,它们会更新主 Image
元素并为每个 link 悬停显示不同的主图像。
我是 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;
控制台日志:
src 应该是这样的:/images/projects/image_1.png; 因为 nextjs 在 public 文件夹
的根文件夹中查找图像与其使用 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;