狠狠撸
Submit Search
搁别诲耻虫について
?
4 likes
?
3,951 views
Yuusuke Takeuchi
Follow
年末JavaScript祭ゆく年くる年 in IDCフロンティアのLT用資料です。
Read less
Read more
1 of 26
Download now
Downloaded 10 times
More Related Content
搁别诲耻虫について
1.
搁别诲耻虫について 年末JavaScript祭ゆく年くる年?in IDCフロンティア 2015/12/26 竹内?佑介
2.
自己紹介 竹内?佑介 プログラマーやってます 最近Reduxばっかやった ので、そろそろ別のことを やりたいです 今期の嫁はチノちゃんです
3.
大規模javascript案件で こんなこと困ってませんか
4.
View、イベントハンドラ、 ロジックが入り乱れて カオスコードに
5.
ロジックが特定のDom構造を 前提にしているため? 再利用&メンテナンス不可能
6.
その課題、Reduxなら 解決できるかも
7.
Reduxとは? fluxパターンを実装した、フレームワークの一種 ReduxはView以外を提供している http://redux.js.org/ ここを提供する
8.
fluxの基本的な考え方 描画の元となる pureオブジェクト storeを元にDomを 描画する
9.
fluxの基本的な考え方 viewまたは AJAX通信がアクション を発行 アクションに応じて Storeを変更する
10.
Reduxの基本 Store? State(基本となるデータいわゆるModel)を持つ ActionCreator(fluxだとAction)? イベント発行、サーバとの通信 Reducer(fluxだとDispatcher)? Actionに応じてStateを更新
11.
コードを見てイメージを 掴みましょう
12.
コード例 Action Creator function
addTodo(text) { return { type: ADD_TODO, text } } アクション用オブジェクトを変えす関数を書く 返すオブジェクトは上記パターンでなくてもOK 非同期アクションは次で説明
13.
コード例 Action Creator(非同期) export
const REQUEST_POSTS = 'REQUEST_POSTS' function requestPosts(reddit) { return { type: REQUEST_POSTS, reddit } } export const RECEIVE_POSTS = 'RECEIVE_POSTS' function receivePosts(reddit, json) { return { type: RECEIVE_POSTS, reddit, posts: json.data.children.map(child => child.data), receivedAt: Date.now() } } export function fetchPosts(reddit) { return dispatch => { dispatch(requestPosts(reddit)) return fetch(`http://www.reddit.com/r/${reddit}.json`) .then(response => response.json()) .then(json => dispatch(receivePosts(reddit, json)) ) } }
14.
コード例 Action Creator(非同期) export
function fetchPosts(reddit) { return dispatch => { dispatch(requestPosts(reddit))?// リクエスト開始アクション return fetch(`http://www.reddit.com/r/${reddit}.json`) .then(response => response.json()) .then(json => dispatch(receivePosts(reddit, json)) // リクエスト完了アクション ) } } 非同期関数の前で1回、コールバックが呼ばれたらさら に1回別のアクション関数を呼ぶ ↑の挙動をするためにredux-thunkと言うミドルウェ アを使う? https://github.com/gaearon/redux-thunk
15.
コード例 Reducer アクションに応じて状態を変化させる関数を書く Reducerは階層化、モジュール化することができる function todoApp(state
= initialState, action) { switch (action.type) { case SET_VISIBILITY_FILTER: return Object.assign({}, state, { visibilityFilter: action.filter }) default: return state } }
16.
コード例?階層化したReducer 長くなったので次のページで
17.
export default function
todos(state = [], action) { switch (action.type) { case 'ADD_TODO': return state.concat([ action.text ]) default: return state } } export default function counter(state = 0, action) { switch (action.type) { case 'INCREMENT': return state + 1 case 'DECREMENT': return state - 1 default: return state } } import { combineReducers } from 'redux' import todos from './todos' import counter from './counter' export default combineReducers({ todos, counter })
18.
コード例?階層化したReducer ↑の感じで分割したReducerをcombineReducerでまと める Stateの各メンバがconbineReducersに定義したReducer 名に対応している(次で説明) import { combineReducers
} from 'redux' import todos from './todos' import counter from './counter' export default combineReducers({ todos, counter })
19.
コード例?階層化したReducer export default combineReducers({ todos, counter }) //
全体のState { todos: [ ”朝ごはんを食べる”, ”js祭に参加する”, ], counter } こんな感じでStateとconbineReducersが対応してい る
20.
コード例 Store ここら辺はほぼ定型です ぶちゃけ1回書いたら後はほとんど変えないです import {
createStore } from 'redux' import todoApp from './reducers' // Soreを宣言、Reducerはここで渡す let store = createStore(todoApp); // アクション発行 store.dispatch(addTodo('')); // stateに変化があれば、それをViewに伝える sore.subscribe(()=> { // 現在のStateを取得 var state = store.getState(); // ViewにStateを渡す View(state); });
21.
Viewには何を使えばいいの React.jsを使うことが多いらしいです Reactを使う場合、Viewに状態を持たせたく ないので極力Stateを使わないようにします 理想では同じプロパティを渡されたら、いつで も同じDomをレンダリングするということ
22.
Reduxを入れてよかったこと fluxパターンなだけあって、コードの見通しが 良くなった 画面の再利用性が高まった Reduxで作った画面をダイアログ化するという ことをやりましたが、比較的簡単に実現できま した
23.
Reduxを使ってみての課題 Dom描画がすごく遅くなることがあった バリデーションを実装したけど、入力が完了す るたびに再描画処理が走る 要素が3000個以上もあると、Reactの Shadow Domもあてにならない
24.
Reduxを始めるには 当たり前ですが、grunt、gulpなどのフロン トエンドビルド環境が必要です es6は必須ではないですが、サンプルはes6で 書かれたものが多いので導入した方がスムーズ です
25.
Reduxを勉強するには 公式ドキュメントを読めば、大体分かります? http://redux.js.org/index.html basic、Async Actionを3時間くらいかけて 読んでイメージを掴みました
26.
ご清聴ありがとう ございました
Download