React 入門教程記錄

前言:

React 的入門教程官方網(wǎng)站上面寫的非常好(語言是英語):
https://reactjs.org/docs/forms.html
中文的官方教程:
https://www.reactjscn.com/docs/components-and-props.html
國內(nèi)的個(gè)人教程則屬 阮一峰 React 入門實(shí)例教程
(有些例子過時(shí)了,但github demo近期有修正code), 致敬:
http://www.ruanyifeng.com/blog/2015/03/react.html

出于學(xué)習(xí)的目的,本人對這些例子做了一一更新。
demo地址:
https://github.com/skyofwinter/react_demo
github 文檔傳送門:
readme.md

首先可選擇下載到本地磁盤 或者 本地新建html 復(fù)制文件里的內(nèi)容

$ git clone git@github.com:skyofwinter/react_demo.git

然后在瀏覽器上面運(yùn)行查看

安裝:

有2種免安裝辦法悬荣,如果不想下載任何東西,可以直接用第一種做法進(jìn)行教程學(xué)習(xí)

  1. 本文為了簡易起見赊瞬,使用了CDN作為src來源, 真正免安裝(官方建議 加上crossorigin)

<script src="https://cdn.bootcss.com/react/15.4.2/react.min.js"></script>

<script src="https://cdn.bootcss.com/react/15.4.2/react-dom.min.js"></script>

<script src="https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js"></script>

react 官方cdn links介紹

https://reactjs.org/docs/cdn-links.html

2.當(dāng)然也可以直接使用下載好的js文件

<script src="../build/react.js"></script>
<script src="../build/react-dom.js"></script>
<script src="../build/browser.min.js"></script>

一. Hello word 入門

HTML 模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!--/*1. 選擇使用CDN*/-->
    <script src="https://cdn.bootcss.com/react/15.4.2/react.min.js"></script>
    <script src="https://cdn.bootcss.com/react/15.4.2/react-dom.min.js"></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js"></script>

    <title>React 學(xué)習(xí)</title>
</head>
<body>
<div id="dd">

</div>
    <script type="text/babel">
        //** your code !!!
    </script>

</body>
</html>

<script> 標(biāo)簽的 type 屬性為 text/babel . 這是 React 的 JSX 語法, 跟 js不一樣. 代碼用了三個(gè)庫: react.js 、react-dom.js 和 babel.min.js(Browser.js) , babel的瀏覽器版本為browser.js(未精簡)和browser.min.js(已精簡)

code:

ReactDOM.render(
  <h1>Hello, world!</h1>,
  document.getElementById('dd')
);

上面代碼將一個(gè) h1 標(biāo)題贼涩,插入 body的div(“dd”) 節(jié)點(diǎn)

運(yùn)行結(jié)果:


二. JSX語法

Reac使用JSX,來簡化React元素的創(chuàng)建,其語法風(fēng)格類似于HTML語法風(fēng)格. 對比如下代碼巧涧。

    <script type="text/babel">
        const names = ['Alice', 'Emily', 'Kate'];
        const items = names.map((name) =>
                <div>hello,{name}!</div>
        );

        ReactDOM.render(
            <h4>{items}</h4>,
            document.getElementById("dd")
        );
    </script>

