快拍栏

信息流顶部的一排圆环:每人一个,有新内容时是彩色的,用户全部看完后变暗。点击圆环会从第一条还没看过的快拍开始播放;下次访问时,即使刷新过页面,也会记得用户看到了哪里。

试一试

每个版本都导入 ./api,它代替你的后端:groups 是用户关注的人以及每人发布的快拍,形状与播放器的 StoriesGroup 相同。把它换成你自己的信息流。

typescript
import { cdnUrl } from '@reelkit/example-data';

// Stands in for your backend: the people a viewer follows and the stories each
// one posted. Each entry has the shape of `StoriesGroup` from the stories
// player of your framework, so the list goes to the player as it is.

export interface Group {
  author: { id: string; name: string; avatar: string };
  stories: { id: string; mediaType: 'image'; src: string }[];
}

const kPeople = ['Alex', 'Sarah', 'Mike', 'Emma', 'Noah', 'Lena'];

// Uneven on purpose: a person with one story is watched to the end at once,
// one with three can be left part way and resumed.
const kStoryCounts = [3, 1, 2, 3, 1, 2];

const pad = (n: number) => String(n).padStart(2, '0');

const storyImage = (n: number) =>
  n <= 6
    ? cdnUrl(`samples/images/stories/story-00${n}.jpg`)
    : cdnUrl(`samples/images/image-${pad(n - 6)}.jpg`);

let nextImage = 1;

export const groups: Group[] = kPeople.map((name, i) => ({
  author: {
    id: `user-${i + 1}`,
    name,
    avatar: cdnUrl(`samples/avatars/avatar-${pad(i + 1)}.jpg`),
  },
  stories: Array.from({ length: kStoryCounts[i] }, (_, j) => ({
    id: `user-${i + 1}-story-${j + 1}`,
    mediaType: 'image' as const,
    src: storyImage(nextImage++),
  })),
}));
示例媒体只能在 reelkit.dev 上使用

cdnUrl 生成指向 cdn.reelkit.dev 的链接,而它只向 ReelKit 站点提供文件。在你的应用里这些头像和快拍会加载失败,所以复制这个文件之前,先把 avatar 和 src 指向你自己的文件。

StoriesTray.tsx
Alex
Alex
Sarah
Sarah
Mike
Mike
Emma
Emma
Noah
Noah
Lena
Lena
StoriesTray.vue
Alex
Alex
Sarah
Sarah
Mike
Mike
Emma
Emma
Noah
Noah
Lena
Lena
stories-tray.component.ts
Alex
Alex
Sarah
Sarah
Mike
Mike
Emma
Emma
Noah
Noah
Lena
Lena

把某个人的快拍看完再关闭播放器:他的圆环会变暗,焦点落在你最后观看的那个人上,刷新后两者都会保留。"Forget what was seen" 会从头开始。

原理

  • 一个控制器同时为两者记忆 —— createStoriesViewedStateController 只创建一次,作为 viewed 传给圆环列表和播放器。圆环从中读取,播放器把显示过的每条快拍记录进去,控制器再把它保存在 localStorage 的 storageKey 之下,所以刷新不会改变任何东西。参见“记住已看内容”:React、Vue 和 Angular。
  • 播放器从用户停下的地方继续 —— 有了 viewed,播放器会从某人第一条还没看过的快拍开始;如果全部看过,则从头开始。示例只传入是哪个人,从不传快拍索引;这个问题由控制器的 resumeStoryIndex 回答,见它的参考文档。
  • 圆环只有两种状态 —— 还有内容可看时是彩色的,某人被看完后变暗。某人内部的进度显示在播放器的进度条上,而不是圆环上。参见 StoriesRing。
  • 圆环颜色跟随页面 —— 两种状态分别是 --rk-stories-ring-active-gradient 和 --rk-stories-ring-viewed-color 令牌,看完状态默认是为深色页面准备的淡白色。浅色页面请把它设在 .rk-stories-ring-list 上(本演示在浅色主题下就是这样做的),不要设在 :root:播放器的桌面轮播会在深色背景上用同样的令牌绘制圆环。令牌见主题表。
  • 控制器不需要额外接线 —— 播放器始终被渲染,用 isOpen 打开,所以它会在选择第一条快拍之前自己读取保存的状态。如果只在打开时才挂载它,页面就必须先接上控制器,控制器参考文档对此有说明。
  • 焦点回到正确的圆环 —— 播放器关闭时会把焦点还给打开它的圆环,正如它的无障碍部分所述。这发生在关闭处理函数运行之后,所以示例先等待一个任务,再把最后观看的那个人的圆环滚动到可见区域并让它获得焦点。
  • 还能保存在别处 —— storage 接受你自己的适配器,例如服务器,这样已看内容就能在不同设备间跟随用户。ttlMs 让某个人的记录过期,maxTracks 限制保留的人数。它们都在控制器配置中。

下一步