三、Next.js,共享组件

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

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

我们知道,Next.js是关于页面的。我们可以通过导出一个React组件来创建一个页面,将该组件放在 pages 目录中。然后它将有一个基于文件名的固定URL。

因为导出的页面是JavaScript模块,我们还可以将其他JavaScript组件导入到它们中。

这是任何JavaScript框架都希望看到的特性。

在这个课程中,我们将创建一个公共的 Header 组件,并在多个页面中使用它。最后,我们会看看如何实现布局组件,看它如何能够帮助我们定义多个页面的外观。

让我们开始吧。

安装

在这节课中,我们需要一个简单的Next.js应用程序。试着下载下面的示例应用程序:

git clone https://github.com/arunoda/learnnextjs-demo.git
cd learnnextjs-demo
git checkout navigate-between-pages

你可以通过以下命令执行:

npm install
npm run dev

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

创建Header组件

让我们为我们的应用程序创建一个Header组件。

将下面的内容添加到文件 components/header.js 中。

import Link from 'next/link'

const linkStyle = {
  marginRight: 15
}

const Header = () => (
    <div>
        <Link href="/">
          <a style={linkStyle}>Home</a>
        </Link>
        <Link href="/about">
          <a style={linkStyle}>About</a>
        </Link>
    </div>
)

export default Header

这个组件包含两个链接到我们的应用程序的页面。我们对这个链接定义了样式,让它更突出一些。

使用Header组件

接下来,让我们导入这个组件并在我们的页面中使用它。在 index.js 页面,它看起来是这样的:

import Header from '../components/Header'

export default () => (
  <div>
    <Header />
    <p>Hello Next.js</p>
  </div>
)

你也可以做同样的事情在 about.js 页面。

此时,如果您在http://localhost:3000/中导航到您的应用程序,您将能够看到新的标题并在页面之间导航。

image.png

让我们尝试对应用程序做一些简单的修改。

  • 停止正在运行的应用程序。
  • 将组件目录 components 重命名为 comps。
  • 导入 Header 用 ../comps/Header 代替 ../components/Header.
  • 再次启动应用程序。

能行吗?

组件目录

是的。它将按预期工作。

我们不需要把我们的组件放在一个特殊的目录中;这个目录可以命名为任何东西。惟一的特殊目录是页面目录。

甚至可以在 pages 目录中创建组件。

这里我们没有这样做,因为我们不需要直接URL到头组件。

布局组件

在我们的应用中,我们将在不同的页面中使用一种通用的样式。为此,我们可以创建一个通用的布局组件,并在每个页面使用它。这里有一个例子:

将这些内容添加到 components/MyLayout.js。

import Header from './Header'

const layoutStyle = {
  margin: 20,
  padding: 20,
  border: '1px solid #DDD'
}

const Layout = (props) => (
  <div style={layoutStyle}>
    <Header />
    {props.children}
  </div>
)

export default Layout

一旦我们做到了这一点,我们就可以在页面中使用如下的布局:

// pages/index.js

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

export default () => (
    <Layout>
       <p>Hello Next.js</p>
    </Layout>
)
// pages/index.js

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

export default () => (
    <Layout>
       <p>Hello Next.js</p>
    </Layout>
)

请记住,您可以在http://localhost:3000/中访问该应用程序,查看它长成什么样子。

现在让我们试着在布局组件中移除 {props.children}。看看应用程序会发生什么。

应用会发生什么情况?

渲染子组件

如何你移除了 {props.children},

布局不能呈现我们放入布局元素的内容,如下所示:

export default () => (
    <Layout>
       <p>This is the about page</p>
    </Layout>
)

这只是创建布局组件的一种方式。下面是一些创建布局组件的方法:

import withLayout from '../lib/layout'

const Page = () => (
  <p>This is the about page</p>
)

export default withLayout(Page)
const Page = () => (
  <p>This is the about page</p>
)

export default () => (<Layout page={Page}/>)
const content = (<p>This is the about page</p>)

export default () => (<Layout content={content}/>)
使用组件

我们已经提到了共享组件的两个用例:

  1. 作为通用的Header组件。
  2. 作为布局的

您可以使用组件来定义样式、页面布局和其他您喜欢的任务。另外,您可以从NPM模块中导入组件并使用它们。

本文翻译自:https://learnnextjs.com/basics/using-shared-components

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,448评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 从学校到公司,迈出了人生最重要的一步。 踏入一个新的环境,总会觉得既兴奋、又恐惧,还带着那么一点不知所措。想干活又...
    馋人小博阅读 847评论 3 11
  • 最近经常遇到有两个对象的大部分属性是相同的,之前是自己做的转换,今天发现有对象转换的工具类,事半功倍,常用的有如下...
    不将就51y阅读 9,169评论 1 0