mirror of
https://github.com/JefferyHcool/BiliNote.git
synced 2026-06-17 21:50:15 +08:00
- 新增关于页面组件,介绍项目背景、功能和使用方法 - 重构笔记生成逻辑,支持多版本笔记 - 新增笔记版本选择、复制和导出功能 -优化笔记界面布局和交互 - 调整部分组件样式,提升用户体验
35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
// components/LazyImage.tsx
|
|
import { useInView } from 'react-intersection-observer'
|
|
import { FC, useState } from 'react'
|
|
import clsx from 'clsx'
|
|
|
|
interface LazyImageProps {
|
|
src: string
|
|
alt?: string
|
|
className?: string
|
|
placeholder?: string
|
|
}
|
|
|
|
const LazyImage: FC<LazyImageProps> = ({ src, alt, className, placeholder = '.src/assets/placeholder.png' }) => {
|
|
const { ref, inView } = useInView({ triggerOnce: true, threshold: 0.1 })
|
|
const [loaded, setLoaded] = useState(false)
|
|
|
|
return (
|
|
<div ref={ref} className={clsx('overflow-hidden', className)}>
|
|
{inView ? (
|
|
<img
|
|
src={src}
|
|
alt={alt}
|
|
loading="lazy"
|
|
onLoad={() => setLoaded(true)}
|
|
className={clsx('transition-opacity duration-300', loaded ? 'opacity-100' : 'opacity-0') + ' h-10 w-14 rounded-md object-cover'}
|
|
/>
|
|
) : (
|
|
<img src={placeholder} alt="loading" className="opacity-30" />
|
|
)}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default LazyImage
|