- html, cssコーディング
- 静的コンポーネント作成
- store設計 (JSON)
- storeを参考にactionTypesを作成
- actionTypesからactionCreatorsを実装
- XHRはmodelに
- actionCreatorsreducerを作成
- mountComponentとmountComponentWithRedux関数
- インタラクションを実装
- jestとenzymeでテスト
書こう
作ろう
todoリストの場合
{
items: [
{ title: "some task", doneAt: "2016-12-27" },
...
],
isProcessing: false
}
export const ADD_ITEM = "ADD_ITEM";
export const DONE_ITEM = "DONE_ITEM";
export const DELETE_ITEM = "DELETE_ITEM";
export const ON_PROCESSING = "ON_PROCESSING";
export const OFF_PROCESSING = "OFF_PROCESSING";
import * as t from "./action-types";
export function addItem(item) {
return { type: t.ADD_ITEM, item };
}
...
redux-thunkを使う前提
import Item from "../models/item";
export function addItem(item) {
return (disptach, getState) => {
const { isProcessing } = getState();
if (isProcessing) { return; }
dispatch(onProcessing());
Item.create(item).then((itemModel) => {
dispatch({ type: t.ADD_ITEM, itemModel });
dispatch(offProcessing());
});
};
}
export default class Item {
static create(attrs) {
return axios.post(`/items.json`, attrs).then((res) => new Item(res.data));
}
constructor(attrs) {
this.attrs = attrs;
}
get id() { return this.attrs.id; }
get body() { return this.attrs.body; }
}
import * as t from "./action-types";
function items(state = [], action) {
const { type, itemModel } = action;
switch(type) {
case t.ADD_ITEM:
return state.concat([itemModel]);
...
default:
return state;
}
}
がんばろう
enzymeでReactのテストをしてみた
enzymeでReactコンポーネントのイベントハンドラをテストしてみた
俺の最近のRailsのJS開発環境を教えてやる
testHelper.js