React
React
建議react 和react-dom相同版本才比較不會有問 https://github.com/facebook/react/issues/8588#issuecomment-267596448
如果使用
create-react-app,如果套件在index.html引入須在使用套件時加上window
基礎
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://fb.me/react-15.0.0.js"></script>
<script src="https://fb.me/react-dom-15.0.0.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-
core/5.8.34/browser.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
</script>
</body>
</html>使用ES6
其他方法之簡單整理
更多有關ES5 react to ES6 or ES7 http://cheng.logdown.com/posts/2015/09/29/converting-es5-react-to-es6
有關class用法 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
http://es6.ruanyifeng.com/#docs/class
https://gist.github.com/sebmarkbage/d7bce729f38730399d28
開始使用React
建立環境
npm install webpack -g
npm install nodemon -g (在更改程式時自動執行server,而forever為遇到錯誤也不會停止)
1.裡面放入package.json
之後輸入npm install
在根目錄下新建三個目錄
2.接著在server目錄下新增server.js
3.在client資料夾內加入index.html
4.新增webpack 配置文件webpack.config.js
什麼是source map
可以看chrome dev tool 裡的setting即有此選項 http://www.ruanyifeng.com/blog/2013/01/javascript_source_map.html
5.在client資料夾中新增client.js
<App/>即為我們的react元件
6.在components資料夾中新增App.js
此即為我們第一個react元件
輸入webpack --config webpack.config.js
會自動產生dist資料夾,裡面包含bundle.js檔案
之後即可重新啟動伺服器,並觀看改變
npm run serve(寫在package.json中的scripts內)
讓我們不用重新整理網頁
在package.json內加入
1.不用重新整理網頁 (讓我們不用使用webpack-dev-server也有-hot的指令)
2.讓hot middleware知道react的class
以及上webpack跑在我們架設的express server上
完整版
npm install後
接著更改剛才server資料夾下的 server.js
現在我們可以直接用server.js去compile 我們的webpack config檔案,不用再輸入指令compile
最後因為我們剛才有用hot middle所以我們可以使用--hot去讓他自動reload網頁,但我們不想在指令輸入,所以可以把他加在webpack config內
webpack.config.js
現在執行
npm run serve
再去更改app.js內的字,可以看到不用重新啟動伺服器,也不用按網頁的重新整理,即可更新
第二階段
開始新增其他react元件
在components下,新增一個檔案
TextDisplay.js
上面是引用react後建造一個空的class後將他輸出
接著我們要在class內寫入東西
使著將最外層的div刪掉,會出現錯誤,因為一個元件要有東西包住最外層。
之後讓原來的App.js引用他
使用state
TextDisplay.js
!!記得重新整理網頁,才會作用(因為這裡是constructor)
為元件加入方法
在class中的方法如果有this的話他會不知道this是什麼,所以要在class 的constructor中把該方法綁進來
1.
但後來發現如果想傳入參數還是要在html tag中寫bind才會傳入
2.所以另一種寫法,是直接在DOM 的onchange中綁,但官方推薦綁在constructor
接著在render上面寫
3.第三種寫法(ES6的箭頭函數,最方便,因為會直接幫你綁定)
如要傳入事件,記得兩邊()都要傳入
好處是不用再用bind
參考:http://egorsmirnov.me/2015/08/16/react-and-es6-part3.html
!每次改動constructor記得都要重新整理,就算有用Hot reload
完整範例:
注意其中的onclick 與 從子元件傳上來的 onclick
container
component
2.在class內所有的this都是指到那個class
所以要取得onchange時input內的value必須用e.target ,因為這裡不是DOM
Prop
即為HTML tag中的屬性
1.新增一個元件為Propest.js
TextDisplay.js
即可看到Proptest的props顯示出
2.讓子代的view啟動父代的method
Proptest.js
TestDisplay.js
進階(點擊button更改state)
在元件內使用條件判斷
使用AJAX
1.先在server.js加上app.post的路徑
2.
使用React router
clone後到branch master開始進行
npm install react-router
之後開啟client.js
改為下面,看是否仍正常啟動
再改為下面看看
到路徑http://localhost:3000/#/about
即可看到,元件的切換
(發現頁面切換元件很快速,我們以前要做到這樣必須用AJAX,或模板引擎內的動態compile(一樣是AJAX加載), 但React沒用到ajax,完全都在client端計算更改的virtual DOM後更新到DOM上)
接著可到webpack那章,加上commonchunk plugin,加速我們每次網頁重新整理的速度
如何寫style
個人習慣方式為:
1.創一個style資料夾
2.每個component有對應名稱的css檔案
3.之後全部@import到index.css內
4.於server設定app.use(express.static('./style'));
5.引入到index.html
加上Bootstrap
雖然有react-bootstrap,但我們也可用原本的方式
在client.js加上
之後在用這個轉換網站轉換後貼上即可,記得外面要包著div
http://facebook.github.io/react/html-jsx.html
選取元素
在元素內放入下面的property
ref={(c) => this._input = c}
再用this._input即可選定該元素
或是
<input ref="myInput" />
Style React
一般寫法:
把style放在物件裡面
使用其他庫
1.Radium
http://stack.formidable.com/radium/
2.Material-ui
npm install material-ui
都是個別引入
http://www.material-ui.com/#/customization/inline-styles
PS:如果使用click相關的元件沒反應的話
npm install react-tap-event-plugin
參考:https://github.com/callemall/material-ui#react-tap-event-plugin
Material UI 現在0.15後需如下使用
1.加入Mui 的context
2.injectTapEventPlugin();
使用server side rendering with Material UI
一樣加入context和injectTapEventPlugin
React toggle style
如何在點擊時切換style呢
1
假設如上範例,可以先寫出,一個className的名稱的決定是由其於父組件上的prop決定
之後其父組件使用state來設定其他子組件的prop
所以點擊時會觸發下面這個函式
在render方法內使用js新增component
ex:
在這裡addth可以是兩種寫法
1.一個是直接return出完整的dom element
2.或是把每個dom element放入array中
第二種方法即是常見的使用map放入的技巧
findDOMNode
之前版本的getDOMNode已經拿掉
可如下使用findDOMNode
Server side rendering(使用Express)
參考此repo
https://github.com/EasonWang01/React-router-Redux-isomorphic-Boilerplate
Stateless component
相對於使用class,使用 const = function 的方式會提升效能
但其不可使用lifecycle跟state,ref
需要props傳入
使用ref需於parent的class用div寫上ref在於其內引入stateless component ,之後再用this.refs.cir1.children[0]方式取得子節點
範例:
#有關dangersetInnerHTML
dangerouslySetInnerHTML={{__html: }}
類似上面格式,但記得,其雖然可直接接受html tag傳入或是special char但是如果是 html tag 的special char只會轉為html tag的字串型態,如果想要他從special char直接轉為dom必須先另外寫decode function
ex:
之後再用
Isomophic注意事項
因為client的code會在server也跑一次
所以如果需要用到css要如下寫,注意不可用import因為會出現impoort必須在top的錯誤
<input /> 裡面的defaultValue如不顯示時 在屬性加個跟著value變動的key即可
Refs
Last updated
Was this helpful?