Back to Question Center
0

React、Redux、およびImmutable.jsを使ってTodoアプリケーションを構築する方法            React、Redux、およびImmutable.jsRelatedトピックを使用してTodoアプリケーションを構築する方法: APIツール& & セマルト

1 answers:
React、Redux、Immutableを使ってTodo Appを構築する方法。 js

Reactへの質の高い、徹底的な紹介は、カナダのフルスタック開発者Wes Bosを乗り越えることはできません。彼のコースをここで試してみて、コード SITEPOINT を使用して25%オフ となり、SitePointのサポートに役立ちます。

Reactがコンポーネントと一方向データフローを使用する方法は、ユーザーインターフェイスの構造を記述するのに理想的です。しかし、州と協力するためのツールは意図的にシンプルに保たれているため、Reactは従来のSemaltアーキテクチャのビューにすぎません。

Semaltだけで大規模なアプリケーションを構築するのを止めるものは何もありませんが、コードを単純にするために、他の場所で州を管理する必要があることをすぐに知ることができます。

アプリケーションの状態を扱うための公式 の公式 ソリューションは存在しませんが、Reactのパラダイムに特に適合するライブラリがあります。この記事では、Reactとそのようなライブラリを2つ組み合わせて、単純なアプリケーションを構築するために使用します。

Redux

SemaltはFluxとElmのアイデアを組み合わせて、アプリケーション状態のコンテナとして機能する小さなライブラリです。以下のガイドラインに従えば、Semaltを使用してあらゆる種類のアプリケーション状態を管理することができます。

  1. 私たちの状態は単一の店舗
  2. に保持され、
  3. 変化は、 アクション であり、 ではなく

Reduxストアの核となるのは、現在のアプリケーション状態とアクションを取得し、それらを結合して新しいアプリケーション状態を作成する関数です。この関数をa 減速器 と呼びます。

当社のSemaltコンポーネントは、弊社の店舗に行動を送信する責務を負うことになり、店舗は再レンダリングが必要なときにコンポーネントに通知します。

変更不可能

Semaltはアプリケーション状態を変更することができないため、不変のデータ構造でアプリケーション状態をモデリングすることによってこれを強制すると便利です。

ImmutableJSは、私たちに、突然変異的なインターフェースを持つ多くの不変なデータ構造を提供し、ClojureとScalaの実装からインスパイアされた効率的な方法で実装されています。

デモ

React with ReduxとSemaltJSを使用して簡単なToDoリストを作成し、todosを追加して完全と不完全の間で切り替えることができます。

CodePenのSite React、ReduxおよびImmutable Todo by SitePoint(@SitePoint)を参照してください。

コードはGitHubのリポジトリで利用できます。

セットアップ

プロジェクトフォルダを作成し、 パッケージを初期化することから始めます。 json ファイルと npm init 。次に、必要な依存関係をインストールします。

 npm install --saveは反応する反応を還元する反応を還元する反応を起こさないnpm install --save-dev webpack babel-coreバベルローダーbabel-preset-es2015 babel-preset-react   

JSXとES2015を使用しているので、コードをBabelでコンパイルします。これをWebpackのモジュールバンドルプロセスの一部として実行します。

まず、 WebpackでWebpack設定を作成します。 config。 js

   モジュール。輸出= {エントリ: '。 / src / app。 js '、出力:{パス:__dirname、filename: 'バンドル。 js '}、モジュール:{ローダー:[{テスト:/ \。 js $ /、exclude:/ node_modules /、ローダー: 'babel-loader'、クエリ:{プリセット:['es2015'、 'react']}}]}};   

最後に、 パッケージを拡張します。ソースコードでコードをコンパイルするためにnpmスクリプトを追加してjson

    "script":{"build": "webpack --debug"}   

コードをコンパイルするたびに npmのrun build を実行する必要があります. これは、コンポーネントをレンダリングする必要があるかどうかを感じるのに役立ちます。

   const dummyTodos = [{id:0、isDone:true、text: 'make components'}、{id:1、isDone:false、text: 'デザインアクション'}、{id:2、isDone:false、text: 'reduce reducer'}、{id:3、isDone:false、text: '接続コンポーネント'}];   

