Viv*_*ian 5 javascript lazy-loading reactjs
我目前正在开发我的第一个 React 应用程序,但我正面临一些困难(对我而言)。
<div
className="container-fluid"
id="cityDetail"
style={{
backgroundImage: `url(${camera.lastPhoto})`,
backgroundRepeat: "no-repeat",
backgroundPosition: "center",
backgroundSize: "cover",
height: "100vh"
}}
>
Run Code Online (Sandbox Code Playgroud)
我想延迟加载 backgroundImage。
我还没有找到好的组件/实用程序来做到这一点。有没有人有任何想法?
Nao*_*den 22
这是延迟加载图像的简单组件:
class LazyBackground extends React.Component {
state = { src: null };
componentDidMount() {
const { src } = this.props;
const imageLoader = new Image();
imageLoader.src = src;
imageLoader.onload = () => {
this.setState({ src });
};
}
render() {
return <div {...this.props} style={{ backgroundImage: `url(${this.state.src || this.props.placeholder})` }} />;
}
}
Run Code Online (Sandbox Code Playgroud)
你会用 <LazyBackground src='path/to/hd.jpg' placeholder='path/to/placeholder.jpg' />
Jes*_*nen 19
这是一个基于 Naoise 回答的自定义 React 钩子:
const useProgressiveImage = src => {
const [sourceLoaded, setSourceLoaded] = useState(null)
useEffect(() => {
const img = new Image()
img.src = src
img.onload = () => setSourceLoaded(src)
}, [src])
return sourceLoaded
}
Run Code Online (Sandbox Code Playgroud)
用法:
const Component = (source, placeholder) => {
const loaded = useProgressiveImage(source)
return (
<div style={{ backgroundImage: `url(${loaded || placeholder})` }} />
)
}
Run Code Online (Sandbox Code Playgroud)