面试题答案
一键面试实现思路
- 监听业务场景相关事件:针对用户滚动位置,可监听
scroll
事件;对于页面可见性,监听visibilitychange
事件。 - 根据事件变化计算优先级:根据滚动位置距离页面顶部或底部的距离,以及页面是否可见,来确定图片加载优先级。
- 动态更新Image组件的优先级属性:将计算得到的优先级应用到Next.js的Image组件上。
关键技术点
- 事件监听:JavaScript的
addEventListener
用于监听scroll
和visibilitychange
事件。 - Next.js Image组件:其
priority
属性可控制图片加载优先级,需要动态更新该属性值。 - 状态管理:使用React的状态(如
useState
)来存储当前计算出的优先级,并在状态变化时重新渲染Image组件。
代码实现步骤
- 创建Next.js项目并引入Image组件:
npx create-next-app custom-image-priority
cd custom-image-priority
在页面中引入Image组件:
import Image from 'next/image';
- 设置状态及事件监听:
import React, { useState, useEffect } from'react';
import Image from 'next/image';
const CustomImage = () => {
const [priority, setPriority] = useState(false);
useEffect(() => {
const handleScroll = () => {
// 示例:当滚动距离顶部超过页面高度一半时设置为高优先级
const scrollTop = window.pageYOffset;
const windowHeight = window.innerHeight;
setPriority(scrollTop > windowHeight / 2);
};
const handleVisibilityChange = () => {
setPriority(!document.hidden);
};
window.addEventListener('scroll', handleScroll);
document.addEventListener('visibilitychange', handleVisibilityChange);
return () => {
window.removeEventListener('scroll', handleScroll);
document.removeEventListener('visibilitychange', handleVisibilityChange);
};
}, []);
return (
<div>
<Image
src="/your-image-url.jpg"
alt="example"
width={500}
height={300}
priority={priority}
/>
</div>
);
};
export default CustomImage;
上述代码中,useEffect
钩子在组件挂载时添加事件监听,在组件卸载时移除监听。根据滚动位置和页面可见性更新priority
状态,该状态作为Image
组件的priority
属性值,实现根据业务场景自定义图片加载优先级。