You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js App目录ServerSide页面数据自动刷新方案咨询

Next.js App Router 计分表自动刷新方案(无需API/全页重载)

方案1:增量静态再生(ISR)自动刷新

直接在服务器组件页面配置revalidate属性,让Next.js后台自动定时重新生成页面,完全基于服务器逻辑实现刷新:

// app/scores/page.tsx
import { prisma } from '@/lib/prisma';

// 设置每分钟自动重新生成页面
export const revalidate = 60;

export default async function ScoresPage() {
  // 服务器端直接执行Prisma查询
  const scores = await prisma.score.findMany();

  return (
    <div className="scores-table">
      {scores.map(score => (
        <div key={score.id} className="score-item">
          <span>{score.player}</span>
          <span>{score.points}</span>
        </div>
      ))}
    </div>
  );
}
  • 优势:无需客户端代码,Next.js会在后台静默更新页面内容,用户浏览时无感知重载,适合非强实时的计分场景。
  • 注意:如果页面包含用户个性化数据,需搭配dynamic或generateStaticParams确保数据准确性。

方案2:Server Actions + 客户端局部刷新

用Next.js的Server Actions替代独立API,在客户端组件中定时调用服务器端的Prisma查询,仅更新计分表局部状态,避免全页重载:

  1. 定义Server Action(服务器端执行逻辑):
// app/scores/actions.ts
'use server';

import { prisma } from '@/lib/prisma';

// 封装Prisma查询,标记为服务器端执行
export async function getLatestScores() {
  return await prisma.score.findMany();
}
  1. 客户端组件负责渲染和定时刷新:
// app/scores/ScoresClient.tsx
'use client';

import { useState, useEffect } from 'react';
import { getLatestScores } from './actions';

export default function ScoresClient({ initialScores }: { initialScores: Score[] }) {
  const [scores, setScores] = useState(initialScores);

  useEffect(() => {
    // 每分钟调用一次Server Action获取最新数据
    const refreshInterval = setInterval(async () => {
      const newScores = await getLatestScores();
      setScores(newScores);
    }, 60000);

    // 组件卸载时清理定时器
    return () => clearInterval(refreshInterval);
  }, []);

  return (
    <div className="scores-table">
      {scores.map(score => (
        <div key={score.id} className="score-item">
          <span>{score.player}</span>
          <span>{score.points}</span>
        </div>
      ))}
    </div>
  );
}
  1. 服务器页面组件传递初始数据:
// app/scores/page.tsx
import { prisma } from '@/lib/prisma';
import ScoresClient from './ScoresClient';

export default async function ScoresPage() {
  // 服务器端获取初始数据,避免客户端首屏空白
  const initialScores = await prisma.score.findMany();
  return <ScoresClient initialScores={initialScores} />;
}
  • 优势:仅更新计分表局部内容,无全页重载;无需单独编写API接口,Server Actions直接封装服务器端逻辑。

方案3:流式更新+ISR(进阶实时场景)

结合Next.js流式渲染和Suspense组件,配合ISR实现更流畅的内容更新:

// app/scores/page.tsx
import { Suspense } from 'react';
import { prisma } from '@/lib/prisma';

export const revalidate = 60;

async function ScoresContent() {
  const scores = await prisma.score.findMany();
  return (
    <div className="scores-table">
      {scores.map(score => (
        <div key={score.id} className="score-item">
          <span>{score.player}</span>
          <span>{score.points}</span>
        </div>
      ))}
    </div>
  );
}

export default function ScoresPage() {
  return (
    <Suspense fallback={<div>加载计分表...</div>}>
      <ScoresContent />
    </Suspense>
  );
}
  • 原理:流式渲染会逐步输出页面内容,ISR定时刷新时,新内容会被流式推送到客户端,无需等待全页加载完成,提升用户体验。

内容的提问来源于stack exchange,提问作者Cédric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:27:35