50
只只只 jQuery 只只只只 react js react js 只只只Justin @ 2015 Aug

只需要懂Jquery也能學react js

Embed Size (px)

Citation preview

Page 1: 只需要懂Jquery也能學react js

只要懂 jQuery也能學會 react js( react js 入門篇)Justin @ 2015 Aug

Page 3: 只需要懂Jquery也能學react js

Why react.js ?1. write once use anywhere.

learn once write anywhere

2. high performance

3. Component are the future of the web development

4. It’s awesome for SEO( 前後端都吃同一份 JSX)

5. facebook maintaining this project

Page 4: 只需要懂Jquery也能學react js

react.js 使用情境 ?

1. 寫 web 應用程式2. 寫 web component/ module

3. 寫 native app

Page 5: 只需要懂Jquery也能學react js

The bad part?

1. JSX: A working solution, but it needs more work.( 比較起來寫 angular 的 template 比較輕鬆 )

2. …( 等寫多了再補充 )

Page 6: 只需要懂Jquery也能學react js

JSX introJSX 是一種在 Javascript 中使用的 XML 語法,目的是用來轉換成原生的 Javascript 。 React 官方推薦使用。官方推薦的理由如下 :• 可以輕易的檢視整個 DOM 的結構,就跟你使用 HTML 一樣。• 方便維護修改。• 概念上非常相似于 XML 。

var Hello = React.createClass({ render: function() { return ( <div className='Hello'> Hello World! </div> ) }});

Page 7: 只需要懂Jquery也能學react js

use sublime text

<script src="http://fb.me/react-0.13.3.js"></script>

<script src="http://fb.me/JSXTransformer-0.13.3.js"></script>

<script type="text/jsx"> /** @jsx React.DOM */ /* JSX 程式碼從這邊開始寫 */</script>

直接開啟一個 html 文件來寫吧:

Page 8: 只需要懂Jquery也能學react js

description•第一個 js 是 react js 核心•第二個 JSXTransformer 顧名思義就是 jsx 轉 js 的函式庫• type=“text/jsx"• /** @jsx React.DOM */給瀏覽器看的,讓瀏覽器以 jsx 來編譯成 js

Page 9: 只需要懂Jquery也能學react js

Let’s Hello World !

1. React.createClass()

2. React.render()

用下列兩個 method 來寫吧!

註: react v0.13 以前用的是 React.renderComponent()

寫 Hello World 之前,有些事情必須先知道。透過 React.JS 寫網頁時,我們並不會直接寫 HTML Tag ,而是寫 React Component

Page 10: 只需要懂Jquery也能學react js

React.creatClass()

var Hello = React.createClass({render: function() {

return(<h1>Hello World!</h1>);}});

•寫 react component 宣告變數用大寫的開頭

Page 11: 只需要懂Jquery也能學react js

React.render()

React.render(<Hello />,document.getElementById(‘containe

r’));

•用 render() 顯示元件• 第三行是元件在 html 的 parent也可以用 document.body

Page 12: 只需要懂Jquery也能學react js

Online Editor - JSBin

1. http://jsbin.com/panuyu/edit?html,js,output

• javascript 的分頁下拉選單選擇” JSX(React)” 就可以編輯 JSX

Page 13: 只需要懂Jquery也能學react js

Online Editor - jsfiddle

1. https://jsfiddle.net/reactjs/69z2wepo/

JSFiddle 官方 twitter 提供支援 react.js

Page 14: 只需要懂Jquery也能學react js

jsx 保留字•class 需要轉為 className• for 需要轉為 htmlFor

var Hello = React.createClass({render: function() {

return(<h1 className=“hello”>Hello World!</h1>);

}});

Page 15: 只需要懂Jquery也能學react js

Overview:We’re going to Build a “Tweet Box”

• 1 個 textarea 上限 140 個字• 1 個 Tweet Button • 按下 “ Add photo” 按鈕會再減少 23 個字元• 使用 bootstrap 樣式

Page 16: 只需要懂Jquery也能學react js

Thinking…. use jQuery

Page 17: 只需要懂Jquery也能學react js

Thinking…. use jQuery

• 建立 UI : button, textarea• button 初始化時設為 disable• textarea 綁定 event : 1. 計算輸入的字串長度 2. 收到 event 把 button disable 設為 false• 按下 “ Add photo” 按鈕會再減少 23 個字元

Page 18: 只需要懂Jquery也能學react js

Build - UI

step 1. 先建立 <button>

step 2. 加入 library 最新版本的 bootstrap

step 3. Add classes on <button>btn btn-primary

<button class=“btn btn-primary”>button</button>

Page 19: 只需要懂Jquery也能學react js

Build - UI

button 已經加入了 bootstrap 樣式<div class="well clearfix"> <textarea class="form-control"></textarea><br/> <button class="btn btn-primary pull-right">Tweet</button></div>

