cgfeel / next.v2

按照NextJS英文官方文档,按照章节最小化复现
MIT License
34 stars 4 forks source link

Link组件导航不知道为啥不刷新视图 #2

Open java668 opened 3 months ago

java668 commented 3 months ago

Link组件导航不知道为啥不刷新视图,查询数据使用 noStore(); 清除缓存了,点击 dashboard 有时候不刷新视图

import { unstable_noStore as noStore } from 'next/cache';
export async function fetchRevenue() {
  // Add noStore() here to prevent the response from being cached.
  noStore();
  // This is equivalent to in fetch(..., {cache: 'no-store'}).

  try {
    // Artificially delay a response for demo purposes.
    // Don't do this in production :)

    console.log('Fetching revenue data...');
    await new Promise((resolve) => setTimeout(resolve, 3000));

    const data = await sql<Revenue>`SELECT * FROM revenue`;

    console.log('Data fetch completed after 3 seconds.');

    return data.rows;
  } catch (error) {
    console.error('Database Error:', error);
    throw new Error('Failed to fetch revenue data.');
  }
}
cgfeel commented 3 months ago

刷新本地视图 https://github.com/cgfeel/next.v2/blob/master/docs/navigation.md

刷新本地路由有以下方法:

a 标签代替 link

<Link href="/test">test</Link>

// 换成

<a href="/test">test</a>

缺点:页面有个加载抖动过程

hash

<Link href={`/test?${Date.now()}`}>test</Link>

缺点:有个 hash 小尾巴

Router.refresh

useEffect(() => {
    router.refresh();
}, [router]);

reset 刷新 error.tsx

'use client' // Error components must be Client Components

import { useEffect } from 'react'

export default function Error({
  error,
  reset,
}: {
  error: Error & { digest?: string }
  reset: () => void
}) {
  useEffect(() => {
    // Log the error to an error reporting service
    console.error(error)
  }, [error])

  return (
    <div>
      <h2>Something went wrong!</h2>
      <button
        onClick={
          // Attempt to recover by trying to re-render the segment
          () => reset()
        }
      >
        Try again
      </button>
    </div>
  )
}

缺点:只能用于 error.tsx

直接把 RSC 通过 server action 返回:

'use server'

function action() {
    return (<div>this form server action { Data.now() }</div>);
}

客户端

'use client'

const Com = () => {
    useEffect(() => {
        action().then(info => {  })
    }, []);
};
cgfeel commented 3 months ago

以上 5 个方法满足你在不同场景,不同页面刷新本地视图请求。NextJS 分服务器视图和本地视图,首次访问之后全部按照 Spa 规则来:

以上方法都需要在服务端视图更新的前提先:

验证服务端视图也很简单,每次手动复制粘贴打开网页查看数据是否更新

java668 commented 3 months ago

大佬 你微信多少 加你沟通学习一下