「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>JavaScript#s4081e43]]

*目次 [#f787db65]
#contents

*概要 [#dff610b2]
-Facebook社が開発しているSingle Page Application開発用の[[UIサブシステム>#y5519e45]]。
-[[コンポーネント指向>#m9350bfc]]に基づいて効率的にSPAを開発できる。
-下記の[[特徴>#d16b27fe]]を見ると、JSのMV*も[[XAML>https://techinfoofmicrosofttech.osscons.jp/index.php?XAML]]的になったなぁという感覚がある。

*特徴 [#d16b27fe]

**Just the UI [#y5519e45]
-View(UI)部分のみを管理する

**コンポーネント指向 [#m9350bfc]
-Reactでは「コンポーネント」を生成し組み合わせていくことでUIを構築する。
-なお、コンポーネントのインスタンスのことを「エレメント」と言う。

***Virtual DOM [#b5a85f5b]
-設計と速度が両立すると言われている。

-仮想DOMの構造体表現と、それを用いたdiff/patchアルゴリズム。
--最終的に生成されるHTMLの複雑なDOMではなく、仮想的なDOMを記述する。
--2つのツリー構造のdiffを算出して、それをDOMにpatchするアクションを作る。

-[[JSX>#ne8ad84a]]で記述する。

***Data flow [#i6a6e2f6]
コンポーネント中のデータの流れを[[state>#ace9fd23]], [[props>#dea212dc]] -> UI要素へ一方向化している。

*基本的な事項 [#b58a8b20]

**JSX [#ne8ad84a]

***特徴 [#i7940c50]
-HTMLタグとJSXタグが共存する、
-XMLライクのシンタックスを追加する言語拡張(Razorの様な)
-Webページ内でJSXを使用するには、
--「[[Babel>JavaScript#f322ef90]]」([[ECMAScript]])を導入する方法が最も簡単。
--また、「[[TypeScript>JavaScript#kf4fe370]]」でもサポートされている。

***変数出力 [#zd3c948e]
{変数名}でJavaScript変数を出力

***イベント・ハンドラ [#y2f3d04b]
-基本的に以下のように書く。
 <button onClick={()=>this.renderChange()}>切替</button>

-以下は問題がある。

--レンダリング時にclickActionが起動してしまう。
 <div onClick={this.clickAction()}>

--thisにアクセスできない。
 <div onClick={this.clickAction}>

***属性の指定 [#d3f420c0]
自由に属性を設定可能。

 <div>
     <MyComponent 
         myTitle={'タイトル'}
         myValue={this.state.value} />
 </div>

子コンポーネントから[[props>#dea212dc]].(定義した属性名)と利用。

***デザイン(CSS)は設計しない [#p175ea2a]

**基本形のコンポーネント [#z184f699]
 import React from 'react';
 import ReactDOM from 'react-dom';
 
 class MyComponent extends React.Component {
     constructor(props,context){
         super(props,context)
         this.state = { viewText : 'テストページ' }
     }
     render(){
         return (
             <div>
                 <h1>Hello! World.</h1>
                 <p>このページは{ this.state.viewText }です。</p>
             </div>
         )
     }
 }

***constructor [#ha6acf80]
-[[state>#ace9fd23]]あり
   constructor(props, context) {
     super(props, context)
     this.state = {
       viewText: props.text,
       viewFlg: props.defaultFlg,
     }
   }

-[[state>#ace9fd23]]なし~
[[state>#ace9fd23]]を使わない、~
[[props>#dea212dc]]だけのコンポーネントの場合、
 constructor(props,context){
     super(props,context)
 }

>constructorの記述自体を丸々省略できる。

***render [#w9dbdb36]
-生成したいHTML(正確には[[JSX>#ne8ad84a]])を書く。
-return( の直下は1つのエレメントしか置けない。

***コンポーネントのネスト [#h22a25e9]
-インポート
--1クラスインポート
 import { SubComponent1 } from './SubComponent';

--nクラスインポート(1ファイルに複数定義されている場合。
 import { SubComponent1, SubComponent2 } from './SubComponent';

-[[JSX>#ne8ad84a]]に子コンポーネントを記述
 <SubComponent />

**その他のコンポーネント [#c0057ae7]

***状態を持たないコンポーネント [#j9387807]
Stateless functional components

[[state>#ace9fd23]]を自身で持たないシンプルなコンポーネントの場合、~
React.Componentを継承したクラスの定義は不要。

-定義

--[[props>#dea212dc]]がない場合

---匿名関数
 const Hello = function() {
   return <div>Hello XXXX</div>
 }

---ラムダ式
 const Hello = () => <div>Hello XXXX</div>

---使い方
 <Hello />

--[[props>#dea212dc]]がある場合

---定義~
関数の引数でDestructuring
 const Hello = ({name}) => <div>Hello {name}</div>

---使い方
 <Hello name="XXXX" />

***テンプレート・コンポーネント [#u0271a61]
-定義~
{this.props.children}で子を描画。
 // テンプレート・コンポーネント
 class TemplateComponent extends React.Component {
   render() {
     return (
       <main>
         <header>
           <h2>{this.props.title}</h2>
         </header>
         <div>
           {this.props.children}
         </div>
         <footer>
           <p>copyright company</p>
         </footer>
       </main>
     )
   }
 }

-利用~
TemplateComponentにChildComponentを指定。
 // Mainコンポーネント
 class MainComponent extends React.Component {
   render() {
     return (
       <section>
         <h1>Main Title</h1>
         <TemplateComponent title={'コンテンツタイトル'}>
           <ChildComponent />
         </TemplateComponent>
       </section>
     )
   }
 }

**state [#ace9fd23]
-stateを更新すると再描画される。
-イベントなどで、上記のthis.stateを変更するとHTMLが再描画される。

 class MyComponent extends React.Component {
   constructor(props, context) {
     super(props, context)
     this.state = {
       viewText: props.text,
       viewFlg: props.defaultFlg,
     }
   }
   renderChange() {
     // viewFlgの状態を切替(0 <-> 1)
     let newFlg = this.state.viewFlg == 1 ? 0 : 1;
     this.setState({ viewFlg: newFlg });
   }
   render() {
     return (
       <div>
         <h1>Hello! World.</h1>
         <LeadText viewText={this.state.viewText} viewFlg={this.state.viewFlg} />
         <button onClick={()=>this.renderChange()}>切替</button>
       </div>
     )
   }
 }

**renderの例 [#b0a186c6]

***繰り返し処理 [#n7b546ac]
map内にラムダ式を書く。

-配列
 items = [
     { value : 'apple' },
     { value : 'orange' },
     { value : 'banana' },
  ];

-値
 return items.map(_item => {
     return(
         <li>{_item.value}</li>
     )
 })

-キー、値
 return items.map((_item,_key) => {
     return(
         <li key={_key}>{_item.value}</li>
     )
 })

※ [[基本形のコンポーネント>#z184f699]]としても、~
[[Stateless functional components>#j9387807]]としても、書ける。

*データおよびイベント連携 [#n8b8bac0]

**親から子 [#dfd6902c]

***props [#dea212dc]
-基本~
不変のデータを親コンポーネントから子コンポーネントに渡す。

--子側で(利用を)定義
 this.props.XXXX

--親側でデータを指定。
 <子 XXXX={JavaScriptの値}>

-型指定と既定値
--[[基本形のコンポーネント>#z184f699]]~
・・・

--[[Stateless functional components>#j9387807]]
 Hello.propTypes = {
   name: React.PropTypes.string
 }
 Hello.defaultProps = {
   name: 'XXX'
 }

***JSX Spread Attributes [#o23213b7]
親コンポーネントが保持しているデータを全て子コンポーネントの[[props>#dea212dc]]に渡す。

-子側の定義は不要で、以下のように利用可能。

-親側でスプレッド演算子によりデータを指定。

--任意のデータ
 var props = {};
 props.foo = x;
 props.bar = y;
 var component = <子 {...props} />;

--親側のpropsデータ
 <子 {...this.props}>

***componentWillReceiveProps [#b6de5462]
[[props>#dea212dc]]の更新を反映する。

変更通知を受け取るので、この中でsetStateする。

 componentWillReceiveProps: function(nextProps) {
   this.setState({
     likesIncreasing: nextProps.likeCount > this.props.likeCount
   });
 }

**子から親 [#ubca9a39]
親のハンドラをthis.propsで子に渡して、子から呼び出す。

**その他 [#zfb27b06]

***Flux [#s9dbd4f8]

***Redux [#f382342b]
-ASP.NET Core React+Reduxテンプレート - マイクロソフト系技術情報 Wiki~
https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Core%20React%2BRedux%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

***SharedState [#s3316d0f]
・・・

*拡張の事項 [#y42dffa0]
-ASP.NET Core React.jsテンプレート - マイクロソフト系技術情報 Wiki~
https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Core%20React.js%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

**react-hot-loader(AppContainer) [#uf49a267]
Reactコンポーネントが状態を失うことなく、~
ライブで再ロードされるようにするプラグイン。

**react-router-dom(BrowserRouter) [#lb25a2fc]
-BrowserRouter~
通常のRouter
-HashRouter~
URLフラグメント、URLハッシュ値を使用したRouter

**isomorphic-fetch(fetch) [#q7ff35d6]
XMLHttpRequest代替のfetch APIのPolyfill(WHATWG Fetch polyfill)。

-Fetch API - Web API インターフェイス | MDN~
https://developer.mozilla.org/ja/docs/Web/API/Fetch_API

*コンポーネント・ライブラリ [#k04fc76a]

**CSS [#lfebe228]

***react-bootstrap [#va73ad58]
BootstrapをReactから使いやすくしたライブラリ。

***Material-UI [#vf8e9959]
-[[マテリアルデザイン>https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3]]をReact.jsで実現するライブラリ。
-Bootstrapと提供機能はほとんど同じ。

**リサイズ・移動など [#y7cd5e1e]

***React-Resizable [#z0639cdb]
Drag&Dropで画面項目をリサイズ

***React-Draggable [#w31b0555]
Drag&Dropで画面項目を移動

**UIコンポーネント [#rfb0d19a]

***React Contextmenu [#u14123db]
右クリックでメニューを表示する

***React Tree Menu Component [#kcb92783]
ツリーメニュー

***rc-calendar [#u805d6e9]
カレンダーでの日付表示、日付入力機能

***react-big-calendar [#g2a3e4d9]
スケジューラ用途のカレンダー

***React Bootstrap Table [#s62d970a]
高機能テーブルコンポーネント(ソートやフィルタリング、ページジング)。

*参考 [#i144c1a1]

**@IT [#cb9f8a95]
-いまさら聞けないReact、Virtual DOM、JSX超入門 (1/3)~
http://www.atmarkit.co.jp/ait/articles/1607/26/news138.html

**Qiita [#sd8946f9]
-reactjsに関するxxxx件の投稿~
https://qiita.com/tags/reactjs

-Destructuring assignmentのご利用は計画的に~
https://qiita.com/okunokentaro/items/ec3210a1942471fba612

-react-router@v4を使ってみよう:シンプルなtutorial~
https://qiita.com/hoture/items/b4ca1773580317e7112e

-jsFiddleを使ってみる~
https://qiita.com/kazusa-qooq/items/f78791c827ae050ca127

**Schoo [#ybde9b1d]
学べる生放送コミュニケーションサービス

-React.js入門~
https://schoo.jp/class/3437
-React.js実践入門~
https://schoo.jp/class/3628

**POSTD [#u16bf14e]
-生のReactを知ろう – JSX、Flux、ES6、Webpackを使わず…~
https://postd.cc/learn-raw-react-no-jsx-flux-es6-webpack/

-大規模Reactアプリケーションを構築するためのベストプラクティス~
https://postd.cc/best-practices-for-building-large-react-applications/

-Web開発の未来 – React、FalcorおよびES6~
https://postd.cc/future-of-the-web-react-falcor/

**ファースト・ステップ的な [#dd252417]

***React初心者のまとめ [#ae46601f]
-(基本編:1/3)~
https://qiita.com/tomi_shinwatec/items/6563eacd88e63bda5de3
-(基本編:2/3)~
https://qiita.com/tomi_shinwatec/items/cdd319d8fce8bdb829d0
-(基本編:3/3)~
https://qiita.com/tomi_shinwatec/items/975eceda3d07b152547c

***今からはじめるReact.js [#b8ae127e]
-〜準備〜~
https://qiita.com/kuniken/items/19fccc27b8bfa8068d22
-〜初めてのコンポーネント〜~
https://qiita.com/kuniken/items/963cb977dffd3e662e40
-〜コンポーネントをまとめる〜~
https://qiita.com/kuniken/items/c0f5ed06695ce52d4854
-〜スタイルの適用〜~
https://qiita.com/kuniken/items/b06de893c22f33499a22
-〜React ver0.14〜~
https://qiita.com/kuniken/items/2fc5b782da5d302247ab
-〜propsとstate、それからrefs〜~
https://qiita.com/kuniken/items/a22adda392ccc30011b1
-〜・・・〜~
https://qiita.com/kuniken/items/・・・
-〜画面遷移〜~
https://qiita.com/kuniken/items/89c8bbef3b71d2af662d
-〜Flux〜~
https://qiita.com/kuniken/items/b532d4fa980b53fd6bd5

***React習得記まとめ [#qece7d15]
https://qiita.com/ryo_t/items/67e319f8cc41c2d96eb9

***create-react-app [#g029aa6b]
-React初心者が環境構築でつまづかないためのCreate React Appの始め方 - WPJ~
https://www.webprofessional.jp/create-react-app/

-Create React AppでReactアプリを開発する : エキサイト公式 エンジニアブログ~
https://blog.excite.co.jp/exdev/25487209/

-npm run eject で create-react-app はアプリケーションの長寿を保証する - valid,invalid~
http://ohbarye.hatenablog.jp/entry/2016/11/20/141135

-Qiita

--Facebook公式のcreate-react-appコマンドを使ってReact.jsアプリを爆速で作成する~
https://qiita.com/chibicode/items/8533dd72f1ebaeb4b614
--Facebook 公式ツール Create React App を使って React 開発の初歩を学ぶチュートリアル~
https://qiita.com/kent_ocean/items/d429804b5ad0d7570ece
--create-react-app が裏で何をやっているか理解する~
https://qiita.com/naohikowatanabe/items/71a8bf477216ef56a5b7

**データ連携 [#f04c9975]

***State と Props [#f279343c]
-React 0.13 日本語リファレンス | js STUDIO
--propsの受け渡し~
http://js.studio-kingdom.com/react/guides/transferring_props
--JSXのスプレッド属性~
http://js.studio-kingdom.com/react/guides/jsx_spread
--componentWillReceiveProps~
http://js.studio-kingdom.com/react/component_lifecycle/updating_componentwillreceiveprops

-Qiita
--React における State と Props の違い~
https://qiita.com/kyrieleison/items/78b3295ff3f37969ab50
--今からはじめるReact.js〜propsとstate、それからrefs〜~
https://qiita.com/kuniken/items/a22adda392ccc30011b1
--ReactのStateとPropsの違いについて ~0からreact習得記 day 08~
https://qiita.com/ryo_t/items/d1f080f77bdeff4fa2f4

***Flux [#v7718b51]
-FacebookのFluxアーキテクチャの始め方
--Part 1~
https://postd.cc/introduction-to-facebooks-flux-architecture-1/
--Part 2~
https://postd.cc/introduction-to-facebooks-flux-architecture2/

-さらに多くのことが変化する – Fluxは新しい”WndProc”である~
https://postd.cc/the-more-things-change/
-Reactを用いたアプリケーションアーキテクチャ:Fluxを再考する~
https://postd.cc/application-architecture-with-react-rethinking-flux/

***Redux [#g12d979f]
-モバイル上のJSフレームワークの実行可能性 – ReactとRedux~
https://postd.cc/viability-of-js-frameworks-on-mobile/

**コンポーネント [#w6746f0f]

***Stateless Functional Components [#gfe894b2]

-Qiita
--ReactのStateless Functional Componentsの書き方~
https://qiita.com/ledsun/items/c577e004561b59f9a7e5

***コンポーネント・ライフサイクル [#x5bcf220]

-Qiita
--React.jsのComponent Lifecycle~
https://qiita.com/koba04/items/66e9c5be8f2e31f28461
--React Componentのライフサイクルのまとめと利用用途~
https://qiita.com/yukika/items/1859743921a10d7e3e6b
--React コンポーネント作成時に非同期通信したいときは componentDidMount に書こう~
https://qiita.com/megane42/items/213e927a2af72530e920

**マイクロソフト系技術情報 Wiki [#yd21a2a3]
-ASP.NET Core SPAテンプレート~
https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Core%20SPA%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

--ASP.NET Core React.jsテンプレート~
https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Core%20React.js%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

--ASP.NET Core React+Reduxテンプレート~
https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Core%20React%2BRedux%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS