{"componentChunkName":"component---src-modules-datocms-post-page-page-tsx","path":"/posts/46","result":{"data":{"post":{"title":"ES6でReact.ComponentのisMounted()が使えない問題の代替方法","author":{"name":"t-hiroyoshi","images":{"r32":{"src":"https://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&fm=png&h=32&mask=ellipse&w=32","srcSet":"https://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&dpr=1&fm=png&h=32&mask=ellipse&w=32 1x,\nhttps://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&dpr=1.5&fm=png&h=32&mask=ellipse&w=32 1.5x,\nhttps://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&dpr=2&fm=png&h=32&mask=ellipse&w=32 2x,\nhttps://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&dpr=3&fm=png&h=32&mask=ellipse&w=32 3x"},"r48":{"src":"https://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&fm=png&h=48&mask=ellipse&w=48","srcSet":"https://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&dpr=1&fm=png&h=48&mask=ellipse&w=48 1x,\nhttps://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&dpr=1.5&fm=png&h=48&mask=ellipse&w=48 1.5x,\nhttps://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&dpr=2&fm=png&h=48&mask=ellipse&w=48 2x,\nhttps://www.datocms-assets.com/29850/1591833490-1b406218d7547166c31e7a9789eb3f46.jpg?auto=format&dpr=3&fm=png&h=48&mask=ellipse&w=48 3x"}},"bio":"ShouldBeeの開発者。最近はディープラーニングについて勉強しています、すべて自動でテストできるように頑張ります。"},"date":"2015年10月15日","tags":["React","ES6"],"category":"プログラミング","body":"<a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/d2078de4-b468-4830-89d4-e24a24186c96.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"1200\" alt=\"image.png (873.0 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/d2078de4-b468-4830-89d4-e24a24186c96.png\"></a>\n<p data-sourcepos=\"3:1-4:195\">こんにちは、t-hiroyoshiです。<br>\n最近はReactやreduxを使ってUIを開発しているのですが、両方ともガンガン更新されていくので追いかけるのがとても楽しい日々を過ごしています。</p>\n<p data-sourcepos=\"6:1-6:105\">突然ですが、Reactで開発していて次のようなWarningを見たことはありませんか？</p>\n<div class=\"code-block\" data-sourcepos=\"7:1-11:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>warning</div>\n<div class=\"highlight\"><pre class=\"highlight plaintext\"><code>Warning: setState(...): Can only update a mounted or mounting component.\nThis usually means you called setState() on an unmounted component.\nThis is a no-op. Please check the code for the undefined component.\n</code></pre></div>\n</div>\n<p data-sourcepos=\"13:1-13:133\">これはUnmountされたコンポーネントの<code>setState()</code>を呼んだ時に出るもので、回避する方法があります。</p>\n<p data-sourcepos=\"15:1-16:279\">その回避方法はReact.ComponentAPIの<code>isMounted()</code>を使いUnmountされたコンポーネントへの処理を回避することです。<br>\n<code>isMounted()</code>はそのコンポーネントがmountされている時は<code>true</code>、そうでない時は<code>false</code>を返してくれるので非同期処理などでUnmountされたコンポーネントに対する<code>setState()</code>や<code>fourceUpdate()</code>を防ぐ事が可能になります。</p>\n<p data-sourcepos=\"18:1-19:133\">がしかし、なんとES6のclassを使ってReactを書いていると<code>isMounted()</code>は使えません！<br>\nなのでその簡単な代替方法を紹介します、それはコンポーネントのstateで<code>isMounted</code>を持つ方法です。</p>\n<div class=\"code-block\" data-sourcepos=\"21:1-54:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>jsx</div>\n<div class=\"highlight\"><pre class=\"highlight jsx\"><code><span class=\"k\">import</span> <span class=\"nx\">React</span> <span class=\"k\">from</span> <span class=\"dl\">\"</span><span class=\"s2\">react</span><span class=\"dl\">\"</span><span class=\"p\">;</span>\n\n<span class=\"kd\">class</span> <span class=\"nx\">Something</span> <span class=\"kd\">extends</span> <span class=\"nx\">React</span><span class=\"p\">.</span><span class=\"nx\">Component</span> <span class=\"p\">{</span>\n  <span class=\"kd\">constructor</span><span class=\"p\">(</span><span class=\"nx\">props</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n    <span class=\"k\">super</span><span class=\"p\">(</span><span class=\"nx\">props</span><span class=\"p\">);</span>\n    <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">state</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n      <span class=\"na\">isMounted</span><span class=\"p\">:</span> <span class=\"kc\">false</span><span class=\"p\">,</span>\n      <span class=\"na\">word</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">foo</span><span class=\"dl\">\"</span>\n    <span class=\"p\">};</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"nx\">componentDidMount</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">setState</span><span class=\"p\">({</span> <span class=\"na\">isMounted</span><span class=\"p\">:</span> <span class=\"kc\">true</span> <span class=\"p\">});</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"nx\">componentWillUnmount</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">setState</span><span class=\"p\">({</span> <span class=\"na\">isMounted</span><span class=\"p\">:</span> <span class=\"kc\">false</span> <span class=\"p\">});</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"nx\">someAction</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"kd\">const</span> <span class=\"p\">{</span> <span class=\"nx\">isMounted</span> <span class=\"p\">}</span> <span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">state</span><span class=\"p\">;</span>\n\n    <span class=\"c1\">// UnmountされていたらsetStateしない。</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"nx\">isMounted</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n      <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">setState</span><span class=\"p\">({</span> <span class=\"na\">word</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">bar</span><span class=\"dl\">\"</span> <span class=\"p\">});</span>\n    <span class=\"p\">}</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"nx\">render</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"c1\">// …</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</div>\n<p data-sourcepos=\"56:1-56:139\">このようにする事でUnmountされたコンポーネントへの<code>setState()</code>や<code>forceUpdate()</code>をES6でも防ぐ事ができます。</p>\n<h3 data-sourcepos=\"58:1-58:19\" id=\"0-0-1\" name=\"0-0-1\">\n<a class=\"anchor\" id=\"参考リンク\" name=\"%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF\" href=\"#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF\" data-position=\"0-0-1\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"参考リンク\"> &gt; 参考リンク</span></a>参考リンク</h3>\n<ul data-sourcepos=\"60:1-61:58\">\n<li data-sourcepos=\"60:1-60:60\"><a href=\"https://facebook.github.io/react/docs/component-specs.html\" target=\"_blank\" rel=\"noopener noreferrer\">https://facebook.github.io/react/docs/component-specs.html</a></li>\n<li data-sourcepos=\"61:1-61:58\"><a href=\"https://facebook.github.io/react/docs/component-api.html\" target=\"_blank\" rel=\"noopener noreferrer\">https://facebook.github.io/react/docs/component-api.html</a></li>\n</ul>\n"}},"pageContext":{"id":"DatoCmsPost-5142983-ja","description":"こんにちは、t-hiroyoshiです。 最近はReactやreduxを使ってUIを開発しているのですが、両方ともガンガン更新されていくので追いかけるのがとても楽しい日々を過ごしています。 突然ですが、Reactで開発していて次のようなWarningを見たことはありませんか？ これはUnmountされたコンポーネントのsetState()を呼んだ時に出るもので、回避する方法があります。 その回避方法はReact.ComponentAPIのisMounted()を使いUnmountされたコンポーネントへの処理を回避することです。 isMounted()はそのコンポーネントがmountされている時","toc":[{"tag":"h3","depth":3,"href":"#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF","text":"参考リンク","html":"参考リンク"}],"ogpImageUrl":"https://www.datocms-assets.com/29850/1593190022-pastedimage20200627146.png?fm=png&mark64=aHR0cHM6Ly93d3cuZGF0b2Ntcy1hc3NldHMuY29tLzI5ODUwLzE1OTMxNTQ2MzYtdHJhbnNwYXJlbnQtcGl4ZWwucG5nP3c9NDAwJmg9NjQmZml0PWNyb3AmYmxlbmQ2ND1hSFIwY0hNNkx5OTNkM2N1WkdGMGIyTnRjeTFoYzNObGRITXVZMjl0THpJNU9EVXdMekUxT1RFNE16TTBPVEF0TVdJME1EWXlNVGhrTnpVME56RTJObU16TVdVM1lUazNPRGxsWWpObU5EWXVhbkJuUDIxaGMyczlaV3hzYVhCelpTWm1iVDF3Ym1jbWR6MHlOVFltYUQweU5UWSZibGVuZC1oPTY0JmJsZW5kLXg9MCZibGVuZC15PTAmYmxlbmQtbW9kZT1ub3JtYWwmbWFyazY0PWFIUjBjSE02THk5aGMzTmxkSE11YVcxbmFYZ3VibVYwTDM1MFpYaDBQM1I0ZEMxaGJHbG5iajF0YVdSa2JHVWxNa05zWldaMEpuUjRkQzFtYjI1MFBYTmhibk10YzJWeWFXWWxNa05pYjJ4a0puUjRkQzFqYjJ4dmNqMHlNakU0TVRZbWRIaDBOalE5WkVNeGIyRllTblpsVnpsNllVZHJKblI0ZEMxemFYcGxQVE13Sm1nOU5qUSZtYXJrLXg9NjQmbWFyay1hbGlnbj1taWRkbGUlMkNsZWZ0&mark-align=bottom%2Cleft&mark-x=100&mark-y=496&blend64=aHR0cHM6Ly93d3cuZGF0b2Ntcy1hc3NldHMuY29tLzI5ODUwLzE1OTMxNTQ2MzYtdHJhbnNwYXJlbnQtcGl4ZWwucG5nP3c9MTIwMCZoPTYzMCZmaXQ9Y3JvcCZtYXJrNjQ9YUhSMGNITTZMeTkzZDNjdVpHRjBiMk50Y3kxaGMzTmxkSE11WTI5dEx6STVPRFV3THpFMU9UTXhOVEE1TkRBdFkzSmhablJ6YldGdUxUQXhMbkJ1WncmbWFyay1hbGlnbj10b3AlMkNjZW50ZXImbWFyay13PTI1MCZtYXJrLXk9ODAmYmxlbmQ2ND1hSFIwY0hNNkx5OWhjM05sZEhNdWFXMW5hWGd1Ym1WMEwzNTBaWGgwUDNSNGRDMWhiR2xuYmoxdGFXUmtiR1VsTWtOalpXNTBaWEltZEhoMExXWnZiblE5YzJGdWN5MXpaWEpwWmlVeVEySnZiR1FtZEhoMExYQmhaRDB4TURBbWRIaDBMV052Ykc5eVBUSXlNVGd4TmlaMGVIUTJORDFTVmsweU5EUkhibFZ0Vm1oWk0xRjFVVEk1ZEdOSE9YVmFWelV3TkRSSGRXRllUazVpTTFaMVpFZFdhMHREYm1wbldYcHJkbUpmYW1kWmFtcG5ZWEpxWjFsVWJHeFpYM0J2V1hwcVoyRTNhM1UyVUcxdE4xOXRiSEp1YlhNMVZTWjBlSFF0YzJsNlpUMDFOU1ozUFRFeU1EQW1hRDAyTXpBJmJsZW5kLW1vZGU9bm9ybWFs&blend-mode=normal","otherPost":{"type":"category","title":"30分間React入門「いいねボタン」作成チュートリアル！","slug":"/posts/47"}}}}