三画侣、Next.js,共享組件

Next.js是一個(gè)新的通用JavaScript框架堡妒,它為基于React和服務(wù)器的Web應(yīng)用提供了一個(gè)新的可選方案。

Next.js目前已經(jīng)開源溉卓,https://zeit.co/blog/next

我們知道,Next.js是關(guān)于頁面的皮迟。我們可以通過導(dǎo)出一個(gè)React組件來創(chuàng)建一個(gè)頁面搬泥,將該組件放在 pages 目錄中。然后它將有一個(gè)基于文件名的固定URL伏尼。

因?yàn)閷?dǎo)出的頁面是JavaScript模塊忿檩,我們還可以將其他JavaScript組件導(dǎo)入到它們中。

這是任何JavaScript框架都希望看到的特性爆阶。

在這個(gè)課程中燥透,我們將創(chuàng)建一個(gè)公共的 Header 組件,并在多個(gè)頁面中使用它辨图。最后班套,我們會看看如何實(shí)現(xiàn)布局組件,看它如何能夠幫助我們定義多個(gè)頁面的外觀故河。

讓我們開始吧吱韭。

安裝

在這節(jié)課中,我們需要一個(gè)簡單的Next.js應(yīng)用程序。試著下載下面的示例應(yīng)用程序:

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

你可以通過以下命令執(zhí)行:

npm install
npm run dev

現(xiàn)在鱼的,您可以通過導(dǎo)航到http://localhost:3000來訪問該應(yīng)用程序理盆。

創(chuàng)建Header組件

讓我們?yōu)槲覀兊膽?yīng)用程序創(chuàng)建一個(gè)Header組件。

將下面的內(nèi)容添加到文件 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

這個(gè)組件包含兩個(gè)鏈接到我們的應(yīng)用程序的頁面猿规。我們對這個(gè)鏈接定義了樣式,讓它更突出一些宙橱。

使用Header組件

接下來姨俩,讓我們導(dǎo)入這個(gè)組件并在我們的頁面中使用它。在 index.js 頁面养匈,它看起來是這樣的:

import Header from '../components/Header'

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

你也可以做同樣的事情在 about.js 頁面哼勇。

此時(shí),如果您在http://localhost:3000/中導(dǎo)航到您的應(yīng)用程序呕乎,您將能夠看到新的標(biāo)題并在頁面之間導(dǎo)航积担。

image.png

讓我們嘗試對應(yīng)用程序做一些簡單的修改。

  • 停止正在運(yùn)行的應(yīng)用程序猬仁。
  • 將組件目錄 components 重命名為 comps帝璧。
  • 導(dǎo)入 Header 用 ../comps/Header 代替 ../components/Header.
  • 再次啟動應(yīng)用程序。

能行嗎湿刽?

組件目錄

是的的烁。它將按預(yù)期工作。

我們不需要把我們的組件放在一個(gè)特殊的目錄中;這個(gè)目錄可以命名為任何東西诈闺。惟一的特殊目錄是頁面目錄渴庆。

甚至可以在 pages 目錄中創(chuàng)建組件。

這里我們沒有這樣做,因?yàn)槲覀儾恍枰苯覷RL到頭組件襟雷。

布局組件

在我們的應(yīng)用中刃滓,我們將在不同的頁面中使用一種通用的樣式。為此耸弄,我們可以創(chuàng)建一個(gè)通用的布局組件咧虎,并在每個(gè)頁面使用它。這里有一個(gè)例子:

將這些內(nèi)容添加到 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

一旦我們做到了這一點(diǎn)砰诵,我們就可以在頁面中使用如下的布局:

// 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/中訪問該應(yīng)用程序捌显,查看它長成什么樣子茁彭。

現(xiàn)在讓我們試著在布局組件中移除 {props.children}∥辏看看應(yīng)用程序會發(fā)生什么尉间。

應(yīng)用會發(fā)生什么情況?

渲染子組件

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

布局不能呈現(xiàn)我們放入布局元素的內(nèi)容,如下所示:

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

這只是創(chuàng)建布局組件的一種方式击罪。下面是一些創(chuàng)建布局組件的方法:

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}/>)
使用組件

我們已經(jīng)提到了共享組件的兩個(gè)用例:

  1. 作為通用的Header組件哲嘲。
  2. 作為布局的

您可以使用組件來定義樣式、頁面布局和其他您喜歡的任務(wù)媳禁。另外眠副,您可以從NPM模塊中導(dǎo)入組件并使用它們。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竣稽,一起剝皮案震驚了整個(gè)濱河市囱怕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毫别,老刑警劉巖娃弓,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岛宦,居然都是意外死亡台丛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門砾肺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挽霉,“玉大人,你說我怎么就攤上這事变汪∠揽玻” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵裙盾,是天一觀的道長实胸。 經(jīng)常有香客問我他嫡,道長,這世上最難降的妖魔是什么庐完? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任涮瞻,我火速辦了婚禮,結(jié)果婚禮上假褪,老公的妹妹穿的比我還像新娘。我一直安慰自己近顷,他們只是感情好生音,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窒升,像睡著了一般缀遍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饱须,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天域醇,我揣著相機(jī)與錄音,去河邊找鬼蓉媳。 笑死譬挚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酪呻。 我是一名探鬼主播减宣,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼玩荠!你這毒婦竟也來了漆腌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阶冈,失蹤者是張志新(化名)和其女友劉穎闷尿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體女坑,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡填具,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堂飞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灌旧。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绰筛,靈堂內(nèi)的尸體忽然破棺而出枢泰,到底是詐尸還是另有隱情,我是刑警寧澤铝噩,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布衡蚂,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毛甲。R本人自食惡果不足惜年叮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玻募。 院中可真熱鬧只损,春花似錦、人聲如沸七咧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艾栋。三九已至爆存,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝗砾,已是汗流浹背先较。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悼粮,地道東北人闲勺。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像矮锈,于是被迫代替她去往敵國和親霉翔。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理苞笨,服務(wù)發(fā)現(xiàn)债朵,斷路器,智...
    卡卡羅2017閱讀 134,699評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫瀑凝、插件序芦、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,119評論 4 61
  • 從學(xué)校到公司谚中,邁出了人生最重要的一步。 踏入一個(gè)新的環(huán)境寥枝,總會覺得既興奮宪塔、又恐懼,還帶著那么一點(diǎn)不知所措囊拜。想干活又...
    饞人小博閱讀 869評論 3 11
  • 最近經(jīng)常遇到有兩個(gè)對象的大部分屬性是相同的某筐,之前是自己做的轉(zhuǎn)換,今天發(fā)現(xiàn)有對象轉(zhuǎn)換的工具類冠跷,事半功倍南誊,常用的有如下...
    不將就51y閱讀 9,207評論 1 0