JSX本身就和XML語法類似,可以定義屬性以及子元素磁携。唯一特殊的是可以用大括號來加入JavaScript表達(dá)式褒侧。遇到 HTML 標(biāo)簽(以 < 開頭),就用 HTML 規(guī)則解析谊迄;遇到代碼塊(以 { 開頭)闷供,就用 JavaScript 規(guī)則解析.

React 元素其實(shí)就是一個(gè)簡單JavaScript對象,一個(gè)React 元素和界面上的一部分DOM對應(yīng)统诺,描述了這部分DOM的結(jié)構(gòu)及渲染效果歪脏。一般我們通過JSX語法創(chuàng)建React 元素,例如:

    const element = <h1 className='hello'>Hello, world</h1>;

element是一個(gè)React 元素. 在編譯環(huán)節(jié)粮呢,JSX 語法會被編譯成對React.createElement()的調(diào)用婿失,從這個(gè)函數(shù)名上也可以看出,JSX語法返回的是一個(gè)React 元素啄寡。上面的例子編譯后的結(jié)果為:

    const element1 = React.createElement(
        'h1',
        {className: 'hello'},
        'Hello, world!'
    );

等價(jià)于JavaScript

const element = {
    const element2 = {
        type: 'h1',
        props: {
            className: 'hello',
            children: 'Hello, world'
        }
    }

二. 組件

React組件最核心的作用是返回React元素, 組件分兩種 函數(shù)組件(Functional Component )和類組件(Class Component)

函數(shù)組件
        function HelloMessage(props) {
            return <h1>Hello {props.name}</h1>;
        };
類組件
        function NotesList(props) {
                return(
                    <ol>
                        {
                            React.Children.map(props.children, function (child) {
                                return <li>{child}</li>;
                            })
                        }
                    </ol>
                );
        };

也有基于組件內(nèi)部是否維護(hù)state作為分法.
本著盡可能使用函數(shù)組件減少開銷的原則, 沒有state則寫為函數(shù)組件, 這樣話基于state分法必要性就很弱了.

三. 再講state

props 是組件外部傳入的豪硅,state 是組件內(nèi)部維護(hù)的(需要跟變化掛鉤), 同樣對于 state的使用也是有個(gè)盡量不用的一般通用原則.
1.能用 prop外部傳入或者計(jì)算得到的,不要用state
2.組件的生命周期內(nèi)不變的, 沒必要用state
3.跟React元素?zé)o關(guān)的, 用普通變量, 不要用state
4.能減少state 數(shù)量的, 就提取等減少數(shù)量

對于state的更新上, 修改時(shí)候必須使用 setState(), 直接修改this.state,組件不會重新render.

建議把state當(dāng)作不可變對象挺物,需要改變值得時(shí)候, 重新 set一個(gè)新的對象給組件( 也就是set的時(shí)候 需要是一個(gè)新對象)

state使用注意事項(xiàng):
1.構(gòu)造函數(shù)是唯一能夠初始化 this.state 的地方;不要直接更新狀態(tài), 這樣不會重新渲染組件.

// Wrong
this.state.comment = 'Hello';
// Correct
this.setState({comment: 'Hello'});

2.狀態(tài)更新可能是異步的, React 可以將多個(gè)setState() 調(diào)用合并成一個(gè)調(diào)用來提高性能懒浮。
3.狀態(tài)更新合并, 當(dāng)你調(diào)用 setState() 時(shí),React 將你提供的對象合并到當(dāng)前狀態(tài)识藤。

因?yàn)?this.props 和 this.state 可能是異步更新的砚著,你不應(yīng)該依靠它們的值來計(jì)算下一個(gè)狀態(tài)。

       class LikeButton extends React.Component{
            constructor(){
                super();
                this.state = {liked : false};
                this.handleClick = this.handleClick.bind(this);
            }

            handleClick(){
                this.setState(prevState => ({
                    liked:!prevState.liked
                }));
                console.log("liked " + this.state.liked)

            }

            render(){
                var text = this.state.liked? ' like ':' don\'t like ';
                return (
                    <div>
                        <button onClick={this.handleClick}>you {text} it, click to change it!</button>
                    </div>
                )
            };
        }

other

