-
Notifications
You must be signed in to change notification settings - Fork 0
DNET_React
- 戻る((MV*) UIフレームワークの該当節を参照)
Facebook社が開発しているSingle Page Application開発用のUIサブシステム。
-
ReactNativeに関しては、Microsoft社が力を入れているように見える。
-
また、Facebookが社内の標準開発環境を「Visual Studio Code」に変更するなど。
- View(UI)部分のみを管理する
- Reactでは「コンポーネント」を生成し組み合わせていくことでUIを構築する。
- なお、コンポーネントのインスタンスのことを「エレメント」と言う。
-
設計と速度が両立すると言われている。
-
仮想DOMの構造体表現と、それを用いたdiff/patchアルゴリズム。
- 最終的に生成されるHTMLの複雑なDOMではなく、仮想的なDOMを記述する。
- 2つのツリー構造のdiffを算出して、それをDOMにpatchするアクションを作る。
-
JSXで記述する。
-
HTML再描画が、Ajaxによって部分描画のDOM操作になり、
-
HTML/JavaScriptにはイベントドリブンの仕掛けが整っている。
-
この土台の上で、リッチなUIサブシステムを実現しようとしたら、
-
DOM操作のビルティング・ブロック化が目標になり、
-
これを実現しているのがReact Fiberあたりの仕組みである。
...と言う事だろうか。
-
-
仮想DOMを更新してUIに反映するアルゴリズムをリコンシリエーション(reconciliation)と言う。
-
以前は、仮想DOMのツリーを上から再帰的に比較していくという処理だった。
-
Fiberでは再帰的な処理をやめて、ReactElementごとの更新処理を
連結リストにして、一つ一つの更新処理を独立したものとして扱えるようにした。- 同期的な再帰処理を、停止・再開可能な非同期処理(Fiber)に分割した。
- Fiberのスケジューリングが可能になった(インクリメンタルレンダリング)
※ そもそもFiberとは「ファイバー (コンピュータ) - Wikipedia」のこと。
JSXをサポートする言語を使用する。
- 「Babel」(JavaScriptの該当節を参照 / ECMAScript)を導入する方法が最も簡単。
- プログラム・ファイルの拡張子は、*.jsx。
- また、「TypeScript」(JavaScriptの該当節を参照)でもサポートされている(TSX)。
- プログラム・ファイルの拡張子は、*.tsx。
画面定義のマークアップ言語
JSの拡張言語で、
-
React 要素を作成する仮想DOMを、簡便な形式でXMLマークアップのシンタックスを追加する。
-
XMLマークアップには、標準のHTML5 + 拡張属性で、HTMLタグとJSXタグが共存する。
-
制御構文とXMLマークアップが混在するという意味で、Razor的。
{変数名}でJavaScript変数を出力
-
基本的に以下のように書く。
<button onClick={()=>this.renderChange()}>切替</button>
-
以下は問題がある。
-
レンダリング時にclickActionが起動してしまう。
<div onClick={this.clickAction()}>
-
thisにアクセスできない。
<div onClick={this.clickAction}>
-
自由に属性を設定可能。
<div>
<MyComponent
myTitle={'タイトル'}
myValue={this.state.value} />
</div>子コンポーネントからprops.(定義した属性名)と利用。
-
React自身にデザインの機能はないのでCSSを利用する。
-
「Css in JS」と言われる考え方が登場し、
React用のCSSをインポート可能になっている。 -
classはclassNameと書く。styleはstyleで良い。
<button className="btn btn-default" style={{color:"gray"}}/>
JSXタグでコンポーネントを設置
- タグ名=コンポーネントクラス名の
- JSXタグは頭文字が大文字になる。
<MyComponent />コンポーネントのRender内に、子コンポーネントを記述
<SubComponent />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>
)
}
}state, propsを使用する場合、React.Componentを継承する。
-
モジュール化することによってインポート可能なクラスにする。
export class MyComponent extends React.Component {
-
defaultも付けると、デフォルトで読み込むモジュールになる
export default class MyComponent extends React.Component {
exportでモジュール化したクラスは、importでインポートが可能。
-
1クラス、インポート
import { SubComponent1 } from './SubComponent';
-
nクラス、インポート(1ファイルに複数定義されている場合)。
import { SubComponent1, SubComponent2 } from './SubComponent';
- コンポーネントの状態を表す変数。
- コードからReact.Componentのプロパティと思われる。
- this.setStateで設定し、this.stateで参照する。
- データ(state)を親コンポーネントから子コンポーネントに渡す際に使用する。
- 変更不可と書かれていることがあるが変更通知を使用すれば変更可能。
- コードからReact.Componentのプロパティと思われる。
-
stateあり
constructor(props, context) { super(props, context) this.state = { viewText: props.text, viewFlg: props.defaultFlg, } }
-
stateなし
stateを使わない、propsだけのコンポーネントの場合、constructor(props, context){ super(props, context) }
constructorの記述自体を丸々省略できる。
-
生成したいHTML(正確にはJSX)を書く。
-
return( の直下は1つのエレメントしか置けない。
-
繰り返し処理
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> ) })
-
-
コンポーネントの再描画
- 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> ) } }
- Componentの状態の変化に合わせて色々メソッドを呼んでくれる。
- それに合わせて初期化や後始末な処理を書くことが出来る。
- 初期化処理を行う。
- ComponentがDOMツリーに追加される前に一度だけ呼ばれる。
- server-side rendering時にも呼ばれる。
- DOMに関わる初期化処理を行う。
- ComponentがDOMツリーに追加された状態で呼ばれる。
- server-side renderingの時には呼ばれない。
-
propsが更新される時に呼ばれる。
-
Componentが新しくDOMツリーに追加される時には呼ばれない。
-
主に、Notification(変更通知)的に使う。
- Componentがrerenderされる前に呼ばれる。
- Performanceの向上を目的に実装する。
- trueを返すとVirtualDOMの比較を行いrerenderされる。
- falseを返すとVirtualDOMの比較を行わずにrerenderもされなくなります。
- Component更新前に呼ばれる(初回時には呼ばれない)。
- この中でsetStateを呼ぶことは出来ない(→ componentWillReceiveProps)。
- Component更新後に呼ばれる(初回時には呼ばれない)。
- DOMの変化にフックして何かしたい場合に使う。
- ComponentがDOMから削除される時に呼ばれる。
- イベントの解除などクリーンアップ処理に使用する。
-
Qiita
-
React.jsのComponent Lifecycle
https://qiita.com/koba04/items/66e9c5be8f2e31f28461 -
React Componentのライフサイクルのまとめと利用用途
https://qiita.com/yukika/items/1859743921a10d7e3e6b -
Reactが用意しているライフサイクルメソッド7つ
https://qiita.com/aka_k_root/items/8ac3c33737709fa510cf -
React コンポーネント作成時に非同期通信したいときは componentDidMount に書こう
https://qiita.com/megane42/items/213e927a2af72530e920
-
見た目を担当するコンポーネント
-
独自のマークアップとスタイルを持つ。
-
アクションやストアの部分は分離される。
-
多くの場合
- this.props.childrenとして他に内包され、
- propsとしてデータとコールバックを受け取れる。
-
稀に独自のstateを持つ。
(それはデータではなくUIの状態として持つ。)
ロジック(物事の振る舞い)に関与するコンポーネント
-
通常、ラッピングのdivを除いてDOMマークアップ、スタイルを持たない。
-
Presentational Componentや、
その他のコンポーネントにデータと振る舞いを提供する。 -
基本的に状態保持と処理を行う
-
アクション呼び出しなどをコールバック
としてPresentational Componentに渡す。 -
データソースとして機能する傾向がある
-
-
-
通常、上位コンポーネントを使用して生成される
-
React Reduxのconnect
-
RelayのcreateContainer
-
Flux UtilsのContainer.create
-
-
ComponentとContainerについて - Qiita
https://qiita.com/tenta1111/items/7b4d2ea1a4d1d2336032 -
Presentational and Container Components - Dan Abramov - Medium
https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0
-
SFC : Stateless functional components
-
stateを自身で持たないシンプルなコンポーネントの場合、
React.Componentを継承したクラスの定義は不要。 -
以下が不要な場合は、SFCとしてComponentを定義可能。
-
定義
-
propsがない場合
-
匿名関数
const Hello = function() { return <div>Hello XXXX</div> }
-
ラムダ式
const Hello = () => <div>Hello XXXX</div>
-
使い方
<Hello />
-
-
propsがある場合
-
匿名関数
const Hello = function(name) { return <div>Hello name</div> }
-
ラムダ式
関数の引数でDestructuringconst Hello = ({name}) => <div>Hello {name}</div>
-
使い方
<Hello name="XXXX" />
-
-
-
参考
- Qiita
- ReactのStateless Functional Componentsの書き方
https://qiita.com/ledsun/items/c577e004561b59f9a7e5
- ReactのStateless Functional Componentsの書き方
- Qiita
-
定義
{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> ) } }
同一コンポーネントのインスタンスを識別する。
-
基本
-
子側で(利用を)定義
this.props.XXXX
-
親側でデータを指定。
<子 XXXX={JavaScriptの値}>
-
-
型指定と既定値
-
基本形のコンポーネント
・・・ -
Stateless functional components
Hello.propTypes = { name: React.PropTypes.string } Hello.defaultProps = { name: 'XXX' }
-
親コンポーネントが保持しているデータを
全て子コンポーネントのpropsに渡す。
-
子側の定義は不要で、以下のように利用可能。
-
親側でスプレッド演算子(ECMAScriptの該当節を参照)によりデータを指定。
-
任意のデータ
var props = {}; props.foo = x; props.bar = y; var component = <子 {...props} />;
-
親側のpropsデータ
<子 {...this.props}>
-
-
親側は、
-
子側は、
-
コンポーネントが変更された、新しいpropsを受け取ると、
componentWillReceivePropsが変更通知として実行される。 -
propsの更新をsetStateで反映する。
componentWillReceiveProps(newProps) { //JSON.stringify(newProps); this.setState({count: newProps.count}); }
-
-
Reactでイベントの伝播 - yugr's diary
http://yugr.hatenablog.com/entry/2017/11/22/132059 -
javascript - Updating state with props on React child component - Stack Overflow
https://stackoverflow.com/questions/39154967/updating-state-with-props-on-react-child-component
-
React 0.13 日本語リファレンス
-
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
-
-
React における State と Props の違い
https://qiita.com/kyrieleison/items/78b3295ff3f37969ab50 -
今からはじめるReact.js〜propsとstate、それからrefs〜
https://qiita.com/kuniken/items/a22adda392ccc30011b1 -
ざっくり React チュートリアル
https://qiita.com/pullphone/items/efcaee59cf2a5725c61d
(元 Wiki では未記載)
-
Qiita
- React.js + CSS
https://qiita.com/koba04/items/0e81a04262e1158dbbe4
- React.js + CSS
-
Styling and CSS - React
https://reactjs.org/docs/faq-styling.html#what-is-css-in-js
-
BootstrapをReactから使いやすくしたライブラリ。
-
インストールと、CSS自体の読み込みが必要。
-
参考
- react-bootstrapで書くとコンポーネント的にBootstrapが使えるよ! | 酒と涙とRubyとRailsと
https://morizyun.github.io/javascript/react-js-bootstrap-javascript-css-framework.html
- react-bootstrapで書くとコンポーネント的にBootstrapが使えるよ! | 酒と涙とRubyとRailsと
-
マテリアルデザインをReact.jsで実現するライブラリ。
-
Bootstrapと提供機能はほとんど同じ。
npm install material-ui --save
Reactコンポーネントが状態を失うことなく、
ライブで再ロードされるようにするプラグイン。
https://reacttraining.com/react-router/
https://reacttraining.com/react-router/web/guides/philosophy
-
Router
-
BrowserRouter
通常のRouter -
HashRouter
URLフラグメント、URLハッシュ値を使用したRouter
-
-
パラメタ
-
パラメタを持たないコンポーネント
<Route exact path="/" component={FormInput}/>
-
パラメタを持つコンポーネント
-
オブジェクト
<Route exact path="/" render={props => <FormInput data={this.state.data} />} /> <p>Data:{ this.state.data }</p>
-
URL
<Route path="/:id" component={FormInput}/> <p>ID:{props.match.params.id}</p>
-
-
-
タグ
- Link
- Redirect
XMLHttpRequest代替のfetch APIのPolyfill(WHATWG Fetch polyfill)。
- Fetch API - Web API インターフェイス | MDN
https://developer.mozilla.org/ja/docs/Web/API/Fetch_API
Drag&Dropで画面項目をリサイズ
Drag&Dropで画面項目を移動
右クリックでメニューを表示する
ツリーメニュー
カレンダーでの日付表示、日付入力機能
スケジューラ用途のカレンダー
高機能テーブルコンポーネント(ソートやフィルタリング、ページジング)。
- 1つのタグにまとめるルートのタグとして使用できる。
- Fragmentタグ自体はレンダリングされない。
- 配列も返すことが出来る(ただし、keyが必要)。
- ref属性を定義した要素のRefsを取得する方法の一つ。
- RefsによりDOMやReactコンポーネントへのアクセスが可能となる。
- createRef以外にもcallbackによる取得も可能。
-
バケツリレー(prop drilling)問題を解決する。
-
react-reduxのProviderとほぼ同様の機能
-
ProviderとConsumerというComponentを使う。
-
ProviderでwrapしたComponent以下は
Consumer経由でいつでもProviderに
設定されたパラメータをpropsで参照できる。
-
React.Timeoutだったり、React.Placeholderだったりしたもの。
-
子コンポーネントでPromiseをthrowすることで、
- 子コンポーネントのレンダリングを中断し、
- Promiseの完了時にレンダリングを再実行する。
遅延ロード用のコンポーネントをimportするための機能
- JavaScriptファイルを分割ロード
- React.Suspenseと一緒に利用
FCでshouldComponentUpdate相当のことができる。
React v16.3以降、ライフサイクルメソッドの
deprecated(非推奨)のため、代用が必要。
(元 Wiki では未記載)
-
this.props.childrenの評価時に発生したエラーを
親コンポーネントのcomponentDidCatchで取得できる。 -
React.Suspenseで利用されている機構。
(元 Wiki では未記載)
「Vite + React + TypeScript + Tailwind」と「Claude Sonnet」で爆速♨
-
React - Wikipedia
https://ja.wikipedia.org/wiki/React -
React – ユーザインターフェース構築のための JavaScript ライブラリ
https://ja.reactjs.org/ -
Microsoftエンジニア、
「Officeを完全にJavaScriptで書き直した」
とツイートして炎上 | ソフトアンテナブログ
https://www.softantenna.com/wp/software/office-in-javascript/ -
Facebookが社内の標準開発環境を変更、
「Visual Studio Code」のリモート開発拡張
も強化:独自言語サポートもある - @IT
https://www.atmarkit.co.jp/ait/articles/1911/22/news049.html
- いまさら聞けないReact、Virtual DOM、JSX超入門 (1/3)
http://www.atmarkit.co.jp/ait/articles/1607/26/news138.html
-
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
学べる生放送コミュニケーションサービス
- React.js入門
https://schoo.jp/class/3437 - React.js実践入門
https://schoo.jp/class/3628
-
生の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/
移行メモ
- 「React自信にデザインの機能はない」→「React自身に」、 「JSXタグは頭文字を大文字になる」→「頭文字が大文字になる」、 「React 要素作成する仮想DOM」→「React 要素を作成する仮想DOM」に修正した。
- 「nクラス、インポート(1ファイルに複数定義されている場合。」の 閉じ括弧の欠落を補った。
- 本文の無い見出し(「Pointer Events」「getDerivedStateFromError」「Css in JS」の概要)には 未記載である旨を明示し、「データ連携」「step by step 的な」配下は箇条書きにまとめた。
- 同名の見出し(「特徴」「Css in JS」「参考」「Qiita」「概要」「props」 「componentWillReceiveProps」)が複数あり GitHub Wiki でアンカが衝突するため、 括弧で文脈を補って一意にした。
- マイクロソフト系技術情報 Wiki(techinfoofmicrosofttech.osscons.jp)への URL リンクは、移行済みの XAML / ASP.NET Core SPAテンプレート / ASP.NET Core React.jsテンプレート / ASP.NET Core React+Reduxテンプレート に張り替えた。
- PukiWiki のページ内アンカ(
#xxxxxxxx)は GitHub Wiki では再現できないため、 同一ページ内のアンカは見出しから生成されるアンカに張り替え、 他ページのアンカを指すリンクは「〜(ページ名の該当節を参照)」の形に置き換えた。- 本フェーズで新たに参照された「Flux」「Hooks」「Reactのサード・ステップ」 「Reactの4thステップ」「Reactの5thステップ」「Reactのファースト・ステップ2」 「Reactのセカンド・ステップ2」を TODO.md に予約した。
Tags: 移行, React, JSX, 仮想DOM, コンポーネント, state, props, SPA, Redux, Flux, Hooks
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。