React基礎(chǔ)藤违,幫你快速學(xué)習(xí)React

簡介

學(xué)完這篇博文浪腐,你可以對React,這個著名的Facebook的庫有一定程度的理解顿乒,并能開始實踐议街。再完成后續(xù)的學(xué)習(xí)之后你可以掌握React。在正式開始以前璧榄,先了解一些相關(guān)的概念特漩。

什么是React?

React是一個Facebook開發(fā)的UI庫骨杂。使用這個庫可以很方便的開發(fā)交互式的涂身、具有表達力的和可重用的UI組件。并且這個庫已經(jīng)在facebook和instagram.com的產(chǎn)品中使用腊脱。

這個庫的另外一個獨特的賣點是:他不僅可以使用在客戶端访得,還可以用在Server端渲染。

這個庫還使用了一種叫做虛擬DOM(Virtual DOM)的概念陕凹,這些DOM可以根據(jù)狀態(tài)有選擇的渲染。這樣鳄炉,頁面就會盡量的減少DOM操作而達到保持頁面狀態(tài)的效果杜耙。

虛擬DOM是如何工作的

想象一下你根據(jù)一個人造了一個模特,這個模特幾乎有這個人的全部屬性拂盯,并且有這個人的所有當(dāng)前狀態(tài)佑女。這基本上就是React的虛擬DOM做的。

現(xiàn)在假設(shè)你對這個人形模特做了某些修改。比如团驱,加了胡子摸吠、強壯的二頭肌。在React的世界里嚎花,當(dāng)我們做了這些修改寸痢,會發(fā)生兩件事:第一、運行“對比”算法找出發(fā)生的改變紊选。第二啼止、調(diào)整,根據(jù)第一步找出的不同執(zhí)行必要的DOM操作兵罢。

React工作的方式不是把真人拿來從頭到尾的來一次“整形”献烦,而是只修改臉(帖胡子)和胳膊(二頭肌)卖词。也就是如果你在input里加了文字巩那,之后開始渲染操作里,如果input的父節(jié)點沒有開始上文第二步的“調(diào)整”操作此蜈,那么input里的文字是不會動的即横。

因為React使用的是假的DOM不是真的,這也給了React一個新的可能舶替。我們可以在Server端渲染這些假DOM令境。

現(xiàn)在開始

開始React之旅非常簡單,主要下載facebook提供的開始示例:

React入門示例

你也可以用他們提供的JSFiddle:

React JSFiddle

建立頁面

稍后使用的練習(xí)頁面需要包括react.js顾瞪、react-dom.js

<!DOCTYPE html>
<html>
    <head>
    </head>

    <body>
        <div id='mount-point'>

        </div>

        <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js"></script>

        <script type="text/babel">

        </script>
    </body>
</html>

react-dom是最近發(fā)布的React的支持庫舔庶。react-dom本來是react.js的一部分,后來作為單獨的庫發(fā)布陈醒。

在React里惕橙,一個組件就是一個元素,所以在本例中我們可以使用mount-pointdiv作為父容器钉跷。

本例只是作為入門時使用的弥鹦,在實際的開發(fā)中最好是把創(chuàng)建的組件都放在一個單獨的文件中。

基本內(nèi)容

React的基本創(chuàng)建單元叫做組件爷辙,例如:

    <script type="text/babel">
        ReactDOM.render(
            <h1>Hello, World!</h1>, 
            document.getElementById('mount-point') 
        );
    </script>

如果你從沒見過這樣的寫法彬坏,你會以為javascript/HTML又有什么新的魔法了。

JSX

其實這是JSX膝晾,是一個javascript的XML變體栓始。使用JSX可以在javascript里寫出HTML式的標簽。

在JSX里血当,HTML的class屬性寫成className幻赚,for屬性寫成htmlFor禀忆,因為class, for都是javascript的關(guān)鍵字。更多不同的內(nèi)容可以在這里看到落恼。

你也可以不使用JSX箩退,這是一個不用JSX的例子:

    ReactDOM.render(
        React.createElement('h1', null, 'Hello!'),
        document.getElementById('content')
    );

組件