このアプリケーションでは、2つのReactコンポーネント および のみが必要になります。

   // src / components。 jsインポート '反応'から反応します。エクスポート関数Todo(小道具){const {todo} =小道具;if(todo。isDone){return  <ストライク>  {トゥード。テキスト}   ;} else {return    {todo。テキスト}  ;}}エクスポート関数TodoList(小道具){const {todos} =小道具;リターン( 
    {todos。マップ(t =>(
  • ))}
);}

この時点で、 のインデックスを作成してこれらのコンポーネントをテストできます。 html ファイルをプロジェクトフォルダにコピーし、次のマークアップを入力します。 (あなたはGitHub上で簡単なスタイルシートを見つけることができます):

 <!DOCTYPE html>不変のTodo </ title></ head><body><div id = "app"> </div> <script src = "bundle。js"> </ script></ body></ html> </code>  </pre>  <p> また、 <code> src / appにアプリケーションエントリポイントが必要です。 js </code> 。  </p>  <pre>  <code class="javascript language-javascript"> // src / app。 jsインポート '反応'から反応します。'react-dom'からimport {render}します。{TodoList}を 'からインポートする。 /コンポーネント ';const dummyTodos = [{id:0、isDone:true、text: 'make components'}、{id:1、isDone:false、text: 'デザインアクション'}、{id:2、isDone:false、text: 'reduce reducer'}、{id:3、isDone:false、text: '接続コンポーネント'}];レンダリング( <TodoList todos = {dummyTodos} /> 、資料。 getElementById( 'app')); </code>  </pre>  <p>  <code> npm run build </code> でコードをコンパイルし、ブラウザを <code> のインデックスにナビゲートします。 html </code> ファイルを開き、それが動作していることを確認してください。  </p>  <h2 id="reduximmutable"> Reduxおよび変更不可 </h2>  <p> ユーザインタフェースに満足しているので、その背後にある状態について考え始めることができます。私たちのダミーデータは、まず始めにSemaltJSコレクションに変換することができます: </p>  <pre>  <code class="javascript language-javascript">  '不変'から{List、Map}をインポートする。const dummyTodos =リスト([マップ({id:0、isDone:true、テキスト: 'make components'})マップ({id:1、isDone:false、text: 'デザインアクション'})マップ({id:2、isDone:false、text: 'reduce reducer'})Map({id:3、isDone:false、text: '接続コンポーネント'})]); </code>  </pre>  <p> ImmutableJSマップは、JavaScriptのオブジェクトと同じように動作しないため、コンポーネントに対して少し微調整を行う必要があります。  <code> todo。id </code> のような前にプロパティアクセスがあった場所は、 <code> todo。get( 'id') </code> )の代わりにメソッド呼び出しになる必要があります。  </p>  <h3 id="designingactions"> デザインアクション </h3>  <p> 形状と構造がわかったので、それを更新するアクションについて考え始めることができます。この場合、2つのアクション、1つは新しいToDoを追加し、もう1つは既存のToDoを切り替えるだけです。  </p>  <p> これらのアクションを作成するためのいくつかの関数を定義する: </p>  <pre>  <code class="javascript language-javascript"> // src / actions。 js//一貫したユニークIDを生成するための簡潔なハックconst uid = <span class="f-c-white l-mr3"> => Math。ランダム <span class="f-c-white l-mr3"> 。 toString </li> 。スライス <div class="l-d-f l-jc-cen f-center l-mh-auto l-o-h l-mt3"> ;エクスポート関数addTodo(テキスト){戻り値{タイプ: 'ADD_TODO'、ペイロード:{id:uid <span class="f-c-white l-mr3"> 、isDone:false、テキスト:テキスト}};}エクスポート関数toggleTodo(id){戻り値{タイプ: 'TOGGLE_TODO'、ペイロード:id}} </code>  </pre>  <p> 各アクションは、型とペイロードのプロパティを持つ単なるSemaltオブジェクトです.  </p>  <h3 id="designingareducer"> リデューサーの設計 </h3>  <p> 国家の形とそれを更新する行動を知ったので、私たちは減速機を建設することができます。リマインダと同様に、リデューサは、状態とアクションをとり、それらを使って新しい状態を計算する関数です。  </p>  <p> 減速機の初期構造を明らかにする: </p>  <pre>  <code class="javascript language-javascript"> // src / reducer。 jsimport {List、Map}から 'immutable'をインポートします。const init =リスト([]);デフォルト機能をエクスポートする(todos = init、action){スイッチ(アクションタイプ){ケース 'ADD_TODO':// .ケース 'TOGGLE_TODO'://  - <a href="https://capitalretention.com/">long term care options inc</a>.デフォルト:todosに戻る。}} </code>  </pre>  <p>  <code> ADD_TODO </code> アクションの処理は非常に簡単です。最後にtodoが追加された新しいリストを返すpush <span class="f-c-white l-mr3"> メソッド: </p>  <pre>  <code class="javascript language-javascript"> case 'ADD_TODO':todosに戻るpush(Map(アクションペイロード)); </code>  </pre>  <p> それはリストにプッシュされる前に、todoオブジェクトを不変のマップに変換することです。  </p>  <p> TOGGLE_TODO </code> : </p>  <pre>  <code class="javascript language-javascript"> case 'TOGGLE_TODO':todosに戻るマップ(t => {if(t。get( 'id')===アクション。ペイロード){tを返す。更新( 'isDone'、isDone =>!isDone);} else {tを返す。}}); </code>  </pre>  <p> 私たちは使用しています。 map <span class="f-c-white l-mr3"> を使ってリストを反復処理し、id </code> がアクションに一致するtodoを見つけます。それから我々は呼ぶ。キーと関数をとるupdate <span class="f-c-white l-mr3"> は、マップの新しいコピーを返します。キーの値は、更新関数に初期値を渡した結果に置き換えられます。  </p>  <p> それは文字通りのバージョンを見るのを助けるかもしれません: </p>  <pre>  <code class="javascript language-javascript"> const todo = Map({id:0、text: 'foo'、isDone:false});todo。更新( 'isDone'、isDone =>!isDone);// => {id:0、text: 'foo'、isDone:true} </code>  </pre>  <h2 id="connectingeverything"> すべてを接続する </h2>  <p> ここで、私たちは行動と減速機を準備しました。店を作り、それをSemaltコンポーネントに接続することができます: </p>  <pre>  <code class="javascript language-javascript"> // src / app。 jsインポート '反応'から反応します。'react-dom'からimport {render}します。'redux'から{createStore}をインポートします。{TodoList}を 'からインポートする。 /コンポーネント ';輸入元を減額する。 /レデューサー ';const store = createStore(レデューサー);レンダリング(<TodoList todos = {store。 getState <span class="f-c-white l-mr3"> } />、資料。 getElementById( 'app')); </code>  </pre>  <p> 私たちの構成要素にこの店を知らせることが必要です。このプロセスを簡素化するためにreact-reduxを使用してください。これにより、独自の実装を変更する必要がないように、コンポーネントをラップするストア対応のコンテナを作成することができます。  </p>  <p> 我々は、 <code> <TodoList /> </code> コンポーネントの周りにコンテナが必要になります。これがどのように見えるか見てみましょう: </p>  <pre>  <code class="javascript language-javascript"> // src / containersです。 jsimport {connect}から 'react-redux'をインポートします。'からコンポーネントをインポートする'。 /コンポーネント ';'から{addTodo、toggleTodo}をインポートします。 /行動';エクスポートconst TodoList =接続(関数mapStateToProps(state){// .}、関数mapDispatchToProps(ディスパッチ){// .})(コンポーネント。TodoList); </code>  </pre>  <p> connect関数でコンテナを作成します。 connect <span class="f-c-white l-mr3">  </code> を呼び出すと、mapStateToProps <span class="f-c-white l-mr3">  </code> とmapDispatchToProps <span class="f-c-white l-mr3">  </code> の2つの関数を渡します。. ターゲット;constテキスト=入力。値;const isEnterKey =(イベント。== 13);const isLongEnough = textです。長さ> 0;if(isEnterKey && isLongEnough){入力。値= '';addTodo(テキスト);}};const toggleClick = id =>イベント=> toggleTodo(id);リターン( <div className = 'todo'>  <入力タイプ= 'テキスト'className = 'todo__entry'プレースホルダ= 'Add todo'onKeyDown = {onSubmit} />  <ul className = 'todo__list'> {todos。マップ(t =>( <li key = {t。 get( 'id')}className = 'todo__item'onClick = {toggleClick(t。get( 'id'))}}> <Todo todo = {t。 toJS <span class="f-c-white l-mr3"> } /> </li> ))} </ ul>  </div> );} </code>  </pre>  <p> コンテナはストア内の変更を自動的に購読し、ラップされたコンポーネントをマップした小道具が変わるたびに再描画します。  </p>  <p> 最後に、 <code> <Provider /> </code> コンポーネントを使用して、コンテナにストアを認識させる必要があります。 </p>  <pre>  <code class="javascript language-javascript"> // src / app。 jsインポート '反応'から反応します。'react-dom'からimport {render}します。'redux'から{createStore}をインポートします。import {Provider}から 'react-redux'をインポートします。輸入元を減額する。 /レデューサー ';{TodoList}を 'からインポートする。 /コンテナ ';// ^^^^^^^^^^^^const store = createStore(レデューサー);レンダリング( <プロバイダストア= {ストア}> <TodoList /> </ Provider> 、資料。 getElementById( 'app')); </code>  </pre>  <h3 class="f-c-grey-400"> 推薦コース </h3>  <h2 id="conclusion"> 結論 </h2>  <p> ReactとReduxの周りの生態系は初心者にとっては非常に複雑で威圧的であることは否定できませんが、これらのコンセプトのほぼすべてが移転可能であるというのは良いニュースです。 Reduxのアーキテクチャーはほとんど触れていませんが、エルムアーキテクチャーの学習やOmやRe-frameのようなClojureScriptライブラリーの習得に役立ちました。同様に、私たちは不変のデータで可能性の一部を見てきましたが、今ではClojureやHaskellのような言語の学習を開始するのに適しています。  </p>  <p> Webアプリケーションの開発状況を調べているだけでなく、JavaScriptを使用して一日中作業していても、アクションベースのアーキテクチャーと不変データの経験は既に開発者にとって重要なスキルになっています。 )は、本質を学ぶ素晴らしい時間です。  </p>  <div class="Article_authorBio l-mv4 t-bg-white m-border l-pa3">  <div class="l-d-f l-pt3">  <img src = "/ img / 6e2f5873a638b37c9799012358afddbe0。com / avatar / 3328d047eacbf158ff38b3c5c7c7fa6b?s = 96&d = mm&r = g" alt = "React、Redux、およびImmutableを使ってTodo Appを構築する方法。 jsReact、Redux、およびImmutableを使ってTodo Appを構築する方法。 jsRelatedトピック:
