四、Next.js,动态页面

Next.js是一个新的通用JavaScript框架,它为基于React和服务器的Web应用提供了一个新的可选方案。

Next.js目前已经开源,https://zeit.co/blog/next

现在我们知道如何创建一个基本的多页面Next.js应用。为了创建一个页面,我们必须在磁盘上创建一个实际的文件。

然而,在一个真正的应用中,我们需要动态创建页面来显示动态内容。Next.js有很多方法可以使用。

我们开始使用查询字符串创建动态页面。

我们将创建一个简单的博客应用程序,它有一个关于home(index)页面的所有帖子的列表。

Paste_Image.png

当你点击一个帖子标题,你就能看到它自己的内容。

Paste_Image.png

让我们构建应用程序。

安装

首先,我们需要一个简单的Next.js应用程序。试着下载下面的示例应用程序:

git clone https://github.com/arunoda/learnnextjs-demo.git
cd learnnextjs-demo
git checkout using-shared-components

你可以执行下面的命令

npm install
npm run dev

现在,您可以通过导航到 http://localhost:3000 来访问该应用程序。

添加一个贴子列表

首先,让我们在主页中添加帖子标题。将以下内容添加到 page/index.js 中。

import Layout from '../components/MyLayout.js'
import Link from 'next/link'

const PostLink = (props) => (
  <li>
    <Link href={`/post?title=${props.title}`}>
      <a>{props.title}</a>
    </Link>
  </li>
)

export default () => (
  <Layout>
    <h1>My Blog</h1>
    <ul>
      <PostLink title="Hello Next.js"/>
      <PostLink title="Learn Next.js is awesome"/>
      <PostLink title="Deploy apps with Zeit"/>
    </ul>
  </Layout>
)

一旦添加了这些内容,就会看到这样的页面:

Paste_Image.png

接下来,单击第一个链接。你会得到一个404页面。这很好。那个页面的URL是什么?

通过查询字符串传递数据

我们正在通过一个查询字符串参数(a query param)传递数据。在我们的例子中,"title"是我们的查询参数。下面是我们的 PostLink 组件,如下所示:

const PostLink = (props) => (
  <li>
    <Link href={`/post?title=${props.title}`}>
      <a>{props.title}</a>
    </Link>
  </li>
)

(留意 Link 组件 的 href 属性)。

就像这样,您可以通过查询字符串传递任何类型的数据。

创建“帖子”页面

现在我们需要创建一个帖子页面来显示博客文章。为了做到这一点,我们需要从查询字符串获取标题。让我们看看如何做到这一点:

创建一个名为 pages/post.js 的文件,并添加以下内容:

import Layout from '../components/MyLayout.js'

export default (props) => (
    <Layout>
       <h1>{props.url.query.title}</h1>
       <p>This is the blog post content.</p>
    </Layout>
)

现在我们的页面看起来是这样子的:

Paste_Image.png

这是上面代码中所发生的事情。

  • 每个页面都将得到一个“URL”的属性回调,它有一些与当前URL相关的详情。
  • 在本例中,我们使用了“query”对象,该对象具有查询字符串params。
  • 因此,我们通过props.url.query.title 获得了 title。

让我们对我们的应用做一个简单的修改,替换“pag/post”的内容。js”如下:

import Layout from '../components/MyLayout.js'

const Content = (props) => (
  <div>
    <h1>{props.url.query.title}</h1>
    <p>This is the blog post content.</p>
  </div>
)

export default () => (
    <Layout>
       <Content />
    </Layout>
)

当你导航到这个页面时会发生什么? http://localhost:3000/post?title=Hello%20Next.js

特殊属性“url”

正如您所看到的,代码将抛出这样的错误:

Paste_Image.png

这是因为,url 属性 只会暴露在页面的主要组件中。这不会暴露在页面中使用的其他组件中。但是,如果你需要,你可以这样传递:

export default (props) => (
    <Layout>
       <Content url={props.url} />
    </Layout>
)
最后

现在,我们学习了如何使用查询字符串创建动态页面。这仅仅是开始。

动态页面可能需要更多的信息来呈现,而我们可能无法通过查询字符串传递所有信息。或者我们可能想要有这样干净的url:
http://localhost:3000/blog/hello-nextjs

在即将到来的课程中,我们可以学到这些知识。这是所有这些的基础。

本文翻译自:https://learnnextjs.com/basics/create-dynamic-pages

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,296评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,103评论 18 139
  • 一. Java基础部分.................................................
    wy_sure阅读 3,731评论 0 11
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,132评论 22 257
  • 一阵强烈的震动从头下传来,想也没想,我伸过手划拉了一下,周末啊,谁会这么早起来,昨晚睡前居然又忘记关闹钟了。 “小...
    虚音阅读 104评论 0 0