2015年10月18日 星期日

React tutorial 中文版

看完React.js的官方tutorial之後,我只有一句話想問:到底寫這麼抽象是給誰看......
這種東西不是應該要有圖嗎!!!!誰接誰哪裡看得懂啊,於是乎我決定狠下心來用我的破英文假裝翻譯一個新的中文官方網站,然後寄給官方哈哈哈
首先在這篇tutorial中我們會學到三個大方向
ㄧ、留言板的view
二、提交留言的表單
三、動態的資料更新
先來下載官方的react-tutorial



我們要先架一個假server,用terminal到根目錄之後用
即可在 http://localhost:3000/ 看見成功的demo。
在這裡我有一個笨問題,為啥是port3000?主管大大說每個port都有定義過的傳輸型態,由你傳輸的內容來決定你是哪個port,像FTP(File Transform Protocol )就是固定21port,3000屬於自己可以定義的範圍,可以讓code在上面跑。

接下來HTML中該include的就include

設定都好了之後重頭戲來了
先稍微講解一下此project的結構


我來畫個圖解釋一下我們所看見的view的樣子


建立第一個Component---CommentBox,利用最基本的<div>


!!!注意!!!在react.js中,以小寫開頭的tag是html中本來就存在的tag(像是<div>,<span>,<p>.....)而以大寫開頭的則是我們自己建立的tag(像是<CommentBox />)
可以自己建標籤?這是什麼?這就是XML的架構啊。所以將JavaScript配上XML,成為了JSX。
很多人都說看不懂JSX是什麼,我這麼菜更是看不懂了......
不用擔心,其實上面的程式碼經過babel的翻譯會變成
原來標籤的部分其實就是createElement而已,經由呼叫render來return資料。
我們剛剛經由React.createClass()來建立一個新的React components,而最重要的是一定要呼叫render,他才會回傳React components的樹狀結構,最後render給HTML。
<div>在DOM中並不是一個真實的節點,只是屬於React中的<div> Component,由於不是真實節點,React可以避免XSS的竄改攻擊。

什麼是XSS?

 會建立Component之後,我們要學著如何把他們組起來。
在同個js中加入CommentList 和 CommentForm

然後把原來的CommentBox寫死的內容改掉,變成render  CommentList 和 CommentForm這兩個Component


關係就是


最後的ReactDOM.render,我們就只需要render CommentBox這個Component就好了。ReactDOM.render具有container的概念,他會去看container中哪些element有改變,只需重新render更改的element,所以一定要放最後面,才能看到所有element。

接下來要談的是props屬性,在一個Component中可以存在多種屬性,例如CommentList會有發表者、內容、時間等等.....prop屬性可以繼承父母親的屬性,並且用prop來接收父母親的資料,例如this.props就是拿來接收父母親Component中的某種屬性的內容。




我們可以利用 {this.props.author} 來接收到CommentList中餵給Comment的屬性,{this.props.author} 就是接收author這個屬性的內容,那其他nested的內容(例如text)就是{this.props.children}。

Adding Markdown的部分只是為了防止xss的入侵,這部分就不多加撰述。

資料指定成功之後,我們再進一步,改成讀入一個可變動的JSON File。

第一步我們要先在CommentBox的render中先定義好接收的資料的名字,所以我們可以看到,<CommentBox data={data} />表示{data}是讀入的json file,然後把讀入的資料指給在CommentBox中的data。如此一來,CommentBox的小孩就可以用{this .prop.data}去接收。

第二步,在上述程式碼中,CommentList data接收到的資料傳入CommentList之後,利用 this.props.data.map(其實這就類似於for each)的概念,可以把每個Comment中的元素都讀出來,再把傳回來的東西指給他的小孩--comment,並且把所有讀出來的都集中在 commentNodes這個集合變數中。



資料流向圖說明




到目前為止,我們看到了很多prop,那prop的特性是取決於爸爸,對於接收的小孩來說,那是不能更改的(immutable)。所以我們要介紹另外一個--state,可以透過this.setState()區呼叫,這是屬於component自己的狀態,不屬於他的父親,是可以做更改的。

要利用state有兩個步驟
第一:我們要先initial state
第二:再將要傳送的data={this.state.data}

其實只被比原來的props多了一個initial的動作。


接下來是動態讀入的部分,這個時候就要提到MVC的觀念,我們來複習一下




對我們來說,先前讀入的JSON File就是Model,利用擷取的新資料來更新view,而接收action去處理data的就是Controller,等等我們會介紹那些接受action的function,Render就是呈現view,屬於React.js負責的部分。

現在假裝我們給了一個server,

利用ajax去讀入server給的東西,componentDidMount是一個React的function,當component重新render的時候會被呼叫,所以當動態讀入時會一直呼叫這個function,要把動態讀入的程式碼都放在裡面。重點是!!!!!用this.setState()就可以更改component自己所屬的state,呼應了前面說的,props無法改變的特點。

tutorial真的寫得很麻煩(哈哈哈哈偷罵),他又把ajax動態讀入的程式碼獨立出來,定義為loadCommentsFromServer,再在componentDidMount呼叫他,其他部分都一樣喔,ReactDOM.render還是只render CommentBox。



最後,資料流向都確定好了之後,就是要建立輸入表格的時候,這部分是CommentForm負責,最基本的就是先建立html的input


可是我們要做的是有互動的表格,什麼叫有互動?就是在使用者輸入完之後我們要清除表單內的東西,並且提交內容給我們的server,我們把互動的功能寫進handleSubmit的function中。



為什麼又出現了一個新的----this.ref!!!!!
ref存在的意義是,指定一個名字給child,而this.ref就是可以透過它,指向內部的元件,有點像在DOM裡面id的意思。

最後一步就是新增comment了,要如何新增comment到我們的server呢?
我們要先在CommentBox中定義一個 handleCommentSubmit  function是和server溝通這部分的事情,因為只有CommentBox是和server溝通的,任何關於server的事情都要從他開始。




資料從 CommentForm 繼承下來,用this.props接收onCommentSubmit給他的資料


然後再用ajax和server溝通



回呼順序為


以MVC的角度來看這個例子,被觸發的function,也就是handleSubmit(),就是Controller


完成了~~~~~
我真的很菜所以如果有啥不好的地方請一定要告訴我喔!!!我不想害到別人!!!

3 則留言:

  1. 寫得很好哦~^^
    受益良多

    回覆刪除
  2. 他官網寫的教學真的看不太懂@@

    回覆刪除
  3. 寫的清楚明瞭,有把一些觀念幫我釐清,非常感謝!

    回覆刪除