我有一个下面的组件,它包含在获取数据并呈现数据的服务器组件中.如图所示,我在点击时呼叫router.refresh(),这样它就会重新运行该页面并重新获取数据.确实是这样,但问题是Nextjs会保持这种状态,所以当我调用setRefreshing(true)时,即使服务器组件重新运行刷新状态仍然为真.

'use client'
import { useRouter } from 'next/navigation'
import Button from './Button'

export default function Refresh() {
  const [refreshing, setRefreshing] = useState(false)
  const router = useRouter()

  const handleClick = () => {
    setRefreshing(true)
    router.refresh()
  }

  return (
    <Button onClick={handleClick}>
      <i className={`bi bi-arrow-repeat text-lg ${refreshing ? 'animate-spin' : ''}`}></i> 
      Refresh
    </Button>
  )
}

刷新后,useEffect也没有运行,因此我也不能在那里将其设置为FALSE.我已经找到了一种解决方法,可以将数组props 传递给组件,然后组件将重新运行useEffect(() => {...}, [serverHackyProp]).

<Refresh inProgress={[false]} />


const [[refreshing], setRefreshing] = useState(inProgress)
const router = useRouter()

useEffect(() => {
  setRefreshing(inProgress)
}, [inProgress])

const handleClick = () => {
  setRefreshing([true])
  router.refresh()
}

它之所以有效,是因为传递的数组总是有一个新的引用,所以useEffect将在每次服务器重新运行时运行.但我不喜欢这样做,除非这是我最后的 Select ,但在路由刷新(服务器重新获取)后,我找不到达到setRefreshing(false)的方法.

推荐答案

这个问题的一个简单解决方案是让数据获取函数返回一些随机值作为响应的一部分,并将该随机值用作Refresh组件的关键字.这样,您的Refresh组件将在每次刷新服务器端数据时被拆除并重新创建.

// setting revalidate to 0 just for the testing purpose
export const revalidate = 0;

async function getData() {
  return { data: ..., sid: Math.random() };
}

export default async function Page() {
  const data = await getData();

  return (
    <>
      <Refresh key={data.sid} />
      ...
    </>
  );
}

Javascript相关问答推荐

在TypScript中计算使用旋转谷仓的鸡舍所需的农场数量

如果被1个Phaser JS抵消,我的倾斜碰撞

即使设置了父级的最大高度,固定位置的分区内容也不会滚动?

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

被CSS优先级所迷惑

防止用户在selectizeInput中取消 Select 选项

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

微软Edge编辑和重新发送未显示""

如何在angular中从JSON值添加动态路由保护?

为什么这个JS模块在TypeScript中使用默认属性导入?""

如何在mongoose中链接两个模型?

康威的生活游戏规则在我的Javascript版本中不起作用.''我做错了什么?

如何为我的astro页面中的相同组件自动创建不同的内容?

material UI按钮组样式props 不反射

在WordPress中使用带有WPCode的Java代码片段时出现意外令牌错误

如何在.NET Core中将chtml文件链接到Java脚本文件?

以编程方式聚焦的链接将被聚焦,但样式不适用

如何访问此数组中的值?

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

判断函数参数的类型