修改 html 如上面的程式碼 , 建立 tweet box 的 layout

Page 20: 只需要懂Jquery也能學react js

Build - UI

W e’re done! 以上步驟無關 react !但是會使我們的 UI 更好看

http://jsbin.com/jofivi/1/edit?html,output

Page 21: 只需要懂Jquery也能學react js

implement - 按鈕初始化 disable

$("button").prop("disabled", true);

Page 22: 只需要懂Jquery也能學react js

jQuery - 按鈕初始化 disable

$("textarea").on("input", function() { if ($(this).val().length > 0) { $("button").prop("disabled", false); } else { $("button").prop("disabled", true); }});

字數大於 0 時 , disabled 設為 false反之為 true

jQuery: http://jsbin.com/wewimu/2/edit?js,output

Page 23: 只需要懂Jquery也能學react js

Thinking…. use React

Page 24: 只需要懂Jquery也能學react js

Thinking…. use React

1. React.createClass()

2. React.render()

用下列兩個 method 來寫元件吧!

Page 25: 只需要懂Jquery也能學react js

Live Coding - 建立元件

樣板: jsbin.com/jofivi/1/edit?html,output完成: jsbin.com/curuzo/11/edit?js,output

Page 26: 只需要懂Jquery也能學react js

React 的寫作要點

• 使用 className 取代 class• <br> 需要改為有斜線結尾 <br />• 發現 output 畫面空白的畫面需要仔細檢查程式碼有沒有錯誤

Page 27: 只需要懂Jquery也能學react js

實作 - 按鈕初始化 disable

jQuery: $("button").prop("disabled", true);

React:render: function() { return ( ... <button className="..." disabled>Tweet</button> ... );}

Page 28: 只需要懂Jquery也能學react js

實作 - handle event

