【问题标题】:Dynamic Pages Don't Change Rendered Components But URL Changes When Clicking Back Button, Using Link动态页面不会更改呈现的组件,但单击后退按钮时 URL 会更改,使用链接
【发布时间】:2020-04-09 01:29:01
【问题描述】:

我在使用 Next.js 创建博客时遇到了问题,希望有人能指出我正确的方向,因为我对 Next.js 还比较陌生。

我正在尝试从 Google Firestore 上的数据库中提取文档,每个文档都是不同的博客文章。我试图避免为每篇博文创建单独的页面,并创建了一个动态页面 [url].js,每篇博文都使用它来呈现。

无论如何,当我访问博客文章,刷新该博客文章,然后尝试点击返回按钮时,我的问题就出现了。 URL 会改变,但屏幕上呈现的组件不会改变。因此,它不会返回包含所有博客列表的页面,而是保留在当前博客文章上,但 url 会更改为所有博客的列表。

例如:

如果我在 localhost:3000/blog/test-page 上然后刷新页面并回击,url 更改为 localhost:3000/blog 但 test-page仍在显示其内容。

有人能帮我找出解决此问题的最佳方法吗?谢谢

[url].js

const Post = props => (
  <Layout
          template={"blog"}
  >
      <div className="container">
        <div className="default-content page-styles">   
            <h2 className="title title-small"><span>{props.blogPost.title}</span></h2>             
              {props.blogPost.body.map(block => Components(block))}
        </div>
      </div>
  </Layout>
);

Blog.js

const Blog = (props) => (

<Layout>
   <HeroBanner 
      title={title}
      desktopImage={desktopImage}
      mobileImage={mobileImage}
      mobileImageSmall={mobileImageSmall}
      padding="120px 0px 150px 0px"/>

<section className="default spaced-page">
         <div className="container">
            <div className="default-content" >
               <div className="the-post-section">
               {props.blogPost.map(post => (
                    <div key = {post.id} className="the-post page-styles">
                      <img src={post.image} style={{ height: 180 + "px", width: 310 + "px"}}/>
                      <Link href="/blog/[url]" as={`/blog/${post.url}`}>
                        <h4><a>{post.title}</a></h4>
                      </Link>
                      <div className="clear"></div>
                    </div>
                  ))}
               </div>
            </div>
         </div>
      </section>
</Layout>
); 

【问题讨论】:

  • 当您点击返回按钮时,控制台是否有任何错误?看起来它在导航上崩溃了。
  • @EvgenyTimoshenko 不幸的是,当我点击后退按钮时没有抛出任何东西。是什么让您认为它崩溃了?
  • 好吧,有时您可能会看到类似的情况发生,当它出错时,您会看到之前的状态。我注意到您将 Blog.js 大写,它在文件系统中是如何命名的?您的页面目录如何?
  • 如何获取页面的道具?你有getInitalProps 给他们吗?
  • @EvgenyTimoshenko 它在文件系统中没有大写。我有调用 google firestore 并收集博客文章的 getInitalProps。

标签: javascript reactjs react-router next.js


【解决方案1】:

我找到了一个可行的解决方案,但不确定它是否是“最佳实践”。

我所要做的就是更改链接组件

<Link href="/blog/[url]" as={`/blog/${post.url}`}>
    <h4><a>{post.title}</a></h4>
</Link>

去掉h4标签,将href=改为to=

<Link to="/blog/[url]" as={`/blog/${post.url}`}>
    <a>{post.title}</a>
</Link>

编辑:事实证明这实际上会在控制台中引发错误,所以我可能必须找到不同的方法。

这是错误。

警告:失败的道具类型:道具hrefLink中标记为必填,但其值为undefined

链接:发现未知道具:到

Uncaught TypeError: Parameter 'url' must be a string, not undefined

【讨论】:

  • href 是关于使用什么页面组件,所以/blog/[url] 应该没问题
  • @EvgenyTimoshenko 添加 href 我得到了我原来的问题。只有当 href 不存在时它才能工作但会引发错误。有点奇怪。
  • 解决了!我必须更新我的依赖项并且它有效。感谢@EvgenyTimoshenko 的帮助
猜你喜欢
  • 2017-05-08
  • 2013-02-16
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2020-05-06
相关资源
最近更新 更多