SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
2015-9-13 KC3 2015 勉強会

OUCC担当

はるさめ (@spring_raining)
React.jsでクライアントサイドな
Webアプリ入門
こんにちは
2
わたしはだれ
• はるさめ @spring_raining
• 大阪大学 3年生(2回目)
• スペースが余ったので以下おすすめのアニメです
3
https://github.com/facebook/react/wiki/Sites-Using-React
1. 何はともあれJavaScript入門
6
JavaScript
• プログラミング言語
• (基本)ブラウザ上で動く
• 初めてならここおすすめです↓

http://dotinstall.com/lessons/basic_javascript_v2
• 他の言語なら分かるよという方↓

https://developer.mozilla.org/ja/docs/Web/JavaScript/A_re-introduction_to_JavaScript
• というか実は皆さんもう分かってる?
7
はじめよう
• 任意のブラウザを開いて、Ctrl+Shift+I (⌘+Option+I)
• 開いたら「Console」を選択
• Node.jsインストールしてる人はnodeコマンドでも
8
JavaScript 文法とか
// ここはコメントです

/* これもコメントです */



var x = 123;

var y = "JavaScript";

console.log(x + y);



console.log(123 + 456);



var array = ["aaa", 'bbb', 123];

console.log(array[0]);



var object = {

alfa: "apple",

bravo: 123456,

charlie: ["yuno", "miyako"]

};



console.log(object.charlie[1]);
9
JavaScript 関数
function multi(x, y) {

var answer = x * y;

return answer;

}

console.log(multi(2, 3));

console.log(answer); // エラー



var gj = function() { return 2013; };



var kobo = {

MDS: 2014,

GJ: gj,

YRYR: function(season) {

if (season === 1) { return 2011; }

if (season === 2) { return 2012; }

if (season === 3) { return 2015; }

}

};



console.log(kobo.YRYR(3));
10
JavaScript 条件式/ループ
var x = "Umaru";

var y = 2;



if (1 + 1 <= y) {

x = "Ebina";

} else if (y !== "2") {

x = "Kirie";

} else {

x = "Sylphynford";

}



var abbr = ["U", "M", "R"];

for (var i = 0; i < abbr.length; i++) {

console.log(abbr[i]);

}

var n = 0;

while (n < 3) {

console.log(abbr[n]);

n += 1;

}
11
forよりもおすすめです
[4, 6, 2, 5]

.filter(function(e) {

return e > 3;

}, this) // [4, 6, 5]


.map(function(e) {

return e * 10;

}, this) // [40, 60, 50]


.forEach(function(e, i) {

var print = i + ":" + e;

console.log(print);

}, this);
12
2. 何はともあれHTML入門
13
HTML (Hyper Text Markup Language)
• プログラミングらない言語
• 世のウェブサイトはこれで出来ている
• CSSは今日はやりません_ _
• 初めてならこことかどうでしょう↓

http://www.tohoho-web.com/wwwbeg.htm
• というか実は皆さんもう分かってる?
14
HTMLの文法
<タグ 属性=値>内容</タグ>



<div>

<a href="http://google.com">ぐーぐる</a>

</div>





<!DOCTYPE html>

<html lang="ja">

<head>

<meta charset="UTF-8">

<title>タイトル</title>

</head>

<body>

ここに内容

</body>

</html>
15
3. Reactいってみよう
16
Reactとは
• Facebookが開発している、HTML(DOM)の管理を行う
JavaScriptライブラリ
• (MVCでいうところのV)
• 具体的には、Componentという見た目を管理するオ
ブジェクトを複数作って組み合わせていく
• JavaScriptにHTMLをくっつけたみたいなJSXという文
法が使える
17
JSX?
18
具体的にはこういう感じの
render: function() {

return (

<div className="commentBox">

Hello, world! I am a CommentBox.

</div>

);

}


render: function () {

return (

React.createElement('div', {className: "commentBox"},

"Hello, world! I am a CommentBox."

)

);

}
19
JSX
JS
とりあえずコードを見てみよう
20
サンプルコードを用意しました
21
/KC3/01hello/index.htmlを開いてみよう
<!DOCTYPE html>