使用ReactDOM的render方法的時候,第一個參數(shù)是需要渲染的我們創(chuàng)建的組件佳谦,第二個是HTML的DOM節(jié)點戴涝,組件渲染之后在這里添加。我們可以使用createClass方法創(chuàng)建組件吠昭。創(chuàng)建組件方法只需要一個對象作為參數(shù)喊括。我們來創(chuàng)建一個:

    var MyComponent = React.createClass({
        render: function(){
            return (
                <h1>Hello, world!</h1>
            );
        }
    });

組件創(chuàng)建好之后就可以在文檔里渲染出來了:

    ReactDOM.render(
        <MyComponent />,
        document.getElementById('mount-point')
    );

很酷吧!矢棚?

進階

創(chuàng)建組件的時候郑什,我們可以給組件添加一些屬性。這些屬性都存放在props蒲肋。這些屬性可以通過this.props在組件內(nèi)部訪問蘑拯,也可以在render方法渲染的時候使用。

    var MyComponent = React.createClass({
        render: function(){
            return (
                <h1>Hello, {this.props.name}!</h1>
            );
        }
    });
    
    ReactDOM.render(
        <MyComponent name="handsome" />,
        document.getElementById('mount-point')
    );

生命周期和狀態(tài)

render方法是創(chuàng)建組件的唯一方法兜粘,另外還有一些生命周期相關(guān)的方法可以使用申窘。

生命周期方法

  • componentWillMount 在渲染之前調(diào)用一次。
  • componentDidMount 在渲染之后調(diào)用一次孔轴。
  • shouldComponentUpdate 返回值決定組件是否需要update剃法。
  • componentWillUnmount 在卸載組件之前調(diào)用。

狀態(tài)(State)

在開始State之前路鹰,需要了解一些相關(guān)基礎(chǔ):

  • getInitialState返回State的初始值贷洲。
  • getDefaultProps獲取props的初始值。
  • mixins一組對象晋柱,主要用來擴展當(dāng)前組件的功能优构。

更多相關(guān)的的內(nèi)容可以看這里

每一個組件都包含一個state對象和一個props對象雁竞。State(狀態(tài))用setState方法設(shè)置钦椭。調(diào)用setState方法會觸發(fā)UI的更新,也是實現(xiàn)交互式開發(fā)的必要基礎(chǔ)碑诉。如果我們要在一開始設(shè)定初始狀態(tài)(initial state)彪腔,可以調(diào)用getInitialState方法。代碼:

    var MyComponent = React.createClass({
        getInitialState:function(){
            return {
                count: 5
            };
        },
        render: function(){
            return (
                <h1>Hello, {this.state.count}!</h1>
            );
        }
    });

事件

React包含一個跨瀏覽器的事件系統(tǒng)进栽。這些事件作為屬性包含在組件中漫仆。代碼:

    var Counter = React.createClass({
        incrementCount: function(){
            this.setState({
                count: this.state.count + 1
            });
        },
        getInitialState: function(){
            return {
                count: 0
            }
        },
        render: function(){
            return (
                <div class="my-component">
                    <h1>Count: {this.state.count}</h1>
                    <button type="button" onClick={this.incrementCount}>Increment</button>
                </div>
            );
        }
    });
    
    ReactDOM.render(
        <Counter />,
        document.getElementById('mount-point')
    );

單向數(shù)據(jù)流

在Rect里,數(shù)據(jù)通過stateprops單向流動泪幌,這和Angular的雙向流動不同盲厌。也就是說,在一個多組件結(jié)構(gòu)里祸泪,一個父組件需要負責(zé)管理狀態(tài)(state)并把數(shù)據(jù)通過props向下發(fā)放吗浩。

組件的狀態(tài)應(yīng)該用setState方法更新,這樣可以確保UI會同時刷新没隘。數(shù)據(jù)通過設(shè)置子組件的屬性來傳遞給子組件懂扼。子組件可以通過this.props來獲取這些數(shù)據(jù)。代碼:

