今天来到第 20 天!
然後仍然是 Codecademy 学 React 系列,
今天进度是 Components,
事不宜迟,让我们马上开始吧!
昨天的文章的结尾断在初步介绍 React Components,
老实说学得满困惑的,
昨天文章提到 React 有 3 种 Component 的写法:
- 最简单的 extends React.Component 开始
- 再来是不用this的createClass
- 最後是我很少用的stateless component
我之前是直接学 stateless component 的写法,
所以现在是学 extends React.Component 的写法,
对我来说反而多好多字要打XD
例如 class MyComponentClass extends React.Component
,
ReactDOM.render
,
这些都是我之前不曾碰过的写法,
我觉得我有种我之前已经直接走到第三阶段「看山又是山」,
又突然被拉回第一阶段「看山是山」的阶段学习一样XD
但是这也是我先前提的,
网路上很多范例还是采用这个写法,
所以我不趁这个机会学的话,
之後我觉得我看到这种写法还是会下意识逃避吧XD
这边先贴程序码让大家感受一下:
import React from 'react';
import ReactDOM from 'react-dom';
class ProfilePage extends React.Component {
render() {
return (
<div>
<h1>All About Me!</h1>
<p>I like movies and blah blah blah blah blah</p>
<img src="https://content.codecademy.com/courses/React/react_photo-monkeyselfie.jpg" />
</div>
);
}
}
ReactDOM.render(
<ProfilePage />,
document.getElementById('app')
)
class ProfilePage extends React.Component
的意思就是我宣告了一个叫 ProfilePage
的 component,
所以下面用 tag 的方式 <ProfilePage />
去使用它。
如果觉得上面程序直接来一大段好像有点复杂,
那这边再简化一下让大家感受一下:
import React from 'react';
import ReactDOM from 'react-dom';
class ProfilePage extends React.Component {
render() {
return (
<h1>All About Me!</h1>
);
}
}
ReactDOM.render(
<ProfilePage />,
document.getElementById('app')
)
故意只留 <h1>
的部份,应该好看多了?
这样的话,其实上面那段就跟之前写这样(如下方这段程序码)是一样的意思:
ReactDOM.render(
<h1>All About Me!</h1>,
document.getElementById('app')
)
只是因为现在那边我们要放很多个网页元素,
不是像之前只有单一个 <h1>
或 <div>
这样,
所以才会用 component 的方式把它们包在一起。
现在假设我们想要在这页上面放一个 NavBar (导览列),
那麽首先我要先另外新增一个 NavBar.js,
在里面宣告一个 NavBar 的 class,
并在最前面加上 export。
这边先放一下档案架构,
不然只看下面可能会不知道我在讲什麽XD
在 NavBar.js key 以下程序码:
import React from 'react';
export class NavBar extends React.Component {
render() {
const pages = ['home', 'blog', 'pics', 'bio', 'art', 'shop', 'about', 'contact'];
const navLinks = pages.map(page => {
return (
<a href={'/' + page}>
{page}
</a>
)
});
return <nav><a href="/">关於我们</a><a href="/">回首页</a></nav>;
}
}
这边作用就是要先 export 这个 component,
其他地方才能 import 这个 component 使用。
再来到主要页面 ProfilePage.js 做以下三件事:
import { NavBar } from './NavBar.js';
<NavBar />
的 tagimport React from 'react';
import ReactDOM from 'react-dom';
import { NavBar } from './NavBar.js';
class ProfilePage extends React.Component {
render() {
return (
<div>
<NavBar />
<h1>All About Me!</h1>
... (略)
</div>
);
}
}
ReactDOM.render(
<ProfilePage />,
document.getElementById('app')
)
再来我们就按下 Run 来看看成果吧!
这边要说明一下,
像 NavBar 是每个页面都会有的 component,
因此把 NavBar 包装成一个 component,
之後要放导览列只要 <NavBar />
就完成了,
而且万一 NavBar 选单上面的项目需要做改变,
这时候我也只需要到 NavBar.js 去进行修改就好,
所以这是包装成 component 写法的好处~~~~~
(PS.如果没有用这个写法,
而是在每一页上面都放 NavBar 的语法,
那麽你如果网站有 10 个页面,
你只要之後 NavBar 有变动,
你就得手动改 10 次= =")
这几天都没有放程序码是因为这些在 Codecademy 上直接练习就可以了,
另外一方面是,
其实今天原本有想试着把 Codecademy 的程序放在 CodeSandbox 上,
但不知道为什麽一直有问题,
只好先这样了orz
等我有机会解决後再补放上来~~~~
原本今天还想多推 this.props
的XD
可是发现文章打完发现比想像中花时间,
所以 this.props
跟 this.state
我就留到明天好了XD
终於来到倒数 10 天!!!!!!!!!!!!
冲啊~~~~~~~~~
<<: [C 语言笔记--Day11] Makefile 的粗略笔记
>>: Day 07 JavaScript/Rails API
听听其他人对於快速面试的应对。 有被问到专案的优化方式如何,当时我答不好(冏)後来听到组员回答的很...
人的科技文明发展始终来自於人性 随着科技的进步及技术的革新,不论是哪一个场域的科技应用还是技术发展,...
前言 近年来以谷歌的 Google Assistant 、苹果的 Siri 和微软的 Cortana...
前言: 今天是铁人赛的第四天,总算要来建置开发环境了! 因为大叔我只有Windows笔电,所以开发环...
昨天我们利用Bootstrap的框架做了一个三栏的版面,而今天我们就是要利用Bootstrap不同的...