<html lang="ja">

<head>

<meta charset="UTF-8">

<title>React.js example</title>

<link rel="stylesheet" href="../shared/css/base.css" />

<script src="../../build/react.js"></script>

<script src="../../build/JSXTransformer.js"></script>

</head>

<body>

<h1>React.js example</h1>

<div id="container">

これが見えている場合、あなたのコードは正しく動いていません:(

</div>

<script type="text/jsx">

var Hello = React.createClass({

render: function() {

return <p>Hello, {this.props.message}!</p>;

}

});

React.render(

<Hello message="React" />,

document.getElementById("container")

);

</script>

</body>

</html>
22
/KC3/01hello/index.htmlを開いてみよう
<div id="container">

これが見えている場合、あなたのコードは正しく動いていません:(

</div>

<script type="text/jsx">

var Hello = React.createClass({

render: function() {

return <p>Hello, {this.props.message}!</p>;

}

});

React.render(

<Hello message="React" />,

document.getElementById("container")

);

</script>
23
props
• Componentに値を渡す方法の1つ
• Component内でpropsの値は読み込めるけど、

書き換えることはできない
24
Componentのモジュール化
いまいち便利さが伝わらない…
25
/KC3/02text/index.html
var Text = React.createClass({

getInitialState: function() {

return { text: "" };

},

onChangeText: function(e) {

this.setState({ text: e.target.value });

},

render: function() {

return <div>

<input type="text" value={this.state.text}

onChange={this.onChangeText} />

<p>{this.state.text}</p>

</div>;

}

});

React.render(

<Text />,

document.getElementById("container")

);
26
state
• Componentが持つ書き換え可能な値
• stateが書き換わると、stateを利用しているDOMも

自動的に書き換わる
27
“React”ive!!
早速ですが
• ToDoアプリを作ってみましょう
• やること(ToDo)を追加していき

終わったものはチェック
• 作例を /KC3/03todo に

置いています
28
Component
Component
Component
Component
ToDoアプリの方針
• ToDoアプリ本体になるTodo Componentと、やること
の1項目を表すTask Componentを作っていく。
• Todo Componentはさっき作ったText Componentをもと
に作成します。
30
Todo Component
var Todo = React.createClass({

getInitialState: function() {

return {text: “", tasks: []};

},

- - - - - - -

render: function() {

var tasks = []

this.state.tasks.map(function(e, i) {

tasks.push(

<Task key={i} id={i} text={e.text}

complete={e.complete} />);

}, this);

return <div>

<form onSubmit={this.onSubmitText}>

<input type="text" value={this.state.text}

onChange={this.onChangeText} />

<button type="submit">追加</button>

</form>

<h3>ToDo</h3>

<ul>{tasks}</ul>

</div>;
}
31
Todo Component
onSubmitText: function(e) {

e.preventDefault();

if (this.state.text !== "") {

var newTasks = this.state.tasks.concat({

text: this.state.text,

complete: false

});

this.setState({

text: "",

tasks: newTasks

});

}

},
32
Task Component
var Task = React.createClass({

render: function() {

return <li>

<input type="checkbox" checked={this.props.complete} />

{this.props.text}

</li>;

}

});
33
Todo
Task
タスク作成
onSubmitText
Todo
Task
タスク作成
onSubmitText
チェックボックス
クリック
Task Component
var Task = React.createClass({

onChangeCheckbox: function() {

this.props.onChange(this.props.id);

},

render: function() {

return <li>

<input type="checkbox" onChange={this.onChangeCheckbox}
checked={this.props.complete} />

{this.props.text}

</li>;

}

});
37
Todo Component
onChange: function(key) {

var target = this.state.tasks[key];

var newTasks = this.state.tasks.filter(function(e, i) {

return i !== key;

}).concat({

text: target.text,

complete: !target.complete

});

this.setState({tasks: newTasks});

},
- - - - - -
tasks.push(

<Task key={i} id={i} text={e.text}

complete={e.complete} onChange={this.onChange}/>);
38
Todo Component
render: function() {

var tasks = [];

var done = [];

this.state.tasks.map(function(e, i) {

if (e.complete) {

done.push(

<Task key={i} id={i} text={e.text}

complete={true} onChange={this.onChange}/>);

} else {

tasks.push(

<Task key={i} id={i} text={e.text}

complete={false} onChange={this.onChange}/>);

}

}, this);

return <div>

:

<h3>ToDo</h3>

<ul>{tasks}</ul>

<h3>Complete</h3>

<ul>{done}</ul>

</div>;
39
4. JSタスクランナーのいる日常
41
index.htmlだけだと…
• まあこうなると思います
42
function Rule(pos) {

this.pos = pos;

}

return Rule;

})();



var Stylesheet = (function(parent) {

function Stylesheet(pos, styles) {

parent.call(this, pos);

this.styles = styles;

}

Stylesheet.prototype.toString = function() {

return "StyleSheetn"

+ this.styles.map(function(e) {

return prettify(e);

}).join("n");

};

return Stylesheet;

})(Rule);



var RuleList = (function(parent) {

function RuleList(pos, rules) {

parent.call(this, pos);

this.rules = rules;

}

RuleList.prototype.toString = function() {

return "RuleListn"

+ this.rules.map(function(e) {

return prettify(e);

}).join("n");

};

return RuleList;

})(Rule);



var AtRule = (function(parent) {

function AtRule(pos, atKeywordToken, componentValues, tail)
parent.call(this, pos);

this.atKeywordToken = atKeywordToken;

this.componentValues = componentValues;

this.tail = tail;

}

AtRule.prototype.toString = function() {

return "AtRulen"

+ prettify(this.atKeywordToken) + "n"

+ this.componentValues.map(function(e) {

return prettify(e);

}).join("n") + "n"

+ prettify(this.tail);

};

return AtRule;

})(Rule);



var QualifiedRule = (function(parent) {

function QualifiedRule(pos, componentValues, braceBlock) {

parent.call(this, pos);

this.componentValues = componentValues;

this.braceBlock = braceBlock;

}

QualifiedRule.prototype.toString = function() {

return "QualifiedRulen"

+ this.componentValues.map(function(e) {

return prettify(e);

}).join("n") + "n"

+ prettify(this.braceBlock);

};

return QualifiedRule;

})(Rule);



var DeclarationList = (function(parent) {

function DeclarationList(pos, declarations) {

parent.call(this, pos);

this.declarations = declarations;

}

DeclarationList.prototype.toString = function() {

return "DeclarationListn"

+ this.declarations.map(function(e) {

return prettify(e);

}).join("n");

};

return DeclarationList;

ファイルを分割しよう
43
どうやって?
• JSファイルを複数作って<script/>で読み込む
• <script/><script/><script/> …
• 別ファイルの変数を相互に参照したいときには?
• がんばる
• Reactiveとは…
44
Browserify使おう
• require()が使えるようになります
• Node.jsをインストールして

$ npm install -g browserify
• (このあたりの分野は群雄割拠なので、各種ライブラリ
の思想、将来性についてよく調べて、お好きなものを
使いましょう)
• 検索キーワード: RequireJS, webpack, ES6, Babel.js
45
/KC3/04comp/
/KC3/04comp/task.jsx
var React = require("react");

var Task = React.createClass({
:
module.exports = Task;
/KC3/04comp/task.jsx
var Task = require("./task.jsx");

var Todo = React.createClass({

:

React.render(

<Todo />,

document.getElementById("container")

);
46
「Browserify」使ってみた。
• $ npm init

適当にEnter押してると、「package.json」というファイルが
作成されます
• $ npm install react browserify reactify

「react」「browserify」「reactify」をインストール
• $ browserify -t reactify

todo.jsx > bundle.js
• bundle.jsが作られる!
47
さらなる高みへ
• Gulpを使いましょう
• JSタスクランナーの一種
• $ npm install -g gulp
• (この辺りの分野は群雄割拠なので(ry
48
Gulpの流れ
• gulpfile.jsのgulp.task()でタスクを定義
• $ gulp [command]でタスク実行!
• サンプルコードではdefaultタスクとwatchタスクを

用意しています
• browserifyしたり、minifyしたり、watchさせたり
49
Enjoy Reactive Coding!
50

Mais conteúdo relacionado

Mais procurados

Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with BrowserifyMuyuu Fujita
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.jsHiroki Toyokawa
 
One Time Binding & Digest Loop
One Time Binding & Digest LoopOne Time Binding & Digest Loop
One Time Binding & Digest LoopKon Yuichi
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころAyumi Goto
 
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれから
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれからReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれから
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれからYusuke Murata
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
AngularJSでの非同期処理の話
AngularJSでの非同期処理の話AngularJSでの非同期処理の話
AngularJSでの非同期処理の話Yosuke Onoue
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
AngularJSの高速化
AngularJSの高速化AngularJSの高速化
AngularJSの高速化Kon Yuichi
 
DevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJSDevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJSGo Tanaka
 
【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会Yuki Okada
 
Angular js or_backbonejs
Angular js or_backbonejsAngular js or_backbonejs
Angular js or_backbonejsOmasa Yusaku
 
Service workerとwebプッシュ通知
Service workerとwebプッシュ通知Service workerとwebプッシュ通知
Service workerとwebプッシュ通知zaru sakuraba
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancementkamiyam .
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.jskamiyam .
 
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSFJavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSFMasuji Katoda
 
AngularJSを浅めに紹介します
AngularJSを浅めに紹介しますAngularJSを浅めに紹介します
AngularJSを浅めに紹介しますnkazuki
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるMasashi Haga
 

Mais procurados (20)

Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with Browserify
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.js
 
One Time Binding & Digest Loop
One Time Binding & Digest LoopOne Time Binding & Digest Loop
One Time Binding & Digest Loop
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころ
 
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれから
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれからReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれから
ReactをRailsとどっぷり使ってみた話と、フロントエンド×AWSのこれから
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
AngularJSでの非同期処理の話
AngularJSでの非同期処理の話AngularJSでの非同期処理の話
AngularJSでの非同期処理の話
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
AngularJSの高速化
AngularJSの高速化AngularJSの高速化
AngularJSの高速化
 
AngularJS入門
AngularJS入門AngularJS入門
AngularJS入門
 
DevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJSDevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJS
 
【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会
 
覚醒!JavaScript
覚醒!JavaScript覚醒!JavaScript
覚醒!JavaScript
 
Angular js or_backbonejs
Angular js or_backbonejsAngular js or_backbonejs
Angular js or_backbonejs
 
Service workerとwebプッシュ通知
Service workerとwebプッシュ通知Service workerとwebプッシュ通知
Service workerとwebプッシュ通知
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancement
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.js
 
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSFJavaEE7徹底入門 プレゼンテーション層の開発 JSF
JavaEE7徹底入門 プレゼンテーション層の開発 JSF
 
AngularJSを浅めに紹介します
AngularJSを浅めに紹介しますAngularJSを浅めに紹介します
AngularJSを浅めに紹介します
 
Angular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべるAngular.jsについてちょっとしゃべる
Angular.jsについてちょっとしゃべる
 

Semelhante a React.jsでクライアントサイドなWebアプリ入門

Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for JavaTakuya Tsuchida
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとかyouku
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2Nishida Kansuke
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
Magento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMagento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMiho Nakano
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Shinsuke Sugaya
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittrkenjis
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
Jetpack Library 事始め
Jetpack Library 事始めJetpack Library 事始め
Jetpack Library 事始めTomohiro Kaizu
 
メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門Atsushi Tadokoro
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』H2O Space. Co., Ltd.
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼうyouku
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210cmtomoda
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 

Semelhante a React.jsでクライアントサイドなWebアプリ入門 (20)

Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとか
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Magento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMagento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for Design
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittr
 
JSDoc ToolKit
JSDoc ToolKitJSDoc ToolKit
JSDoc ToolKit
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
Jetpack Library 事始め
Jetpack Library 事始めJetpack Library 事始め
Jetpack Library 事始め
 
メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門メディア芸術基礎 II jQuery入門
メディア芸術基礎 II jQuery入門
 
20141129-dotNet2015
20141129-dotNet201520141129-dotNet2015
20141129-dotNet2015
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 

React.jsでクライアントサイドなWebアプリ入門