var FilteredList = React.createClass({
    filterList: function(event){
        var updatedList = this.state.initialItems;
        updatedList = updatedList.filter(function(item){
            return item.toLowerCase().search(
            event.target.value.toLowerCase()) !== -1;
        });
        this.setState({items: updatedList});
    },
    getInitialState: function(){
        return {
            initialItems: [
                "Apples",
                "Broccoli",
                "Chicken",
                "Duck",
                "Eggs",
                "Fish",
                "Granola",
                "Hash Browns"
            ],
            items: []
        }
    },
    componentWillMount: function(){
        this.setState({items: this.state.initialItems})
    },
    render: function(){
        return (
            <div className="filter-list">
                <input type="text" placeholder="Search" onChange={this.filterList}/>
                <List items={this.state.items}/>
            </div>
        );
    }
});

var List = React.createClass({
    render: function(){
        return (
            <ul>
                {
                    this.props.items.map(function(item) {
                    return <li key={item}>{item}</li>
                })
            }
        </ul>
        )  
    }
});

ReactDOM.render(<FilteredList/>, document.getElementById('mount-point'));

結(jié)語

現(xiàn)在我們已經(jīng)把React的基礎(chǔ)都學(xué)會了右蒲,花點時間看看React APIJSX阀湿。

原文地址:https://scotch.io/tutorials/learning-react-getting-started-and-concepts

Stay tuned to my next episode

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瑰妄,隨后出現(xiàn)的幾起案子陷嘴,更是在濱河造成了極大的恐慌,老刑警劉巖间坐,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灾挨,死亡現(xiàn)場離奇詭異,居然都是意外死亡竹宋,警方通過查閱死者的電腦和手機劳澄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈七,“玉大人秒拔,你說我怎么就攤上這事§瑁” “怎么了砂缩?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狡相。 經(jīng)常有香客問我梯轻,道長,這世上最難降的妖魔是什么尽棕? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任喳挑,我火速辦了婚禮,結(jié)果婚禮上滔悉,老公的妹妹穿的比我還像新娘伊诵。我一直安慰自己,他們只是感情好回官,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布曹宴。 她就那樣靜靜地躺著,像睡著了一般歉提。 火紅的嫁衣襯著肌膚如雪笛坦。 梳的紋絲不亂的頭發(fā)上区转,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音版扩,去河邊找鬼废离。 笑死,一個胖子當(dāng)著我的面吹牛礁芦,可吹牛的內(nèi)容都是我干的蜻韭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼柿扣,長吁一口氣:“原來是場噩夢啊……” “哼肖方!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起未状,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤俯画,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娩践,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體活翩,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年翻伺,在試婚紗的時候發(fā)現(xiàn)自己被綠了材泄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吨岭,死狀恐怖拉宗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辣辫,我是刑警寧澤旦事,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站急灭,受9級特大地震影響姐浮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葬馋,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一卖鲤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畴嘶,春花似錦蛋逾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒋院,卻和暖如春亏钩,著一層夾襖步出監(jiān)牢的瞬間莲绰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工铸屉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钉蒲,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓彻坛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親踏枣。 傳聞我的和親對象是個殘疾皇子昌屉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 本筆記基于React官方文檔,當(dāng)前React版本號為15.4.0茵瀑。 1. 安裝 1.1 嘗試 開始之前可以先去co...
    Awey閱讀 7,658評論 14 128
  • 深入JSX date:20170412筆記原文其實JSX是React.createElement(componen...
    gaoer1938閱讀 8,050評論 2 35
  • 最近看了一本關(guān)于學(xué)習(xí)方法論的書间驮,強調(diào)了記筆記和堅持的重要性。這幾天也剛好在學(xué)習(xí)React马昨,所以我打算每天堅持一篇R...
    gaoer1938閱讀 1,672評論 0 5
  • GUIDS 第一章 為什么使用React竞帽? React 一個提供了用戶接口的JavaScript庫。 誕生于Fac...
    jplyue閱讀 3,525評論 1 11
  • 所有人都吃過甜甜圈鸿捧,它是一種圓形空心面包屹篓,外表特別惹人喜愛尤其受女生的喜愛〕着《小狗錢錢》一書中提到了一個有關(guān)“甜甜...
    無尾熊自成長閱讀 366評論 0 1