LoginSignup
3
4

More than 5 years have passed since last update.

reduxを使うためにいろいろお勉強5

Last updated at Posted at 2016-07-24

キーワード、関数など

コンポーネントのライフサイクルメソッド

「componentDidMount」「componentWillUnmount」はコンポーネントのライフサイクルメソッドです。

componentDidMount

読み込み時にアクションを呼び出す

react-reduxでページ読み込み時、actionを呼び出す方法 | Gaku'sMemo
http://goo.gl/lVwP0V

ちょっとわかり始めた時に、かなりいい例示コードな気がするんだけどどうかな

Reduxで定期的なアクションを実行する簡単なサンプルを作ってみた | WebDesign Dackel
http://goo.gl/UFJOR7

componentWillUnmount

マウントの後のアクション呼び出し

require.ensure

jsファイルを後から読み込
webpackによる分割をするための記述で、ひきすうで分割後のファイル名を指定できるのか、
なるほど、分割されたjsファイルをちゃんと命名してあげる

webpackのrequire.ensureでDynamic Loadingをして大規模アプリケーションを作る - Qiita
http://goo.gl/Mbwxpi

createSelector

便利らしい。

Reduxのreselectとは - Qiita
http://goo.gl/RM31To

connect

connect,mapStateToProps, mapDispatchToPropsあたりの位置付けがよくわからない

公式にもある、mapStateToPropsの内部で処理をするのは、
State is read-only(状態の更新はアクションからだけ?)
に反していないのかどうなのか。

subscribe, propTypes

この辺に書いてあることもちょこちょこよくわからない。

なるほど。

むしろややこしいのがReact-Reduxを使ったReactとReduxの連携の方だと思います。特にconnectメソッドの部分で、自分も最初何のことやらと戸惑いました。実際に動きを確認しながら実装してみることで、それなりに理解できるようになるかと思います。

課題や不明点

コンテナのファイルにいれるか、コンポーネントのファイルに分けるか

ここの例だと、コンポーネント部分の処理はそこまで複雑ではないけど、コンテナにjsxを書いている。

ミドルウェアを活用するべき?reduxの弱点への対策??

Reduxのmiddlewareを積極的に使っていく - Qiita
http://goo.gl/Ufvk2k

Actionを投げる部分ってのはだいたい何かのイベントハンドラだったりしますが、そういう場所に通信やインタラクションの処理をダラダラと書きたくない。
本稿ではそれらの面倒な部分を責務が分離されたメンテナンスのしやすいコードになるようにmiddlewareを活用する例をいくつか紹介します。

2つのmiddlewareを通じてどうやって肥大化、複雑化する非同期処理、副作用コードと戦っていくかを示しました。middlewareはStoreに直接アクセスできることから、やろうと思えば何でもできちゃうところが強力でもあり、混乱のもとにもなりえます。幸いなことにmiddlewareを細かく分割しても applyMiddleware で簡単に結合できますし、困ることはありません。またmiddlewareにすると他のプロジェクトでも同じパターンが使えることが多いです。

React.createClass

リスト表示+ページングを実装しながらReact.jsを理解してみる - Qiita
http://goo.gl/XdhqND

reactで、jsxを分割する時に使った。
reactのコンポーネントの一種でトップレベルAPIに含まれる基本的な概念っぽい。

Top-Level API | React
https://goo.gl/RfLAc4

React.jsのComponentについて - Qiita
http://goo.gl/Sh3u96

つまりElementではないので、使うときにはReact.createElement(Component, {name: 'xxx'})のようにReact Elementにしてあげる必要があります。ちなみにReact.createFactory(Component)とやることも出来ます。
ただJSXを使っている場合は、これまでと同じようにReact.createClassの戻り値をのように直接渡しても大丈夫です。

JSXではエレメントと相違なく違和感なくよびだせるけど、スクリプトの時にはエレメントに渡す。。っぽい。

Reactのコンポーネント

JSXでコンポーネントを呼び出したりするけど、見た目は一緒に見えてもその実体?は、
createElementで作ったエレメントだったり、createClassで作ったカスタムコンポーネントだったりする。。??

React.jsのComponentについて - Qiita
http://goo.gl/Sh3u96

Top-Level API | React
https://goo.gl/RfLAc4

React 0.13 日本語リファレンス | js STUDIO
http://goo.gl/OIUbeS

React 入門 #2 - Component
http://goo.gl/AoT2JA

いまさら聞けないReact、Virtual DOM、JSX超入門 (1/3) - @IT
http://goo.gl/UFLFsL

ループのdomのためにユニークなキーを振るべし

