The load event triggered by an HTML element does not bubble up to the window object by default. Therefore, when an image is loaded using an img HTML element, if you need to notify the window object, you must manually dispatch the event to it.
An example:
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <img> <p>JS<br> </p> <pre class="brush:php;toolbar:false">document.getElementById('image').addEventListener('load', function() { console.log('Image load event'); window.dispatchEvent(new Event('load')); // Manually dispatch load event to window }); window.addEventListener('load', function() { console.log('Window load event'); });
Console output: the second log 'Window Load Event' is triggered by calling dispatchEvent
Image load event Window load event Window load event
Simulating an API call to fetch an image URL and passing it to the Banner component triggers a re-render when imgUrl changes, allowing the correct value of completed to be captured at the second render stage.
import { useRef , useState , useEffect } from "react"; export default function App() { const [imgUrl, setImgUrl] = useState(""); useEffect(() => { // simulate calling API to get image url const loadImage = () => { setTimeout(() => { setImgUrl("https://placehold.co/200x100") }, 1500); } loadImage(); }, []); return <Banner imgUrl={imgUrl} /> } function Banner({ imgUrl }) { const ref = useRef(null); // this works when the imgUrl changes, triggering a re-render. Otherwise, the value of completed will always be false const completed = Boolean(ref.current?.complete); return ( <div> <img ref={ref} src={imgUrl} onLoad={() => console.log("loaded")} onError={() => console.log("error")}/> <p>{completed ? "Image loaded" : "Image is not loaded"}</p> </div> ); }
Update the component state in the onLoad event callback
function StaticBanner() { const [loaded, setLloaded] = useState(false); return ( <div> <img src="https://placehold.co/100x100" onLoad={() => { console.log("StaticBanner img loaded"); setLloaded(true); }} onError={() => console.log("StaticBanner img error")}/> <p>{loaded ? "Image loaded" : "Image is not loaded"}</p> </div> ); }
To be continued...
以上がReact で画像が読み込まれた後にアクションを実行する方法: onLoad イベントまたは完全なプロパティを使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。