我目前正在将一个使用ReactJS进行客户端渲染的应用程序转换为NextJS应用程序,以提高搜索引擎优化和社交媒体链接的效果。
转换后的其中一个组件实际上是一张图片,等待它加载完成后淡入显示,但在NextJS环境中使用时没有达到预期效果。
它的行为如下:
缓存已启用:
- 第一次加载图像时,onLoad事件会触发并显示图像。
- 第二次加载图像时,由于从缓存加载图像时不会触发onLoad事件,因此图像仍然隐藏。
使用devtools禁用缓存:
- onLoad事件始终有效,因为图像从未从缓存中加载。
预期行为及以前仅使用ReactJS实现的行为:
- 无论图像是否从缓存中加载,都应触发onLoad事件。
当不使用React时,这个问题通常是由于在定义onload函数之前设置了图像的src属性造成的:
let img = new Image()
img.src = "img.jpg"
img.onload = () => console.log("Image loaded.")
应该是:
let img = new Image()
img.onload = () => console.log("Image loaded.")
img.src = "img.jpg"
这里是导致NextJS出现相同问题的简化代码:
import React, { useState } from "react"
const Home = () => {
const [loaded, setLoaded] = useState(false)
const homeStyles = {
width: "100%",
height: "96vh",
backgroundColor: "black"
}
const imgStyles = {
width: "100%",
height: "100%",
objectFit: "cover",
opacity: loaded ? 1 : 0
}
const handleLoad = () => {
console.log("Loaded")
setLoaded(true)
}
return (
<div className="Home" style={homeStyles}>
<img alt=""
onLoad={handleLoad}
src="https://images.unsplash.com/photo-1558981001-5864b3250a69?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1350&q=80"
style={imgStyles}
/>
</div>
)
}
export default Home