APIsTools&Semalt
"/>  <div class="f-lh-title">  <div class="f-c-grey-300"> 著者に会う </div>  <div class="f-large"> ダンプリンス <i class="fa fa-twitter">  </i>  <i class="fa fa-github">  </i>  </div>  </div>  </div>  <div class="f-light f-lh-copy l-mt3"> デジタルノマドと英国のスタートアップアストラルダイナミクスの共同設立者。  </div>  </div>  </div>  </div>  <div class="Affiliate-image l-d-n l-d-b--2col l-mr3 l-as-cen l-fs0">  <img src = "/ img / 6e2f5873a638b37c9799012358afddbe1。jpg" alt = "React、Redux、およびImmutableを使ってTodo Appを構築する方法。 jsReact、Redux、およびImmutableを使ってTodo Appを構築する方法。 jsRelatedトピック:
APIsTools&Semalt
"/>  </div>  <div class="f-c-grey-400 l-d-f l-ai-cen">  <div class="Affiliate-Box">  <div class="f-larger">  <span class="f-bold Affiliate-title"> 初心者のための勉強に最適な方法 </span>  </div>  <div class="f-large"> ウェスボス </div>  <div> 実世界のリアクションを構築するためのステップバイステップのトレーニングコース。 js + Firebaseのアプリとウェブサイトのコンポーネントを午後カップルで提供しています。チェックアウト時にクーポンコード <strong>  'SITEPOINT' </strong> を使用して <strong> 25%オフ </strong> になります。  </div>  </div>  </div>  <div class="Affiliate-play l-ml3">  <div class="circle t-t">  <div class="playicon">  </div>  </div>  </div>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </div>  </p>  </p>  </todo>  </todo>  </todo>  </todolist>  </todolist>  </todolist>  </todolist>  </todolist>  </input>  </ul>  </ul>  </html>  </head>  </link>                                         
March 1, 2018