jQuery:$("textarea").on("input", function() { ...}

React: React.createClass({ handleChange: function(event) { }, render: function() { ... }});

react 裡面提供自訂 method 這裏我們寫作 handleChange()

Page 29: 只需要懂Jquery也能學react js

實作 - handle eventReact: <textarea className="form-control"

onChange={this.handleChange}></textarea>

我們在 render function 裡面<textarea> 多一個屬性 onChange 來傳遞事件

handleChange: function(event) { console.log(event.target.value);},

React:

我們把 log 印出來

Page 30: 只需要懂Jquery也能學react js

實作 - 狀態改變

在 react 我們不會直接去變更 dom我們改變 “ state” 讓 react 自己更新 這個方法叫做 this.setState()

Page 31: 只需要懂Jquery也能學react js

實作 - 狀態改變

每當 state 更新的時候render() 會被 call 一次你可以在 render() 裡面拿到 state

Page 32: 只需要懂Jquery也能學react js

實作 - 狀態改變這裏介紹特殊的方法叫做 getInitialState

var TweetBox = React.createClass({ getInitialState: function() { return { text: "" }; }, handleChange: ... render: ...});

他會回傳一個 js object ,我們把物件成員們初始狀態寫在這裡

Page 33: 只需要懂Jquery也能學react js

實作 - 狀態改變接著 , 我們來修改 event handler

handleChange: function(event) { this.setState({ text: event.target.value });},

我們透過 setState 這個方法並且傳入一個要更新的 key-value

<br/>{this.state.text}

我們在 render function 加入一段測試 code 把結果印出來

Page 34: 只需要懂Jquery也能學react js

實作 - Enable/Disable Button

<button className="btn btn-primary pull-right" disabled={this.state.text.length === 0}>Tweet</button>

結果: <button className="btn btn-primary pull-right" disabled={true}>Tweet</button>

所以我們可以這麼改 , 加入判斷式

<button className="btn btn-primary pull-right" disabled={false}>Tweet</button> 結果:

Page 35: 只需要懂Jquery也能學react js

Live Coding - 事件觸發 , button

樣板: jsbin.com/curuzo/edit?js,output完成: jsbin.com/curuzo/11/edit?js,output

Page 36: 只需要懂Jquery也能學react js

實作 - 剩餘字數計算

Page 37: 只需要懂Jquery也能學react js

實作 - 剩餘字數計算 (jQuery)

<textarea ...></textarea><br><span>140</span><button ...>Tweet</button>

我們先在 view 上面增加這一段 (黑色粗體 )

如果是 jQuery 的做法 ....

$("textarea").on("input", function() { $("span").text(140 - $(this).val().length); ...});

Page 38: 只需要懂Jquery也能學react js

實作 - 剩餘字數計算 (React)如果是 React 的做法 ....

<span>{ 140 - this.state.text.length} </span>

我們只要在 render() 裡面修改

不必更新 getInitialState() 或 handleChange()

記得把 <br> 改成 </br> 避免出錯

Page 39: 只需要懂Jquery也能學react js

實作 - 加入照片按鈕

140-117 = 23

1. 建立” Add Photo” button2. button 是一個可以切換 on/off 狀態3. 如果是 on 將會再減去 23 個字元4. 當然如果是 on, 就算沒輸入文字 Tweet Buton 會是 enable 的狀態JQuery example: http://jsbin.com/xupice/2/edit

Page 40: 只需要懂Jquery也能學react js

實作 - 加入照片按鈕 (jQuery)

...<button class="js-tweet-button btn btn-primary pull-right" disabled>Tweet</button><button class="js-add-photo-button btn btn-default pull-right">Add Photo</button>...

我們先在 view 上面增加這一段一個 class=“js-tweet-button ” 一個 class=“js-add-photo-button"

$("textarea").on("input", function() { $("span").text(140 - $(this).val().length);

if ($(this).val().length > 0) { $(".js-tweet-button").prop("disabled", false); } else { $(".js-tweet-button").prop("disabled", true); }});

然後改寫 jQuery

原先:$("button")

Page 41: 只需要懂Jquery也能學react js

實作 - 加入照片按鈕 (jQuery)$("textarea").on("input", function() { ...});

$(".js-add-photo-button").on("click", function() { if ($(this).hasClass("is-on")) { $(this) .removeClass("is-on") .text("Add Photo"); } else { $(this) .addClass("is-on") .text("✓ Photo Added"); }});

加入 photo 這一段 jQuery

jQuery 的部分我們用” is-on”這個 class 當作 flag 判斷是否被按下

Page 42: 只需要懂Jquery也能學react js

實作 - 加入照片按鈕 (jQuery)$("textarea").on("input", function() { if ($(".js-add-photo-button").hasClass("is-on")) { $("span").text(140 - 23 - $(this).val().length); } else { $("span").text(140 - $(this).val().length); }

if (...) { ...});

接著我們要改判斷字數的部分“ is-on” 的狀態下需要多扣掉 23 個字元

Page 43: 只需要懂Jquery也能學react js

實作 - 加入照片按鈕 (jQuery)$(".js-add-photo-button").on("click", function() { if ($(this).hasClass("is-on")) { ... if ($("textarea").val().length === 0) { $(".js-tweet-button").prop("disabled", true); } } else { ... $(".js-tweet-button").prop("disabled", false); }});

最後還要加入判斷: Add-photo button“is-on” 的狀態下假如 textarea 是沒有輸入字元的Tweet button 是 enable 的狀態

Page 44: 只需要懂Jquery也能學react js

所以其實 jQuery 也是會帶來一些困擾回顧一下先前提到的這張圖 :

如果只有單純一個 event handle一個 dom 是非常簡單的

如果有多個 event handler要改變多個 dom 那 code 會非常的醜

Page 45: 只需要懂Jquery也能學react js

實作 - 加入照片按鈕 (React)

<button ...>Tweet</button><button className="btn btn-default pull-right">Add Photo</button>

我們來修改 JSX

在 state 增加一個變數: photoAdd

更新 render() or

增加 addPhoto 的 clicke event handler()

Page 46: 只需要懂Jquery也能學react js

實作 - 加入照片按鈕 (React)

<button className="btn btn-default pull-right"> {this.state.photoAdded ? "✓ Photo Added" : "Add Photo" }</button>

getInitialState: function() { return { text: "", photoAdded: false };},

修改 getInitialState

我們來修改 JSX photoAdded 的狀態

Page 47: 只需要懂Jquery也能學react js

實作 - 加入照片按鈕 (React)

<button className="btn btn-default pull-right" onClick={this.togglePhoto}> {this.state.photoAdded ? "✓ Photo Added" : "Add Photo" }</button>

增加 click event handler()

togglePhoto: function(event) { this.setState({ photoAdded: !this.state.photoAdded });},

click 後反轉 this.state.photoAdded 的變數

Page 48: 只需要懂Jquery也能學react js

實作 - 加入照片按鈕 (React)

<span>{140 - this.state.text.length}</span>剩餘字數的部分

<span>{ this.remainingCharacters() }</span>

我們改用一個 function 來改寫 , 讓他好閱讀一點

remainingCharacters: function() { if (this.state.photoAdded) { return 140 - 23 - this.state.text.length; } else { return 140 - this.state.text.length; }},

Page 49: 只需要懂Jquery也能學react js

We’re done

樣板: jsbin.com/curuzo/10/edit?js,output完成: jsbin.com/ratobilaju/2/edit?js,output

Page 50: 只需要懂Jquery也能學react js

jQuery V.S ReactjQuery: 初期怎麼寫都很快 , 後期不易維護React : 初期寫元件很麻煩 , 後期很容易維護