組件生命周期hook:

  • componentWillMount(): Fired once, before initial rendering occurs. Good place to wire-up message listeners. this.setState doesn't work here.
  • componentDidMount(): Fired once, after initial rendering occurs. Can use this.getDOMNode().
  • componentWillUpdate(object nextProps, object nextState): Fired after the component's updates are made to the DOM. Can use this.getDOMNode() for updates.
  • componentDidUpdate(object prevProps, object prevState): Invoked immediately after the component's updates are flushed to the DOM. This method is not called for the initial render. Use this as an opportunity to operate on the DOM when the component has been updated.
  • componentWillUnmount(): Fired immediately before a component is unmounted from the DOM. Good place to remove message listeners or general clean up.
  • componentWillReceiveProps(object nextProps): Fired when a component is receiving new props. You might want to this.setState depending on the props.
  • shouldComponentUpdate(object nextProps, object nextState): Fired before rendering when new props or state are received. return false if you know an update isn't needed.

事件綁定:

必須謹(jǐn)慎對待 JSX 回調(diào)函數(shù)中的 this痴昧,類的方法默認(rèn)是不會綁定 this 的稽穆。如果你忘記綁定 this.handleClick 并把它傳入 onClick, 當(dāng)你調(diào)用這個(gè)函數(shù)的時(shí)候 this 的值會是 undefined

這并不是 React 的特殊行為赶撰;它是函數(shù)如何在 JavaScript 中運(yùn)行的一部分舌镶。通常情況下柱彻,如果你沒有在方法后面添加 () ,例如 onClick={this.handleClick}乎折,你應(yīng)該為這個(gè)方法綁定 this绒疗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侵歇,一起剝皮案震驚了整個(gè)濱河市骂澄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惕虑,老刑警劉巖坟冲,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溃蔫,居然都是意外死亡健提,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門伟叛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來私痹,“玉大人,你說我怎么就攤上這事统刮∥勺瘢” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵侥蒙,是天一觀的道長暗膜。 經(jīng)常有香客問我,道長鞭衩,這世上最難降的妖魔是什么学搜? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮论衍,結(jié)果婚禮上瑞佩,老公的妹妹穿的比我還像新娘。我一直安慰自己坯台,他們只是感情好炬丸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捂人,像睡著了一般御雕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滥搭,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天酸纲,我揣著相機(jī)與錄音,去河邊找鬼瑟匆。 笑死闽坡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疾嗅,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼外厂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了代承?” 一聲冷哼從身側(cè)響起汁蝶,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎论悴,沒想到半個(gè)月后掖棉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膀估,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年幔亥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片察纯。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帕棉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饼记,到底是詐尸還是另有隱情香伴,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布握恳,位于F島的核電站瞒窒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乡洼。R本人自食惡果不足惜崇裁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望束昵。 院中可真熱鬧拔稳,春花似錦、人聲如沸锹雏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽礁遵。三九已至轻绞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佣耐,已是汗流浹背政勃。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兼砖,地道東北人奸远。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓既棺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親懒叛。 傳聞我的和親對象是個(gè)殘疾皇子丸冕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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

  • 個(gè)人筆記, 轉(zhuǎn)載請注明轉(zhuǎn)載自 szhshp的第三邊境研究所 Refs and the DOM In the t...
    szhielelp閱讀 1,474評論 0 1
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中。 1. Hello world 這段代碼將一個(gè)一級標(biāo)題插入到指...
    ryanho84閱讀 6,235評論 0 9
  • 3. JSX JSX是對JavaScript語言的一個(gè)擴(kuò)展語法薛窥, 用于生產(chǎn)React“元素”胖烛,建議在描述UI的時(shí)候...
    pixels閱讀 2,827評論 0 24
  • 本筆記基于React官方文檔,當(dāng)前React版本號為15.4.0拆檬。 1. 安裝 1.1 嘗試 開始之前可以先去co...
    Awey閱讀 7,706評論 14 128
  • 沒有人天生就擅長說話和演講竟贯,大家都有緊張、膽怯的時(shí)候逝钥。 你覺得為什么說話/演講前會緊張屑那、膽怯呢? 對環(huán)境不熟悉艘款?第...
    一只雞蛋Growing閱讀 724評論 0 1