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


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

2015年10月11日 星期日

ParseReact實作(二)--轉換經緯度並存在table,找出最近的十個點

現在要來利用demo做點更改,我想做一個可以輸入地址後,自動找出最靠近的十個醫院,並且顯示在google map上,首先我要先把地址轉換成經緯度,我參考了這個網站http://tutorialzine.com/2015/04/first-webapp-react/

在裡面轉換成經緯度的是用
include



進來之後,定義geocoder,我想在提交的時候觸發轉換經緯度,所以我將submit觸發的_createItem  function中加入geocoder




很好,那我要怎麼debug,console log人呢????

在chrome裡面都有一個開發人員工具,可以在檢視裡面找到



打開之後就利用console的地方來debug



程式碼的部分就是在TodoList.react.js中觸發submit的部分加入


其中text就是input的部分,也就是輸入的地址。
接下來利用



看看console log

成功!!!!!

可是我想把座標轉成geopoint存到我的parse上面。
首先我先嘗試將轉換的latlng直接存到我的parse,結果他呈現的狀態是object


{"J":25.0381495,"M":121.56429379999997}

這不是我的geopoint...........
於是我加上了

並且把這個point利用mutation function放到parse上面,

成功地把location轉成geopoint放入table中了!!!

再來我利用了parse的function--near來處理這些資料
我所有醫院的資料都在Taipei這個table裡面,所以利用query去找那些點

 出來的console log

成功!

ParseReact實作(ㄧ)--和parse連接

既然透過上一篇的介紹,我就來實作一個demo~~~
可以讓parse和react串接。
首先在Github可以找到https://github.com/ParsePlatform/ParseReact
主要程式碼在demos裡面,今天要做的是“todo”這個demo

這個demo是做一個簡易的清單表,可以增加清除修改內容,利用輸入的內容儲存到Parse的table中。


下載下來後有一些設定需要先做,
一、需要和Parse app連在一起,首先需要用Parse.initialize(appID,Javascript key)
二、include ParseReact

在app.js內放入



三、在teminal上到子目錄夾內npm install
四、npm start

結果!!!!!!!!!!terminal給了我這樣的回應


於是,我用了npm install parse
npm install parsereact
成功消除錯誤訊息了!!!!

簡單來介紹一下js內的程式結構



稍微看過React的人都會知道,最基本的就是要先的人都會知道,最基本的就是要先createClass,而 observe是ParseReact中用來Query Parse data的function,
React最重要的就是render,ParseReact也是一樣的方法喔。

好的接下來我們就把demo做個測試,打開html



key入資料,enter

成功!!!!!
我們回來Parse看一下我的table有沒有成功增加

成功!!!!!
我們就成功跟parse連起來摟~~~