reactjs - Next.js 根据 router.asPath 更新状态

标签 reactjs next.js next-router

我有一个带有步进器的 next.js 多步表单。步进器在初始负载时具有以下状态:

  const [steps, setStepsData] = useState([
    { name: 'Vertrag', status: 'current' },
    { name: 'Dateneingabe', status: 'upcoming' },
    { name: 'Bestätigung', status: 'upcoming' },
  ]);

此状态在上下文中处理,我还使用路由器根据表单步骤设置我的 URL。每次用户单击下一步按钮时,都会调用以下函数:

  const nextFormStep = (contract='') => {
    const nextStep = formStep + 1;
    router.push(`?step=${nextStep}`);
    setFormValues({ contract });
  };

到目前为止一切顺利。现在,在我的上下文中,我希望检查 router.asPath === '/?step=1' 是否应该这样做:

router.asPath === '/?step=1' ? setStepsData( steps => [
  { name: 'Vertrag', status: 'current' },
  { name: 'Dateneingabe', status: 'current' },
  { name: 'Bestätigung', status: 'upcoming' },]) : console.log('doesnt work')
}, [])

所以,如果我就这样保留它,我会收到一个错误:重新渲染次数过多。 React 限制渲染数量以防止无限循环。 我想,我可能需要这样使用Effect:

useEffect(() => { 
      router.asPath === '/?step=1' ? setStepsData( steps => [
      { name: 'Vertrag', status: 'current' },
      { name: 'Dateneingabe', status: 'current' },
      { name: 'Bestätigung', status: 'upcoming' },]) : console.log('doesnt work') 
}, [])

使用这种方法,状态只有在我点击浏览器中的重新加载按钮后才会发生变化,而不是在 更改到下一个表单步骤。如何实现以下行为:我按下下一步按钮 - url 路径发生变化,状态发生变化,我再次按下后退按钮,url 发生变化,步骤状态也发生变化?

最佳答案

我只需要“订阅”路由器的更改,如下所示:

router.asPath === '/?step=1' ? setStepsData( steps => [
  { name: 'Vertrag', status: 'current' },
  { name: 'Dateneingabe', status: 'current' },
  { name: 'Bestätigung', status: 'upcoming' },]) : console.log('doesnt work')
}, [router])

从上面的评论和这篇 SO-post 中得到了提示:useEffect doesn't update state on route change

关于reactjs - Next.js 根据 router.asPath 更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69233181/

相关文章:

reactjs - 为什么 useRef 在此示例中不起作用?

next.js - 使用自定义凭据提供程序进行 NextAuth 不创建 session

reactjs - Next.js : router. 推送不刷新页面

reactjs - 下一个/路由器不返回组件中的查询字符串参数

javascript - 仅响应渲染更改

reactjs - 在 react-router 上监听页面刷新和窗口关闭

javascript - Next JS 和 Vercel - 开发与生产

javascript - 在 React 组件之外使用 NextRouter

javascript - 无法在 'readAsBinaryString' : parameter 1 is not of type 'FileReader' 上执行 'Blob'

reactjs - 不能在 getInitialProps 中使用 'fs'