当领导说"别滚了",我反手就是一个开源!——@zhou96/auto-scroll-list诞生记

2,055 阅读3分钟

一、需求来得太快就像龙卷风

那是一个风和日丽的下午,我正在愉快地摸鱼(划掉)coding,突然领导一个闪现出现在我身后:

"小周啊,这个大屏的滚动列表一直在动,看得我头晕眼花,能不能优化一下?"

我心想:"这不是很常见的需求吗?数据滚动展示,多高大上啊!"但嘴上还是乖巧地回答:"好的领导,我马上优化!"

二、我滚得很有节奏感

于是,我开始了对滚动列表的改造工程。老版本就是简单粗暴地一直往上滚,跟永动机似的。这哪行啊!用户体验太差了!

经过我三天三夜的奋战(其实就半天),一个全新的、优雅的、智能的滚动组件诞生了!它拥有以下超能力:

  1. 智能暂停:鼠标移入暂停滚动,移出继续滚——再也不用担心看不清了!
  2. 优雅动画:不是生硬地跳转,而是丝滑过渡
  3. 高度可定制:想滚多快滚多快,想停多久停多久
  4. 响应式设计:不管屏幕大小怎么变,都能优雅应对
import { useRef } from 'react'
import { AutoScrollList, type AutoScrollListRef } from '@zhou96/auto-scroll-list'

type SampleData = {
  id: number
  title: string
  description: string
}

const sampleData: SampleData[] = [
  { id: 1, title: '第一行内容', description: '这是第一行的详细描述信息' },
  {
    id: 2,
    title: '第二行内容',
    description: '这是第二行的详细描述信息,内容稍微长一些',
  },
  { id: 3, title: '第三行内容', description: '这是第三行的详细描述' },
  {
    id: 4,
    title: '第四行内容',
    description: '这是第四行的详细描述信息,包含更多的文本内容,用于测试不同高度的行',
  },
  { id: 5, title: '第五行内容', description: '这是第五行' },
  { id: 6, title: '第六行内容', description: '这是第六行的详细描述信息' },
  {
    id: 7,
    title: '第七行内容',
    description: '这是第七行的内容,用于演示滚动效果',
  },
  {
    id: 8,
    title: '第八行内容',
    description: '最后一行内容,滚动到这里会触发回调',
  },
  {
    id: 9,
    title: '第九行内容',
    description: '最后一行内容,滚动到这里会触发回调',
  },
]

const renderRowItem = (item: (typeof sampleData)[0], index: number) => (
  <div
    style={{
      display: 'flex',
      flexDirection: 'column',
      gap: '4px',
      marginBottom: '8px',
    }}
  >
    <div style={{ fontWeight: 500, color: '#1f2937' }}>{item.title}</div>
    <div style={{ fontSize: '14px', color: '#6b7280' }}>{item.description}</div>
    <div style={{ fontSize: '12px', color: '#9ca3af' }}>行号: {index + 1}</div>
  </div>
)

export default function AutoScrollListExample() {
  const scrollContainerRef = useRef<AutoScrollListRef>(null)

  const handleReachBottom = () => {
    console.log('Reached bottom of the list')
  }

  return (
    <>
      <div style={{ marginBottom: '24px' }}>
        <button onClick={() => scrollContainerRef.current?.play()}>play</button>
        <button onClick={() => scrollContainerRef.current?.pause()}>pause</button>
        <button onClick={() => scrollContainerRef.current?.scrollToTop()}>scrollToTop</button>
      </div>

      <div style={{ width: '200px', height: '200px', background: '#f3f4f6' }}>
        <AutoScrollList<SampleData>
          ref={scrollContainerRef}
          data={sampleData}
          loop={true}
          rowItem={renderRowItem}
          autoPlay={true}
          scrollDelay={2000}
          onReachBottom={handleReachBottom}
        />
      </div>
    </>
  )
}

三、领导的心思你别猜

就在我得意洋洋地提交代码,准备接受表扬的时候,另一位领导突然发话:

"这个大屏的数据列表...其实不需要滚动。"

我:???

![黑人问号脸.jpg]

那一刻,我仿佛听到了心碎的声音。但作为一个成熟的程序员,我选择...把它开源!

四、开源大法好!

既然领导不需要,但世界上总有需要的人!于是我把这个组件打包发布到了npm,取名为@zhou96/auto-scroll-list

主要特点:

  • 🎯 超级简单易用,API设计直观
  • 🚀 性能优化,大数据量也不卡顿
  • 🎨 高度可定制,满足各种滚动需求
  • 🛠️ TypeScript支持,开发体验棒棒哒

安装方法:

bash

npm install @zhou96/auto-scroll-list
# 或者
yarn add @zhou96/auto-scroll-list

五、人生就像滚动的列表

这个故事告诉我们:

  1. 领导的需求就像六月的天气,说变就变
  2. 优秀的代码总会有用武之地,如果没有...那就开源吧!
  3. 做前端要学会"滚"的艺术——该滚的时候滚,该停的时候停

DEOM

codesandbox.io/p/sandbox/9…