{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/why-i-need-redux-with-react-new-context/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"ed0c25cb-9098-5654-a937-17d976730ab7","excerpt":"Reduxの新しいContext APIが発表され、2ヶ月くらいが経過した。 — React’s ⚛️ new Context API – DailyJS – Medium 私は少しバージョンの古いReactを主に使っているため、しばらく情報を追わずにいたが、 — Reactの新Context APIとRedux is…","html":"<p>Reduxの新しいContext APIが発表され、2ヶ月くらいが経過した。</p>\n<blockquote>\n<p>— <a href=\"https://medium.com/dailyjs/reacts-%EF%B8%8F-new-context-api-70c9fe01596b\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React’s ⚛️ new Context API – DailyJS – Medium</a></p>\n</blockquote>\n<p>私は少しバージョンの古いReactを主に使っているため、しばらく情報を追わずにいたが、</p>\n<blockquote>\n<p>— <a href=\"https://medium.com/@terrierscript/react%E3%81%AE%E6%96%B0context-api%E3%81%A8redux-is-dead%E3%81%AF%E3%81%A9%E3%81%86%E9%96%A2%E4%BF%82%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B-6d12a32f2f0c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Reactの新Context APIとRedux is deadはどう関係するのか？ – terrierscript – Medium</a></p>\n</blockquote>\n<blockquote>\n<p>— <a href=\"https://qiita.com/loverails/items/50126e874b24ff984471\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React v16で実装された new Context APIを使って、Reduxへ別れを告げる - Qiita</a></p>\n</blockquote>\n<p>などの記事が登場するようになったので、自分は新しいContext APIとどう向き合うのかを考えてみた。</p>\n<!--more-->\n<h2 id=\"tldr\" style=\"position:relative;\"><a href=\"#tldr\" aria-label=\"tldr permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TL;DR</h2>\n<p>新しいContext APIはとても有用で、それ自体は活用しようと思う。\nただしContext APIがReduxを置き換えるものではないと思っており、引き続きReduxを使用する</p>\n<h2 id=\"シンプルな利用方法\" style=\"position:relative;\"><a href=\"#%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95\" aria-label=\"シンプルな利用方法 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>シンプルな利用方法</h2>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> Provider<span class=\"token punctuation\">,</span> Consumer <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Counter</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n  <span class=\"token operator\">&lt;</span>Consumer<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> state<span class=\"token punctuation\">,</span> increment <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>React<span class=\"token punctuation\">.</span>Fragment<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span>Count<span class=\"token operator\">:</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>state<span class=\"token punctuation\">.</span>count<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>increment<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>React<span class=\"token punctuation\">.</span>Fragment<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n  <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Consumer<span class=\"token operator\">></span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">App</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  \tcount<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function-variable function\">increment</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> count<span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">+</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Provider value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>\n        state<span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">,</span>\n        increment<span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>increment<span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Counter <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Provider<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\nReactDOM<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>\n  <span class=\"token operator\">&lt;</span>App <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">,</span>\n  document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'container'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>このように使える。\n<code>Provider</code>, <code>Consumer</code>という二役に分かれ、とても宣言的なAPIになったと思う。</p>\n<p>これまでのContextは、<code>childContextTypes</code>、<code>getChildContext</code>、<code>contextTypes</code>など色々なメソッドをコンポーネントに実装して利用する、実質的なインタフェースとして機能していた。<br>\nこの方式ではprop-typesの利用も必須であるため、せっかくReact本体とは切り離されたライブラリをわざわざnpm installして利用することを強いられていた。<br>\nそれに比べると、はるかに扱いやすいAPIに変わったと思う。</p>\n<p>軽いstate操作なら確かにこれだけでも足りるかもしれないし、多言語対応（文言定義）やテーマなど、宣言的に渡すデータにおいてはとても有用だと思う。</p>\n<p>では、<strong>Reduxはこれだけで無くすことができるのだろうか？</strong>\n私は違うと思う。</p>\n<h2 id=\"context-apiだけでconnectを実装してみる\" style=\"position:relative;\"><a href=\"#context-api%E3%81%A0%E3%81%91%E3%81%A7connect%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B\" aria-label=\"context apiだけでconnectを実装してみる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Context APIだけでconnectを実装してみる</h2>\n<p>Redux（というかReact Redux）を「どこでもconnectできてstateを共有できるHoC」と捉えると、Contextさえあれば事足りているのかもしれない。<br>\nContext APIだけを用いて、React Reduxのconnectっぽい関数を実現するとしたら、例えばこんな感じで雑に実装できる。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">connectLike</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">mapStateToProps<span class=\"token punctuation\">,</span> mapDispatchToProps</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">Component</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n  <span class=\"token operator\">&lt;</span>Consumer<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">context</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Component\n        <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>props<span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token function\">mapStateToProps</span><span class=\"token punctuation\">(</span>context<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token function\">mapDispatchToProps</span><span class=\"token punctuation\">(</span>context<span class=\"token punctuation\">.</span>dispatch<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n  <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Consumer<span class=\"token operator\">></span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>これを利用して先ほどのサンプルコードを置き換えると、このように書けると思う</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">CounterComponent</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> count<span class=\"token punctuation\">,</span> increment <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n  <span class=\"token operator\">&lt;</span>React<span class=\"token punctuation\">.</span>Fragment<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span>Count<span class=\"token operator\">:</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>count<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>increment<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>React<span class=\"token punctuation\">.</span>Fragment<span class=\"token operator\">></span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">mapStateToProps</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> count<span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>count <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">mapDispatchToProps</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">dispatch</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token function\">increment</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// action, reducerを端折ったかなり簡素な実装</span>\n    <span class=\"token function\">dispatch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token operator\">...</span>state<span class=\"token punctuation\">,</span>\n      count<span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> Counter <span class=\"token operator\">=</span> <span class=\"token function\">connectLike</span><span class=\"token punctuation\">(</span>mapStateToProps<span class=\"token punctuation\">,</span> mapDispatchToProps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>CounterComponent<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">App</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  \tcount<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function-variable function\">reduce</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">reducer</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span>reducer<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Provider value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>\n        state<span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">,</span>\n      \tdispatch<span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>reduce<span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Counter <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Provider<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reduxの処理の大部分を端折って実現したが、connectLikeの使い心地はそれっぽいものにはなったと思う。\nでは、**Reduxを用いてやりたいことは、たったこれだけなのだろうか。**私は違うと思う。</p>\n<h2 id=\"reduxミドルウェア\" style=\"position:relative;\"><a href=\"#redux%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2\" aria-label=\"reduxミドルウェア permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reduxミドルウェア</h2>\n<p>私は、state管理やFluxアーキテクチャを提供してくれる他に、何よりミドルウェアがReduxの魅力だと思っている。</p>\n<p>まず、3rdパーティのミドルウェアが豊富にある。<br>\n例えば、<code>redux-logger</code>のように開発時に便利なロガーだったり、<code>redux-thunk</code>のような非同期に対するアプローチ、<code>redux-persist</code>のようなstateの永続化などが挙げられる。</p>\n<p>ではContextを内部的に包み隠してくれる3rdパーティのライブラリがたくさん登場したらReduxは不要なのだろうか。<br>\nそれでもまだ私はReduxに価値があると思っている。</p>\n<p>なぜなら、3rdパーティなミドルウェアが豊富にあることもさることながら、<br>\n<strong>Actionそのものと、Action handlerを分離するためにRedux Middlewareを利用している</strong>からだ。</p>\n<h2 id=\"actionとaction-handler\" style=\"position:relative;\"><a href=\"#action%E3%81%A8action-handler\" aria-label=\"actionとaction handler permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ActionとAction handler</h2>\n<p>React Nativeの開発をしていると、どうしてもプラットフォームに依存する処理が多数登場する。<br>\n例えばHTTP通信やPush通知、Alert、AsyncStorageなど。<br>\nネイティブに限らず、webでもAjax、LocalStorageやWebWorkerなど、プラットフォームに依存した処理は登場すると思う。</p>\n<p>これらの処理がロジックの中に混じっていると非常にテストがしにくい。メンテナンスしにくく気軽じゃないテストになる。<br>\nこういったプラットフォームに依存した処理をMiddleware側に逃して、ActionCreatorやThunkActionはUniversalに書いておくと、とてもテストがしやすい。</p>\n<p>例えばアラートを抽象化するとこのような感じにできると思う。<br>\nこのアクションがdispatchされると、別途書いてあるMiddleware側でアラートを表示するように作れる。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">dispatch</span><span class=\"token punctuation\">(</span><span class=\"token function\">feedback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    title<span class=\"token operator\">:</span> <span class=\"token string\">'エラーが起こった'</span><span class=\"token punctuation\">,</span>\n    message<span class=\"token operator\">:</span> error<span class=\"token punctuation\">.</span>message<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>このようにプラットフォームに依存した処理をAction creatorの中に直接書かずに、Middlewareの中に書く。\nそうするとMiddlewareをapplyしなければどの環境でも動く処理になり、「dispatchされたアクションは何か？」にだけ注力すればよくなる。</p>\n<p>例が少なくて恐縮だが、ミドルウェアにプラットフォームへの依存を閉じ込めて使いたい私にとって、\n<strong>Context APIはReduxを置き換えるものではない</strong>と思った。</p>\n<p>なお、Reduxに過度に拘っているわけではない。ミドルウェアを扱う処理は<a href=\"https://github.com/reactjs/redux/blob/a804207a890e40668643700d81f6a5c7cb78a9dc/src/applyMiddleware.js#L19-L42\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">たかだか20行程度</a>なので、いざとなればオレオレで置き換えることもできる。</p>\n<p>ただ、メンテナンスされているライブラリがあるならば、わざわざオレオレ実装する意味はなく、それを利用したらいいと思っている。</p>\n<h2 id=\"最後に\" style=\"position:relative;\"><a href=\"#%E6%9C%80%E5%BE%8C%E3%81%AB\" aria-label=\"最後に permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>最後に</h2>\n<p>Contextについて触れている記事を読んでいて、「大規模ならReduxを使うケースもある」とかふわっとした意見が多いなと思ったので、\n具体的になぜReduxが必要なのかの一ケースについて書きたかった。</p>\n<p>Action/Action handler(Middleware)の考えは、CQRSの狭義のCommand/Command handlerと捉えることもできそうだなと思った。<br>\n<code>redux-thunk</code>とミドルウェアと活用したユースケース駆動開発についてはもっと詳しく書きたいので、別途記事を書こうと思う。</p>\n<p>以上、私にとってのReduxはこんな感じでした。<br>\n誰かにとってのReduxが、あなたにとってのReduxだとは限らないので、あなたにとってReduxは何であって何ではないのか、という記事が増えると色々な目線が得られてとても勉強になるので、記事たくさん書かれてほしい。</p>","timeToRead":7,"frontmatter":{"title":"ReactのNew Context APIは便利だけどreduxを使うのはやめないと思った","tags":["JavaScript","React","Redux","React Native"],"date":"April 10, 2018","featuredImage":null}}},"pageContext":{"slug":"/why-i-need-redux-with-react-new-context/","previous":{"fields":{"slug":"/how-to-use-japanese-tag-in-middleman/"},"frontmatter":{"title":"middleman-blogで日本語のタグのURLが空になる問題を解消する方法","tags":["Middleman"]}},"next":{"fields":{"slug":"/more-easy-to-use-npm-scripts/"},"frontmatter":{"title":"タブ補完でpecoでnpm-scriptsをもっと超簡単に実行したい","tags":["npm","Bash","peco"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}