React.jsとImmutable.jsを使ったTODOアプリのサンプルソースの紹介です。
🍄 package.json
の準備とライブラリ導入
React.js、Redux、Immutable.jsを使ってTODOアプリケーションを作る手順を紹介します。
mkdir todo && cd todo
yarn init
yarn add react react-dom redux react-redux immutable
yarn add --dev webpack babel-loader babel-preset-es2015 babel-preset-react
|
package.json
にwebpack用の設定を追記します。
"script": { "build": "webpack --debug" }
|
🎉 webpack.config.js
webpack.config.js
にwebpackのconfigを準備します。
module.exports = { entry: './src/app.js', output: { path: __dirname, filename: 'bundle.js' }, module: { loaders: [ { test: /\.js$/, exclude: /node_modules/, loader: 'babel', query: { presets: [ 'es2015', 'react' ] }, } ] }, resolveLoader: { moduleExtensions: ['-loader'] } };
|
🍣 index.html
プロジェクト直下に確認用のindex.html
を作成します。
<html> <head> <link rel="stylesheet" href="style.css"> <title>Immutable Todotitle> head> <body> <div id="app">div> <script src="bundle.js">script> body> html>
|
😼 app.js
エントリポイントの./src/app.js
。Provider
によってstore
を認識させます。
import React from 'react'; import { render } from 'react-dom'; import { createStore } from 'redux' import { Provider } from 'react-redux'; import reducer from './reducer'; import { TodoList } from './containers';
const store = createStore(reducer);
render( </Provider>, document.getElementById('app') );
|
😸 actions.js
アクションを管理する./src/actions.js
を作成します。
const uid = () => Math.random().toString(34).slice(2);
export function addTodo(text) { return { type: 'ADD_TODO', payload: { id: uid(), isDone: false, text: text } }; }
export function toggleTodo(id) { return { type: 'TOGGLE_TODO', payload: id } }
|
🗻 reducer.js
アクションと現在のstateから新しいstateを生成する./src/reducer.js
を作成します。
import { List, Map } from 'immutable';
const init = List([]);
export default function(todos=init, action) { switch(action.type) { case 'ADD_TODO': return todos.push(Map(action.payload)); case 'TOGGLE_TODO': return todos.map(t => { if(t.get('id') === action.payload) { return t.update('isDone', isDone => !isDone); } else { return t; } }); default: return todos; } }
|
🚌 components.js
実際のコンポーネントを./src/components.js
に作成します。コンポーネントにはTodoList
とTodo
が存在します。
🐝 container.js
コンポーネントがstoreを認識するために、コンポーネントをラップするコンテナ./src/container.js
を作成します。
import { connect } from 'react-redux'; import * as components from './components'; import { addTodo, toggleTodo } from './actions';
export const TodoList = connect( function mapStateToProps(state) { return { todos: state }; }, function mapDispatchToProps(dispatch) { return { addTodo: text => dispatch(addTodo(text)), toggleTodo: id => dispatch(toggleTodo(id)) }; } )(components.TodoList);
|
🐞 参考リンク
🖥 VULTRおすすめ
「VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。
最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!