配列に対してキーは事前に振っておかないとだめなのか、あとでループの時に簡単にインデックスと取れないのか。

下記でできた。コードのコメントをみると、

The provided mapFunction(child, key, index) will be called for each leaf child.

とあり、下記のようにしたらキーが振れた。
でも、indexを追加するとリストの値が入ってきたんだけどどういうことだろう。
オブジェクトの配列とかだったら要素のキーが入るということかな。

this.props.data.map(function (row, key)

Support map(), filter(), find() and forEach() on cursors · Issue #32 · dustingetz/react-cursor
https://goo.gl/XbbtLh

React.jsでPropやStateを使ってComponent間のやりとりをする - Qiita
http://goo.gl/EyFFCv

React.jsの地味だけど重要なkeyについて - Qiita
http://goo.gl/1wsyZH

ループで描画

基本はdomのパースとかはするなということかしら??

React.jsのJSXで条件分岐・繰り返しを記述する - Qiita
http://goo.gl/tKv7TE

仮想ではないhtml domを出力

JSXを使わずにreact-jadeで仮想DOM出力 - Qiita
http://goo.gl/fqKX7o

Dangerously Set innerHTML | React
https://goo.gl/c8urRH

function createMarkup() { return {__html: 'First · Second'}; };
<div dangerouslySetInnerHTML={createMarkup()} />

javascript - How to convert an HTML string to virtual DOM in React? - Stack Overflow
http://goo.gl/ONbgjc

あとから作ったdomをreactに取り込むことの苦労かな?
react-magic
DocParser

html-to-react
https://goo.gl/NeCi2J

関数を子コンポーネントから呼ぶ

トップレベルのreducterから渡されたpropsのなかの関数を、子のコンポーネントから呼び出したいのだが、、dataのように渡すのは気持ち悪い気がする。。

複数のコンポーネント | React
https://goo.gl/sHBpNc

React.js で親子関係にある component の更新順序 - scramble cadenza
http://goo.gl/tvezro

どうも、この例ではthis.incrementを渡しているみたい。

<Child increment={this.increment} />

ReactなComponent同士を連携させたい | moxt
https://goo.gl/CY2pMz

コンポーネント間の連携 | React 0.13 日本語リファレンス | js STUDIO
http://goo.gl/NIVC6s

この辺を見ると、propsでわたしたり、コールバックを渡すのはありっぽい。
さらに複雑な場合にはjQueryとかFluxをつかうとか書いてる。。

react-router v2.xとcontext | Solutionware開発ブログ
http://goo.gl/63iICd

contextを使用すると、データの流れが不明瞭になりますので、コードを理解するのが難しくなります。あなたのアプリでcontextを使うということは、グローバル変数としてstateを受け渡すのと同様のことなのです。

contextを使うと、バケツリレーをしなくていいらしいけど、推奨されないっぽい。

reduxの場合には、、dispatchが関係するとうまくいくかもしれない気がする。。

このへんのことは、reduxではなく、reactの原理としてpropsで伝播させることが影響しているのかな。
純粋なreduxだけだと、connect関数でpropsに紐付けるのではなくて、storeからディスパッチするっぽい??

store.dispatch(actionCreators());

TestLab = ReactRedux.connect(select)(TestLab);

ここまで調べて、、下記の記事に似たようなことがより深められているなと思った。

ReducerはfluxのStoreから部分的にロジックを切り出したもので、ActionからどのようにStoreの値へ落としこむかのロジックだと思います(値を書き換えないという違いはありますが)。fluxだとこれを完全にStoreの内部でやっていて、AppDispatcher.registerのcallbackでswitch文まみれになっている箇所がそれです。このサンプルなんかはReducerですがswitch文になっていてStoreのあの箇所とよく似ています。

上記のエントリでは、Immutable.jsを利用して回避したそうです。こんな感じになります。

state.getなどメソッド経由でアクセスするのが面倒ですが、Reactコンポーネント等の読み取りで利用する場合はtoJS()でオブジェクト化してアクセスする事もできます。

Object.assignを使うほうが一般的かもしれません。

ここまででは幾つかの選択肢が挙げられているが、、どうするべきか、、。
少なくともバケツリレーを回避することは状態変更などを伴わない、
コードがあまり複雑化しないのなら(?)アリっぽい気がする。

下記のようにpropsごと子に渡してみたら実行できたがダメかしら。。

<LinkList parent={this.props}/>

この辺がどうも気持ち悪い。。JSXで指定するのではなく、もっと頭の部分で管理したいんだけど。。
もしくは、親コンポーネントから許可するみたいな形式。
もういっか、結構な時間をかけて調べたし。そのうちわかるかもしれないし。

子コンポーネントの制御

この制御を親に移譲するという考え方だと、プロパティを引き継ぐ時に考え方が比較的しっくりする。
また、プロパティを受け渡す時にもそのまま受け渡すのではなく、
初期値として受け渡して、内部のプロパティ管理と区別すると良い。

React.jsでES6の文法を使って defaultProps などを設定する - Qiita
http://goo.gl/7KdegI

React.jsのProp - Qiita
http://goo.gl/21KzFE

React FluxアプリをReact Redux(ES2015)で書き直した時のメモ | 69log
https://goo.gl/n1lEHU

React.jsでPropやStateを使ってComponent間のやりとりをする - Qiita
http://goo.gl/EyFFCv

継承を使えば、親コンポーネントのsuperで関数を実行できるのかな。
これは、、どうなんだろう。

React.createClass versus extends React.Component @toddmotto
https://goo.gl/PUybgw

子コンポーネントをどうやってつくるか

  • カスタムコンポーネント(createClass)
    • さらにcreateElementする 本当の意味でクラスが必要なら意味がありそう
    • そのままJSXで使う this.propsを引き継ぎはJSX上で行うので面倒もあるかも
  • エレメント(createElement) JSXではあたいの引き渡しができないっぽいが、this.propsを引き継げる。 基本はこれでいいんじゃね。。。

this.props.dispatchを使う

pushState in Redux Router - (rudolph-miller)
https://goo.gl/2BsAkC

dispatchをconnectするときに使う。

時期では配列に含めたり、bindActionCreatorsと階層を分けるようにしたりしているが、そのままassign()でもいけるのはいけるっぽい。

return bindActionCreators(Object.assign({}, {dispatch: dispatch}, {doubleAsync: doubleAsync}), dispatch)

ハンドラーを一括で記述するのは下記みたいに記述するっぽい。三点リーダーは配列の展開だっけ。

export default connect(mapStateToProps, (dispatch) => ({
    ...bindActionCreators({fetchUsers}, dispatch), dispatch
}))(Users);

まあ、使う必要はないのかも。

非同期のActionCreatorのreact-thunk

下記参考したいのだが、まだわかってない。

日本語ドキュメント

Top-Level API | React
https://goo.gl/z1xknR

.htmlを-JP.htmlにすると日本語なのか。。でもサイドバーはいつも英語のリンク?なんで?
存在しない場合もあるな。。

bindActionCreators

ある程度必要なチェックなどをしつつ、
dispatchを自動でしてくれるのが主な動きの関数という認識でいいのかな。
じゃあ、使ったほうがいいか。。

/node_modules/redux/lib/bindActionCreators.js

シンプルな構成にするのも大事なのかも。

まだ、発展途上なんだなあ。。っと思った。
現状でも便利ではあるけど依存度が強くなりすぎないように気をつけないといけないのかもしれない。

ひとまず参考

便利さを求めて

redux/Examples.md at master · reactjs/redux
https://goo.gl/Monlqw

redux/examples at master · reactjs/redux
https://goo.gl/JYRlFJ

xgrommx/awesome-redux: Awesome list of Redux examples and middlewares
https://goo.gl/7bymxh

redux/examples/tree-view at master · reactjs/redux
https://goo.gl/4Xqy5m

Redux ちょっとわかってきたこと - Sphereとともに
http://goo.gl/7Q35Vm

日本語ドキュメント的なもの

React Native Redux ドキュメント 参考リンク集 - Qiita
http://goo.gl/tcN8iJ

チュートリアル | React
https://goo.gl/obkdbE

fb公式

勉強になりそうだけどまだ

リスト表示+ページングを実装しながらReact.jsを理解してみる - Qiita
http://goo.gl/XdhqND

React Style Guide を日本語訳した - Qiita
http://goo.gl/oxUVbj

フォームを作るのにハンドラー

Reactでリスト(配列)のFilter機能とSort機能を実装する | mae's blog
http://goo.gl/LXFPuJ

ソートとフィルターの実装でanglarと比較しつつ。。

すべてのReact.js初心者が知っておくべき9つのポイント - Qiita
http://goo.gl/lSQdrL

大事そう
proptypes
ステートレス
テスト駆動

プロトタイプのフロー

まだない

それるけどjsdoc

jsdocってモダン??

JSDoc使い方メモ - Qiita
http://goo.gl/84j9xC

Google JavaScript スタイルガイド - 日本語訳 - JSDocコメント
http://goo.gl/pxUIuQ

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4