公式サイトのチュートリアルでは Todo App の Example が載っているのでそれを写経するのが良いのですがちょっと長いのでそれを短くした Memo アプリを紹介します。
準備
mkdir practice-react-redux && cd $_
mkdir src www test
mkdir src/{actions,components,containers,reducers}
npm init -f
npm install --save-dev mocha webpack webpack-dev-server
npm install --save-dev babel-core babel-loader babel-preset-es2015
npm install --save-dev babel-preset-stage-0 babel-polyfill
npm install --save-dev babel-preset-react
create webpack.config.js:
const path = require('path');
const webpack = require('webpack');
module.exports = {
entry: [path.resolve('src/index.js')],
output: {
path: path.resolve('www'),
filename: 'bundle.js',
},
devtool: 'inline-source-map',
devServer: {
contentBase: path.resolve('www'),
port: 3000,
hot: false,
inline: true,
colors: true
},
resolve: {
extensions: ['', '.js'],
},
module: {
loaders:[
{ test: /\.js$/, exclude: /node_modules/, loader: 'babel' },
]
}
};
create babelrc:
{
"presets": ["react", "es2015", "stage-0"]
}
install
npm install --save react react-redux redux
action を定義
create src/actions/index.js:
let nextId = 1
export const addMemo = (text) => {
return {
type: 'ADD_MEMO',
id: nextId++,
text
}
}
reducer を定義
create src/reducers/index.js
import { combineReducers } from 'redux'
const memo = (state = {}, action) => {
switch (action.type) {
case 'ADD_MEMO':
return {
id: action.id,
text: action.text
}
default:
return state
}
}
const memos = (state = [], action) => {
switch (action.type) {
case 'ADD_MEMO':
return [
...state,
memo(undefined, action)
]
default:
return state
}
}
const memoApp = combineReducers({
memos
})
export default memoApp
ここまで作った部分は redux の箇所なのでテストします。途中で動作確認しないで写経すると効率が悪いので。ここではブラウザでテストするの面倒なので node でテストしています。
crete test/test_reducers.js
import assert from 'assert'
import { createStore } from 'redux'
import { addMemo } from '../src/actions'
import memoApp from '../src/reducers'
describe('test', () => {
it('store', () => {
let store = createStore(memoApp)
store.dispatch(addMemo('textA'))
store.dispatch(addMemo('textB'))
assert.deepEqual(store.getState().memos, [ { id: 1, text: 'textA' }, { id: 2, text: 'textB' } ]);
assert.ok(true);
});
});
実行します。
% NODE_ENV=test $(npm bin)/mocha --compilers js:babel-register
package.json に記述して npm test できるようにしておくと良いでしょう。
まとめ
という事で何となく action と reducers を定義して dispatch(addMemo(value)) と store.getState() をどこかに書けばデータの受け渡しができそうですね。
次回へ続く