{"componentChunkName":"component---src-modules-datocms-post-page-page-tsx","path":"/posts/47","result":{"data":{"post":{"title":"30分間React入門「いいねボタン」作成チュートリアル！","author":{"name":"suin","images":{"r32":{"src":"https://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&fm=png&h=32&mask=ellipse&w=32","srcSet":"https://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=1&fm=png&h=32&mask=ellipse&w=32 1x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=1.5&fm=png&h=32&mask=ellipse&w=32 1.5x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=2&fm=png&h=32&mask=ellipse&w=32 2x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=3&fm=png&h=32&mask=ellipse&w=32 3x"},"r48":{"src":"https://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&fm=png&h=48&mask=ellipse&w=48","srcSet":"https://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=1&fm=png&h=48&mask=ellipse&w=48 1x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=1.5&fm=png&h=48&mask=ellipse&w=48 1.5x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=2&fm=png&h=48&mask=ellipse&w=48 2x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=3&fm=png&h=48&mask=ellipse&w=48 3x"}},"bio":"好き: TypeScript, DDD, OOP／#YYTypeScript の主催者／Qiita 4位／株式会社クラフトマンソフトウェア取締役／『実践ドメイン駆動設計』邦訳レビュア／#分報 考案者／Web自動テストShouldBeeを開発"},"date":"2015年10月15日","tags":["React","Reactチュートリアル","React入門"],"category":"プログラミング","body":"<a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/be693627-5b72-471f-a09a-6ba198a721a6.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"1200\" alt=\"image.png (60.3 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/be693627-5b72-471f-a09a-6ba198a721a6.png\"></a>\n<p data-sourcepos=\"3:1-3:38\">「今日からReactを始めたい」</p>\n<p data-sourcepos=\"5:1-5:56\">「とりあえずReactで何か動かしてみたい」</p>\n<p data-sourcepos=\"7:1-7:95\">ここは、そういった方が、Reactを始めみるためのチュートリアルです。</p>\n<p data-sourcepos=\"9:1-9:125\">今回は、Reactを使って<strong>Facebookのいいねボタンのようなコンポーネント</strong>を実装していきます。</p>\n<h1 data-sourcepos=\"11:1-11:47\" id=\"1-0-0\" name=\"1-0-0\">\n<a class=\"anchor\" id=\"今回作る「いいねボタン」のデモ\" name=\"%E4%BB%8A%E5%9B%9E%E4%BD%9C%E3%82%8B%E3%80%8C%E3%81%84%E3%81%84%E3%81%AD%E3%83%9C%E3%82%BF%E3%83%B3%E3%80%8D%E3%81%AE%E3%83%87%E3%83%A2\" href=\"#%E4%BB%8A%E5%9B%9E%E4%BD%9C%E3%82%8B%E3%80%8C%E3%81%84%E3%81%84%E3%81%AD%E3%83%9C%E3%82%BF%E3%83%B3%E3%80%8D%E3%81%AE%E3%83%87%E3%83%A2\" data-position=\"1-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"今回作る「いいねボタン」のデモ\"> &gt; 今回作る「いいねボタン」のデモ</span></a>今回作る「いいねボタン」のデモ</h1>\n<p data-sourcepos=\"13:1-13:24\">実際に押せます↓</p>\n<div id=\"like-button\"><a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/c96f7803-085b-4983-bc15-1dfc950c4f49.gif\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"150\" alt=\"4.gif (23.4 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/c96f7803-085b-4983-bc15-1dfc950c4f49.gif\"></a></div>\n<script src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/6e773137-01ce-4849-8781-dd163334213d.js\"></script>\n<br><br>\n<h1 data-sourcepos=\"19:1-19:32\" id=\"2-0-0\" name=\"2-0-0\">\n<a class=\"anchor\" id=\"チュートリアルの目標\" name=\"%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AE%E7%9B%AE%E6%A8%99\" href=\"#%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AE%E7%9B%AE%E6%A8%99\" data-position=\"2-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"チュートリアルの目標\"> &gt; チュートリアルの目標</span></a>チュートリアルの目標</h1>\n<ul data-sourcepos=\"21:1-25:0\">\n<li data-sourcepos=\"21:1-21:64\">Reactのコンポーネントを実装できるようになる</li>\n<li data-sourcepos=\"22:1-22:88\">Reactコンポーネントのイベントをハンドリングできるようになる</li>\n<li data-sourcepos=\"23:1-23:77\">Reactコンポーネントの状態(state)を実装できるようになる</li>\n<li data-sourcepos=\"24:1-25:0\">Reactの雰囲気をつかめる！</li>\n</ul>\n<h1 data-sourcepos=\"26:1-26:41\" id=\"3-0-0\" name=\"3-0-0\">\n<a class=\"anchor\" id=\"このチュートリアルについて\" name=\"%E3%81%93%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\" href=\"#%E3%81%93%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6\" data-position=\"3-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"このチュートリアルについて\"> &gt; このチュートリアルについて</span></a>このチュートリアルについて</h1>\n<p data-sourcepos=\"28:1-28:99\">なお、このチュートリアルは、下記のバージョンで動作確認しています。</p>\n<ul data-sourcepos=\"30:1-36:0\">\n<li data-sourcepos=\"30:1-30:12\">npm 2.14.2</li>\n<li data-sourcepos=\"31:1-31:12\">react 0.14</li>\n<li data-sourcepos=\"32:1-32:16\">react-dom 0.14</li>\n<li data-sourcepos=\"33:1-33:16\">webpack 1.12.2</li>\n<li data-sourcepos=\"34:1-34:19\">babel-core 5.8.25</li>\n<li data-sourcepos=\"35:1-36:0\">babel-loader 5.3.2</li>\n</ul>\n<p data-sourcepos=\"37:1-37:179\">このチュートリアルで作成するコンポーネントの完成形は<a href=\"https://github.com/suin/react-like-button-example\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub</a>からチェックアウトできます。</p>\n<p data-sourcepos=\"39:1-39:96\">また、今回はReactだけでコンポーネントを作成し、Fluxは使用しません。</p>\n<h1 data-sourcepos=\"41:1-41:11\" id=\"4-0-0\" name=\"4-0-0\">\n<a class=\"anchor\" id=\"下準備\" name=\"%E4%B8%8B%E6%BA%96%E5%82%99\" href=\"#%E4%B8%8B%E6%BA%96%E5%82%99\" data-position=\"4-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"下準備\"> &gt; 下準備</span></a>下準備</h1>\n<h2 data-sourcepos=\"44:1-44:44\" id=\"4-1-0\" name=\"4-1-0\">\n<a class=\"anchor\" id=\"下準備: プロジェクト新規作成\" name=\"%E4%B8%8B%E6%BA%96%E5%82%99:%20%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90\" href=\"#%E4%B8%8B%E6%BA%96%E5%82%99:%20%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90\" data-position=\"4-1-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"下準備__colon__ プロジェクト新規作成\"> &gt; 下準備__colon__ プロジェクト新規作成</span></a>下準備: プロジェクト新規作成</h2>\n<p data-sourcepos=\"46:1-46:45\">ひとまずディレクトリを作って、</p>\n<div class=\"code-block\" data-sourcepos=\"48:1-51:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code><span class=\"nb\">mkdir </span>react-like-button\n<span class=\"nb\">cd </span>react-like-button\n</code></pre></div>\n</div>\n<p data-sourcepos=\"53:1-53:42\">プロジェクトを初期化します。</p>\n<div class=\"code-block\" data-sourcepos=\"55:1-57:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code>npm init\n</code></pre></div>\n</div>\n<h2 data-sourcepos=\"59:1-59:50\" id=\"4-2-0\" name=\"4-2-0\">\n<a class=\"anchor\" id=\"下準備: 必要ツールのインストール\" name=\"%E4%B8%8B%E6%BA%96%E5%82%99:%20%E5%BF%85%E8%A6%81%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\" href=\"#%E4%B8%8B%E6%BA%96%E5%82%99:%20%E5%BF%85%E8%A6%81%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\" data-position=\"4-2-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"下準備__colon__ 必要ツールのインストール\"> &gt; 下準備__colon__ 必要ツールのインストール</span></a>下準備: 必要ツールのインストール</h2>\n<p data-sourcepos=\"61:1-61:75\">開発に必要なツールをnpmでインストールしておきます。</p>\n<div class=\"code-block\" data-sourcepos=\"63:1-65:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code>npm <span class=\"nb\">install</span> <span class=\"nt\">--save-dev</span> webpack babel-loader\n</code></pre></div>\n</div>\n<p data-sourcepos=\"67:1-67:55\">今回インストールするのは次の2つです。</p>\n<ul data-sourcepos=\"69:1-71:0\">\n<li data-sourcepos=\"69:1-69:115\">webpack: JSを依存関係を解決しつつ、ひとつのスクリプトにビルドしてくれるツール。</li>\n<li data-sourcepos=\"70:1-71:0\">babel-loader: ES6、ES7のトランスパイラBabelをwebpackで使えるようにするアドオン。</li>\n</ul>\n<p data-sourcepos=\"72:1-72:93\">これらのツールの説明は省略します。詳しくは次の記事をご参考に。</p>\n<ul data-sourcepos=\"74:1-76:0\">\n<li data-sourcepos=\"74:1-74:171\"><a href=\"http://liginc.co.jp/web/js/149577\" target=\"_blank\" rel=\"noopener noreferrer\">webpackを使った開発の効率化方法やloaderの種類をTLで話してきました【スライド付き】 | 株式会社LIG</a></li>\n<li data-sourcepos=\"75:1-76:0\"><a href=\"https://app.codegrid.net/entry/babel-1\" target=\"_blank\" rel=\"noopener noreferrer\">Babelの手ほどき - Babelとは | CodeGrid</a></li>\n</ul>\n<h2 data-sourcepos=\"77:1-77:30\" id=\"4-3-0\" name=\"4-3-0\">\n<a class=\"anchor\" id=\"下準備: webpackの設定\" name=\"%E4%B8%8B%E6%BA%96%E5%82%99:%20webpack%E3%81%AE%E8%A8%AD%E5%AE%9A\" href=\"#%E4%B8%8B%E6%BA%96%E5%82%99:%20webpack%E3%81%AE%E8%A8%AD%E5%AE%9A\" data-position=\"4-3-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"下準備__colon__ webpackの設定\"> &gt; 下準備__colon__ webpackの設定</span></a>下準備: webpackの設定</h2>\n<p data-sourcepos=\"79:1-79:83\"><code>webpack.config.js</code>という名前でwebpackの設定ファイルを作ります。</p>\n<div class=\"code-block\" data-sourcepos=\"81:1-83:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code><span class=\"nb\">touch </span>webpack.config.js\n</code></pre></div>\n</div>\n<div class=\"code-block\" data-sourcepos=\"85:1-99:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>js</div>\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"nx\">module</span><span class=\"p\">.</span><span class=\"nx\">exports</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n  <span class=\"na\">entry</span><span class=\"p\">:</span> <span class=\"nx\">__dirname</span> <span class=\"o\">+</span> <span class=\"dl\">\"</span><span class=\"s2\">/src/main.js</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n  <span class=\"na\">output</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"na\">path</span><span class=\"p\">:</span> <span class=\"nx\">__dirname</span> <span class=\"o\">+</span> <span class=\"dl\">\"</span><span class=\"s2\">/dist</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n    <span class=\"na\">filename</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">like-button.js</span><span class=\"dl\">\"</span>\n  <span class=\"p\">},</span>\n  <span class=\"na\">module</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"na\">loaders</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n      <span class=\"p\">{</span><span class=\"na\">test</span><span class=\"p\">:</span> <span class=\"sr\">/</span><span class=\"se\">\\.</span><span class=\"sr\">js$/</span><span class=\"p\">,</span> <span class=\"na\">loader</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">babel-loader?stage=0</span><span class=\"dl\">\"</span><span class=\"p\">}</span>\n    <span class=\"p\">]</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">};</span>\n</code></pre></div>\n</div>\n<p data-sourcepos=\"101:1-101:349\">少し説明すると、<code>entry</code>と<code>output</code>では「<code>src/main.js</code>をコンパイルし、<code>dist/like-button.js</code>を生成する」設定になっています。<code>loaders</code>は拡張子がjsのものにbabel-loaderを適用する設定、つまりES6をJSに変換するようになっています。<code>stage=0</code>はES7も有効にするBabelの設定です。</p>\n<p data-sourcepos=\"103:1-103:95\">ソースコード置き場と、ビルドされたJSが生成される場所を作ります。</p>\n<div class=\"code-block\" data-sourcepos=\"105:1-107:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code><span class=\"nb\">mkdir </span>src dist\n</code></pre></div>\n</div>\n<h2 data-sourcepos=\"109:1-109:71\" id=\"4-4-0\" name=\"4-4-0\">\n<a class=\"anchor\" id=\"下準備: コンポーネントを実装するファイルを作る\" name=\"%E4%B8%8B%E6%BA%96%E5%82%99:%20%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B\" href=\"#%E4%B8%8B%E6%BA%96%E5%82%99:%20%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B\" data-position=\"4-4-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"下準備__colon__ コンポーネントを実装するファイルを作る\"> &gt; 下準備__colon__ コンポーネントを実装するファイルを作る</span></a>下準備: コンポーネントを実装するファイルを作る</h2>\n<p data-sourcepos=\"111:1-111:84\">まずは、ボタンをコーディングするファイルを作りましょう。</p>\n<div class=\"code-block\" data-sourcepos=\"113:1-115:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code><span class=\"nb\">touch</span> ./src/main.js\n</code></pre></div>\n</div>\n<p data-sourcepos=\"117:1-117:203\">webpackでちゃんとビルドされるかを確認したいので、ひとまず、中身は<code>console.log</code>にしておき、読み込まれていることが確認できるようにしておきます。</p>\n<div class=\"code-block\" data-sourcepos=\"119:1-121:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>js</div>\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">log</span><span class=\"p\">(</span><span class=\"dl\">\"</span><span class=\"s2\">OK</span><span class=\"dl\">\"</span><span class=\"p\">);</span>\n</code></pre></div>\n</div>\n<h2 data-sourcepos=\"123:1-123:41\" id=\"4-5-0\" name=\"4-5-0\">\n<a class=\"anchor\" id=\"下準備: 確認用ページを作る\" name=\"%E4%B8%8B%E6%BA%96%E5%82%99:%20%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E3%82%8B\" href=\"#%E4%B8%8B%E6%BA%96%E5%82%99:%20%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E3%82%8B\" data-position=\"4-5-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"下準備__colon__ 確認用ページを作る\"> &gt; 下準備__colon__ 確認用ページを作る</span></a>下準備: 確認用ページを作る</h2>\n<p data-sourcepos=\"125:1-125:78\">つぎに、ビルドされたJSの動作確認をするHTMLを作ります。</p>\n<div class=\"code-block\" data-sourcepos=\"127:1-129:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code><span class=\"nb\">touch </span>dist/index.html\n</code></pre></div>\n</div>\n<p data-sourcepos=\"131:1-131:30\">中身はこんなかんじ。</p>\n<div class=\"code-block\" data-sourcepos=\"133:1-145:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>html</div>\n<div class=\"highlight\"><pre class=\"highlight html\"><code><span class=\"cp\">&lt;!doctype html&gt;</span>\n<span class=\"nt\">&lt;html&gt;</span>\n<span class=\"nt\">&lt;head&gt;</span>\n  <span class=\"nt\">&lt;meta</span> <span class=\"na\">charset=</span><span class=\"s\">\"UTF-8\"</span><span class=\"nt\">&gt;</span>\n  <span class=\"nt\">&lt;title&gt;</span>Reactで作った「いいねボタン」のデモ (Flux不使用)<span class=\"nt\">&lt;/title&gt;</span>\n<span class=\"nt\">&lt;/head&gt;</span>\n<span class=\"nt\">&lt;body&gt;</span>\n  <span class=\"nt\">&lt;h1&gt;</span>Reactで作った「いいねボタン」のデモ (Flux不使用)<span class=\"nt\">&lt;/h1&gt;</span>\n  <span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"like-button.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n<span class=\"nt\">&lt;/body&gt;</span>\n<span class=\"nt\">&lt;/html&gt;</span>\n</code></pre></div>\n</div>\n<h2 data-sourcepos=\"147:1-147:42\" id=\"4-6-0\" name=\"4-6-0\">\n<a class=\"anchor\" id=\"下準備: webpackでビルドを試す\" name=\"%E4%B8%8B%E6%BA%96%E5%82%99:%20webpack%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E3%82%92%E8%A9%A6%E3%81%99\" href=\"#%E4%B8%8B%E6%BA%96%E5%82%99:%20webpack%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E3%82%92%E8%A9%A6%E3%81%99\" data-position=\"4-6-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"下準備__colon__ webpackでビルドを試す\"> &gt; 下準備__colon__ webpackでビルドを試す</span></a>下準備: webpackでビルドを試す</h2>\n<p data-sourcepos=\"149:1-149:102\">ビルドするために、<code>package.json</code>にwebpackのビルドタスクを定義しておきます。</p>\n<div class=\"code-block\" data-sourcepos=\"152:1-162:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>json</div>\n<div class=\"highlight\"><pre class=\"highlight json\"><code><span class=\"p\">{</span><span class=\"w\">\n</span><span class=\"err\">...</span><span class=\"w\">\n  </span><span class=\"nl\">\"scripts\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"err\">...</span><span class=\"w\">\n    </span><span class=\"nl\">\"build\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"rm -rf dist/*.js &amp;&amp; webpack\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"watch\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"rm -rf dist/*.js &amp;&amp; webpack -w\"</span><span class=\"w\">\n  </span><span class=\"p\">},</span><span class=\"w\">\n</span><span class=\"err\">...</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<p data-sourcepos=\"164:1-164:159\">ひとつ目は単発でビルドするタスクの定義、ふたつ目はソースコードが変更されたら自動でビルドが走るタスクです。</p>\n<p data-sourcepos=\"166:1-166:44\"><em>開発時はふたつ目を使います。</em></p>\n<p data-sourcepos=\"168:1-168:57\">ビルドタスクが走るか試してみましょう。</p>\n<div class=\"code-block\" data-sourcepos=\"170:1-172:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code>npm run build\n</code></pre></div>\n</div>\n<p data-sourcepos=\"174:1-174:55\">dist/like-button.jsが生成されたでしょうか？</p>\n<p data-sourcepos=\"176:1-176:170\">最後に、確認ページを開き、コンソールに「OK」と出ているのが確認できれば、ビルドも実行もうまくいったことになります。</p>\n<div class=\"code-block\" data-sourcepos=\"178:1-180:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code>open dist/index.html\n</code></pre></div>\n</div>\n<p data-sourcepos=\"182:1-182:27\">下準備は以上です。</p>\n<h1 data-sourcepos=\"184:1-184:38\" id=\"5-0-0\" name=\"5-0-0\">\n<a class=\"anchor\" id=\"「いいね！」ボタンを作る\" name=\"%E3%80%8C%E3%81%84%E3%81%84%E3%81%AD%EF%BC%81%E3%80%8D%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8B\" href=\"#%E3%80%8C%E3%81%84%E3%81%84%E3%81%AD%EF%BC%81%E3%80%8D%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8B\" data-position=\"5-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"「いいね！」ボタンを作る\"> &gt; 「いいね！」ボタンを作る</span></a>「いいね！」ボタンを作る</h1>\n<p data-sourcepos=\"186:1-186:78\">ここからは「いいね！」ボタンの開発に入っていきます。</p>\n<h2 data-sourcepos=\"188:1-188:29\" id=\"5-1-0\" name=\"5-1-0\">\n<a class=\"anchor\" id=\"Reactをインストール\" name=\"React%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\" href=\"#React%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\" data-position=\"5-1-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"Reactをインストール\"> &gt; Reactをインストール</span></a>Reactをインストール</h2>\n<p data-sourcepos=\"190:1-190:38\">Reactをインストールします。</p>\n<div class=\"code-block\" data-sourcepos=\"192:1-194:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code>npm <span class=\"nb\">install</span> <span class=\"nt\">--save</span> react react-dom\n</code></pre></div>\n</div>\n<p data-sourcepos=\"196:1-196:132\">確認用HTML<code>dist/index.html</code>を変更して、Reactコンポーネントをマウントする場所をHTMLに書き込みます。</p>\n<div class=\"code-block\" data-sourcepos=\"198:1-204:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>html</div>\n<div class=\"highlight\"><pre class=\"highlight html\"><code>...\n  <span class=\"nt\">&lt;h1&gt;</span>Reactで作った「いいねボタン」のデモ (Flux不使用)<span class=\"nt\">&lt;/h1&gt;</span>\n  <span class=\"nt\">&lt;div</span> <span class=\"na\">id=</span><span class=\"s\">\"like-button\"</span><span class=\"nt\">&gt;&lt;/div&gt;</span><span class=\"c\">&lt;!-- ここにコンポーネントをマウント --&gt;</span>\n  <span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"like-button.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n...\n</code></pre></div>\n</div>\n<p data-sourcepos=\"206:1-206:134\"><code>like-button.js</code>が読み込まれると、この<code>id=\"like-button\"</code>にいいねボタン コンポーネントが描画されます。</p>\n<p data-sourcepos=\"208:1-208:158\">まずは、最もシンプルなコンポーネントを<code>main.js</code>に書いてみましょう。<code>&lt;span&gt;</code>を出力するだけのコンポーネントです。</p>\n<div class=\"code-block\" data-sourcepos=\"210:1-226: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<span class=\"k\">import</span> <span class=\"nx\">ReactDom</span> <span class=\"k\">from</span> <span class=\"dl\">\"</span><span class=\"s2\">react-dom</span><span class=\"dl\">\"</span><span class=\"p\">;</span>\n\n<span class=\"kd\">class</span> <span class=\"nx\">LikeButton</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=\"nx\">render</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"p\">(</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>いいねボタン予定地<span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">);</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"nx\">ReactDom</span><span class=\"p\">.</span><span class=\"nx\">render</span><span class=\"p\">(</span>\n  <span class=\"p\">&lt;</span><span class=\"nc\">LikeButton</span> <span class=\"p\">/&gt;,</span>\n  <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">getElementById</span><span class=\"p\">(</span><span class=\"dl\">\"</span><span class=\"s2\">like-button</span><span class=\"dl\">\"</span><span class=\"p\">)</span>\n<span class=\"p\">);</span>\n</code></pre></div>\n</div>\n<p data-sourcepos=\"228:1-228:414\">コードに直接書かれた<code>&lt;span&gt;</code>タグなどはJSXと呼ばれます。HTMLに見えますがXMLです。<strong>XMLなので閉じタグを省略できない点に注意</strong>してください。<code>React.Component</code>を継承し、<code>render</code>メソッドを実装すると、Reactコンポーネントになります。Reactコンポーネントは、クラス名をそのままJSXのタグに使うことができます。</p>\n<p data-sourcepos=\"230:1-230:79\">HTMLとJSXの違いについてはドキュメントに説明があります。</p>\n<ul data-sourcepos=\"232:1-234:0\">\n<li data-sourcepos=\"232:1-232:86\"><a href=\"https://facebook.github.io/react/docs/jsx-gotchas-ja-JP.html\" target=\"_blank\" rel=\"noopener noreferrer\">JSXの理解 | React</a></li>\n<li data-sourcepos=\"233:1-234:0\"><a href=\"https://facebook.github.io/react/docs/dom-differences.html\" target=\"_blank\" rel=\"noopener noreferrer\">DOM Differences | React</a></li>\n</ul>\n<p data-sourcepos=\"235:1-235:72\">webpackのwatchタスクを起動して、ビルドを走らせます。</p>\n<div class=\"code-block\" data-sourcepos=\"237:1-239:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>shell</div>\n<div class=\"highlight\"><pre class=\"highlight shell\"><code>npm run watch\n</code></pre></div>\n</div>\n<p data-sourcepos=\"241:1-241:153\">ビルドが終わったら、確認用HTMLを読み込みしなおしてみて、「いいねボタン予定地」が表示されていればOKです。</p>\n<a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/c46d60a9-0724-46c8-9e33-72494c6bbd53.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"821\" alt=\"3.png (107.4 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/c46d60a9-0724-46c8-9e33-72494c6bbd53.png\"></a>\n<h2 data-sourcepos=\"245:1-245:42\" id=\"5-2-0\" name=\"5-2-0\">\n<a class=\"anchor\" id=\"ボタンのデザインを作りこむ\" name=\"%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%93%E3%82%80\" href=\"#%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%93%E3%82%80\" data-position=\"5-2-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"ボタンのデザインを作りこむ\"> &gt; ボタンのデザインを作りこむ</span></a>ボタンのデザインを作りこむ</h2>\n<p data-sourcepos=\"247:1-247:129\">「いいね！」ボタンはFacebookのLikeボタンのようにボタンと吹き出しがセットのものを作ります。</p>\n<a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/00232841-a8a5-4637-b2fe-bb8a8dd6d775.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"98.5\" alt=\"facebook-like-button.png (3.6 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/00232841-a8a5-4637-b2fe-bb8a8dd6d775.png\"></a>\n<p data-sourcepos=\"251:1-251:367\"><small>このチュートリアルでは、Facebook風のデザインを作る上で、<a href=\"http://stackoverflow.com/questions/23333010/how-to-draw-the-of-likes-bubble-like-what-is-on-the-right-side-of-the-facebook\" target=\"_blank\" rel=\"noopener noreferrer\">html - how to draw the # of likes bubble like what is on the right side of the facebook like button - Stack Overflow</a>を参考にしています。</small></p>\n<p data-sourcepos=\"253:1-253:90\">先ほどの<code>LikeButton</code>の中身を書き換えて、JSXとスタイルを書きます。</p>\n<div class=\"code-block\" data-sourcepos=\"256:1-319: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=\"kd\">class</span> <span class=\"nx\">LikeButton</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=\"nx\">styles</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"p\">{</span>\n      <span class=\"na\">container</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"na\">fontFamily</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">helvetica, arial, 'hiragino kaku gothic pro', meiryo, 'ms pgothic', sans-serif</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">fontSize</span><span class=\"p\">:</span> <span class=\"mi\">11</span>\n      <span class=\"p\">},</span>\n      <span class=\"na\">like</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"na\">display</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">inline-block</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">background</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">#3b5998</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">padding</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">0px 5px</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">borderRadius</span><span class=\"p\">:</span> <span class=\"mi\">2</span><span class=\"p\">,</span>\n        <span class=\"na\">color</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">#ffffff</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">cursor</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">pointer</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">float</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">left</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">height</span><span class=\"p\">:</span> <span class=\"mi\">20</span><span class=\"p\">,</span>\n        <span class=\"na\">lineHeight</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">20px</span><span class=\"dl\">\"</span>\n      <span class=\"p\">},</span>\n      <span class=\"na\">likeHover</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"na\">background</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">#444</span><span class=\"dl\">\"</span>\n      <span class=\"p\">},</span>\n      <span class=\"na\">counterBefore</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"na\">display</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">block</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">float</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">left</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">width</span><span class=\"p\">:</span> <span class=\"mi\">6</span><span class=\"p\">,</span>\n        <span class=\"na\">height</span><span class=\"p\">:</span> <span class=\"mi\">6</span><span class=\"p\">,</span>\n        <span class=\"na\">background</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">#fafafa</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">marginLeft</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">-12px</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">borderRight</span><span class=\"p\">:</span> <span class=\"mi\">10</span><span class=\"p\">,</span>\n        <span class=\"na\">transform</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">rotate(45deg)</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">WebkitTransform</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">rotate(45deg)</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">marginTop</span><span class=\"p\">:</span> <span class=\"mi\">6</span><span class=\"p\">,</span>\n        <span class=\"na\">borderLeft</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">1px solid #aaa</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">borderBottom</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">1px solid #aaa</span><span class=\"dl\">\"</span>\n      <span class=\"p\">},</span>\n      <span class=\"na\">counter</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"na\">display</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">block</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">background</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">#fafafa</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">boxSizing</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">border-box</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">border</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">1px solid #aaa</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">float</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">left</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">padding</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">0px 8px</span><span class=\"dl\">\"</span><span class=\"p\">,</span>\n        <span class=\"na\">borderRadius</span><span class=\"p\">:</span> <span class=\"mi\">2</span><span class=\"p\">,</span>\n        <span class=\"na\">marginLeft</span><span class=\"p\">:</span> <span class=\"mi\">8</span><span class=\"p\">,</span>\n        <span class=\"na\">height</span><span class=\"p\">:</span> <span class=\"mi\">20</span><span class=\"p\">,</span>\n        <span class=\"na\">lineHeight</span><span class=\"p\">:</span> <span class=\"dl\">\"</span><span class=\"s2\">20px</span><span class=\"dl\">\"</span>\n      <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=\"kd\">const</span> <span class=\"nx\">styles</span> <span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">styles</span><span class=\"p\">();</span>\n    <span class=\"k\">return</span> <span class=\"p\">(</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">container</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">like</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>いいね！<span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">counter</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>\n          <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">counterBefore</span><span class=\"si\">}</span><span class=\"p\">&gt;</span><span class=\"si\">{</span><span class=\"dl\">\"</span><span class=\"s2\"> </span><span class=\"dl\">\"</span><span class=\"si\">}</span><span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>999\n        <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n      <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">);</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</div>\n<p data-sourcepos=\"321:1-322:266\">Reactでは<code>className</code>属性を使えばスタイルシートをCSSに追い出すこともできますが、<br>\nウィジェットとして設置可能にすることまで考えて、ここではインラインスタイルで書きます。<strong>Reactのインラインスタイルは、JavaScriptのオブジェクトで表現する</strong>点が、普通のHTMLとは異なります。</p>\n<h2 data-sourcepos=\"325:1-325:60\" id=\"5-3-0\" name=\"5-3-0\">\n<a class=\"anchor\" id=\"カーソルが乗った時にボタンの色を変える\" name=\"%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E3%81%8C%E4%B9%97%E3%81%A3%E3%81%9F%E6%99%82%E3%81%AB%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E8%89%B2%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B\" href=\"#%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E3%81%8C%E4%B9%97%E3%81%A3%E3%81%9F%E6%99%82%E3%81%AB%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E8%89%B2%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B\" data-position=\"5-3-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"カーソルが乗った時にボタンの色を変える\"> &gt; カーソルが乗った時にボタンの色を変える</span></a>カーソルが乗った時にボタンの色を変える</h2>\n<p data-sourcepos=\"327:1-327:120\">いいねボタンにカーソルが乗った時に、背景色が変化するフィードバックを実装します。</p>\n<p data-sourcepos=\"329:1-329:218\">CSSであれば<code>:hover</code>を定義するだけですが、Reactのインラインスタイルでは、<code>onMouseEnter</code>イベントと<code>onMouseLeave</code>を使って動的にスタイルを変更する方法で実装します。</p>\n<p data-sourcepos=\"331:1-331:150\">今の<code>LikeButton</code>コンポーネントに手を加えて、カーソルが乗っているかの状態とイベントハンドラを追加します。</p>\n<div class=\"code-block\" data-sourcepos=\"333:1-373: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=\"kd\">class</span> <span class=\"nx\">LikeButton</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=\"c1\">// コンポーネントにカーソルが乗ているかどうかの状態を持たせる</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\">hovered</span><span class=\"p\">:</span> <span class=\"kc\">false</span>\n    <span class=\"p\">}</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"nx\">styles</span><span class=\"p\">()</span> <span class=\"p\">{</span> <span class=\"p\">...</span> <span class=\"p\">}</span>\n\n  <span class=\"c1\">// カーソルが乗った時に状態を変更するイベントハンドラ</span>\n  <span class=\"nx\">onMouseEnter</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\">hovered</span><span class=\"p\">:</span> <span class=\"kc\">true</span><span class=\"p\">});</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"c1\">// カーソルが外れた時に状態を変更するイベントハンドラ</span>\n  <span class=\"nx\">onMouseLeave</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\">hovered</span><span class=\"p\">:</span> <span class=\"kc\">false</span><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=\"kd\">const</span> <span class=\"nx\">styles</span> <span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">styles</span><span class=\"p\">();</span>\n    <span class=\"nx\">console</span><span class=\"p\">.</span><span class=\"nx\">log</span><span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">state</span><span class=\"p\">);</span> <span class=\"c1\">// 状態をログに出す</span>\n\n    <span class=\"c1\">// ボタンに onMouseEnter と onMouseLeave のイベントハンドラを割り当てます</span>\n    <span class=\"k\">return</span> <span class=\"p\">(</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">container</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span>\n          <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">like</span><span class=\"si\">}</span>\n          <span class=\"na\">onMouseEnter</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"p\">::</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">onMouseEnter</span><span class=\"si\">}</span>\n          <span class=\"na\">onMouseLeave</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"p\">::</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">onMouseLeave</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>いいね！<span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">counter</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>\n          <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">counterBefore</span><span class=\"si\">}</span><span class=\"p\">&gt;</span><span class=\"si\">{</span><span class=\"dl\">\"</span><span class=\"s2\"> </span><span class=\"dl\">\"</span><span class=\"si\">}</span><span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>999\n        <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n      <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">);</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</div>\n<p data-sourcepos=\"375:1-376:93\">ビルドが走ったら、確認用HTMLにて、ボタンにカーソルを乗せたり外したりしてみて、<br>\nコンソールにコンポーネントの状態を出ているか確認してください。</p>\n<a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/d292ab0a-f78f-4326-86d9-093e5f2d39b2.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"569\" alt=\"1.png (94.5 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/d292ab0a-f78f-4326-86d9-093e5f2d39b2.png\"></a>\n<p data-sourcepos=\"380:1-380:190\">ここまでできたら、<code>this.state.hovered</code>の状態に応じてスタイルを切り替えれば、背景色を変更できます。<code>render</code>メソッドを変更してみましょう。</p>\n<div class=\"code-block\" data-sourcepos=\"382:1-402: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=\"kd\">class</span> <span class=\"nx\">LikeButton</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=\"p\">...</span>\n  <span class=\"nx\">render</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"kd\">const</span> <span class=\"nx\">styles</span> <span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">styles</span><span class=\"p\">();</span>\n    <span class=\"c1\">// 状態に応じてスタイルを変更する</span>\n    <span class=\"kd\">const</span> <span class=\"nx\">likeStyle</span> <span class=\"o\">=</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">state</span><span class=\"p\">.</span><span class=\"nx\">hovered</span> <span class=\"p\">?</span> <span class=\"p\">{...</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">like</span><span class=\"p\">,</span> <span class=\"p\">...</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">likeHover</span><span class=\"p\">}</span> <span class=\"p\">:</span> <span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">like</span><span class=\"p\">;</span>\n    <span class=\"k\">return</span> <span class=\"p\">(</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">container</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span>\n          <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">likeStyle</span><span class=\"si\">}</span>\n          <span class=\"na\">onMouseEnter</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"p\">::</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">onMouseEnter</span><span class=\"si\">}</span>\n          <span class=\"na\">onMouseLeave</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"p\">::</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">onMouseLeave</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>いいね！<span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">counter</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>\n          <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">counterBefore</span><span class=\"si\">}</span><span class=\"p\">&gt;</span><span class=\"si\">{</span><span class=\"dl\">\"</span><span class=\"s2\"> </span><span class=\"dl\">\"</span><span class=\"si\">}</span><span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>999\n        <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n      <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">);</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</div>\n<p data-sourcepos=\"404:1-404:126\">ちなみに、<code>{...styles.like, ...styles.likeHover}</code>はES7でふたつのオブジェクトをマージする構文です。</p>\n<p data-sourcepos=\"406:1-406:51\">色が変わるようになったでしょうか？</p>\n<a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/461a4ab3-f141-4c19-b9a2-d36e5daf780e.gif\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"284\" alt=\"2.gif (19.4 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/461a4ab3-f141-4c19-b9a2-d36e5daf780e.gif\"></a>\n<h2 data-sourcepos=\"410:1-410:75\" id=\"5-4-0\" name=\"5-4-0\">\n<a class=\"anchor\" id=\"ボタンを押して、数を増やしたり減らせるようにする\" name=\"%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%97%E3%81%A6%E3%80%81%E6%95%B0%E3%82%92%E5%A2%97%E3%82%84%E3%81%97%E3%81%9F%E3%82%8A%E6%B8%9B%E3%82%89%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B\" href=\"#%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%97%E3%81%A6%E3%80%81%E6%95%B0%E3%82%92%E5%A2%97%E3%82%84%E3%81%97%E3%81%9F%E3%82%8A%E6%B8%9B%E3%82%89%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B\" data-position=\"5-4-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"ボタンを押して、数を増やしたり減らせるようにする\"> &gt; ボタンを押して、数を増やしたり減らせるようにする</span></a>ボタンを押して、数を増やしたり減らせるようにする</h2>\n<p data-sourcepos=\"412:1-413:69\">最後に、ボタンを押したときに、数を増減する処理を追加します。<br>\nFacebookのLikeボタンに習い、次の仕様を実装します。</p>\n<ul data-sourcepos=\"415:1-417:0\">\n<li data-sourcepos=\"415:1-415:93\">いいね済みの場合: ボタンを押すといいね解除、カウンタを-1する。</li>\n<li data-sourcepos=\"416:1-417:0\">いいねがまだの場合: ボタンを押すといいね状態になり、カウンタを+1する。</li>\n</ul>\n<p data-sourcepos=\"418:1-420:63\">カウント数と押したかどうかの2つの状態を、<code>state</code>に追加します。<br>\nそして、クリックしたときのイベントハンドラと追加し、<br>\nそのイベントハンドラをボタンと紐付けます。</p>\n<div class=\"code-block\" data-sourcepos=\"422:1-467: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<span class=\"k\">import</span> <span class=\"nx\">ReactDom</span> <span class=\"k\">from</span> <span class=\"dl\">\"</span><span class=\"s2\">react-dom</span><span class=\"dl\">\"</span><span class=\"p\">;</span>\n\n<span class=\"kd\">class</span> <span class=\"nx\">LikeButton</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\">hovered</span><span class=\"p\">:</span> <span class=\"kc\">false</span><span class=\"p\">,</span>\n      <span class=\"na\">count</span><span class=\"p\">:</span> <span class=\"mi\">999</span><span class=\"p\">,</span>   <span class=\"c1\">// カウント数の状態を追加</span>\n      <span class=\"na\">liked</span><span class=\"p\">:</span> <span class=\"kc\">false</span>  <span class=\"c1\">// 押したかどうかの状態を追加</span>\n    <span class=\"p\">}</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"nx\">styles</span><span class=\"p\">()</span> <span class=\"p\">{</span> <span class=\"p\">...</span> <span class=\"p\">}</span>\n  <span class=\"nx\">onMouseEnter</span><span class=\"p\">()</span> <span class=\"p\">{</span> <span class=\"p\">...</span> <span class=\"p\">}</span>\n  <span class=\"nx\">onMouseLeave</span><span class=\"p\">()</span> <span class=\"p\">{</span> <span class=\"p\">...</span> <span class=\"p\">}</span>\n\n  <span class=\"c1\">// クリックしたときのイベントハンドラ</span>\n  <span class=\"nx\">onClick</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>\n      <span class=\"na\">count</span><span class=\"p\">:</span> <span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">state</span><span class=\"p\">.</span><span class=\"nx\">count</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">state</span><span class=\"p\">.</span><span class=\"nx\">liked</span> <span class=\"p\">?</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n      <span class=\"na\">liked</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><span class=\"nx\">liked</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=\"p\">...</span>\n    <span class=\"c1\">// this.state.likedとthis.state.countを追加し、</span>\n    <span class=\"c1\">// onClickイベントハンドラを紐付ける</span>\n    <span class=\"k\">return</span> <span class=\"p\">(</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">container</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span>\n          <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">likeStyle</span><span class=\"si\">}</span>\n          <span class=\"na\">onMouseEnter</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"p\">::</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">onMouseEnter</span><span class=\"si\">}</span>\n          <span class=\"na\">onMouseLeave</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"p\">::</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">onMouseLeave</span><span class=\"si\">}</span>\n          <span class=\"na\">onClick</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"p\">::</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">onClick</span><span class=\"si\">}</span><span class=\"p\">&gt;</span><span class=\"si\">{</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">state</span><span class=\"p\">.</span><span class=\"nx\">liked</span> <span class=\"p\">?</span> <span class=\"dl\">\"</span><span class=\"s2\">✔ </span><span class=\"dl\">\"</span> <span class=\"p\">:</span> <span class=\"dl\">\"\"</span><span class=\"si\">}</span>いいね！<span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">counter</span><span class=\"si\">}</span><span class=\"p\">&gt;</span>\n          <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">style</span><span class=\"p\">=</span><span class=\"si\">{</span><span class=\"nx\">styles</span><span class=\"p\">.</span><span class=\"nx\">counterBefore</span><span class=\"si\">}</span><span class=\"p\">&gt;</span><span class=\"si\">{</span><span class=\"dl\">\"</span><span class=\"s2\"> </span><span class=\"dl\">\"</span><span class=\"si\">}</span><span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n          <span class=\"si\">{</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">state</span><span class=\"p\">.</span><span class=\"nx\">count</span><span class=\"si\">}</span>\n        <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n      <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">);</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</div>\n<p data-sourcepos=\"469:1-469:114\">この変更で、ボタンを押した時に、いいね数が変化するようになったかと思います。</p>\n<a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/4c382c58-f79b-4c4e-b51c-a889d0a12fe9.gif\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"150\" alt=\"4.gif (23.4 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/4c382c58-f79b-4c4e-b51c-a889d0a12fe9.gif\"></a>\n<h1 data-sourcepos=\"473:1-473:11\" id=\"6-0-0\" name=\"6-0-0\">\n<a class=\"anchor\" id=\"おわり\" name=\"%E3%81%8A%E3%82%8F%E3%82%8A\" href=\"#%E3%81%8A%E3%82%8F%E3%82%8A\" data-position=\"6-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"おわり\"> &gt; おわり</span></a>おわり</h1>\n<p data-sourcepos=\"475:1-475:98\">以上で「いいね！」ボタンをReactで作るチュートリアルはおしまいです。</p>\n<p data-sourcepos=\"477:1-477:197\">このチュートリアルで作成したコンポーネントの完全版は<a href=\"https://github.com/suin/react-like-button-example\" target=\"_blank\" rel=\"noopener noreferrer\">GitHubのsuin/react-like-button-example</a>にて確認できます。</p>\n<p data-sourcepos=\"479:1-479:120\">次は、もっと複雑なコンポーネントを実装するチュートリアルを紹介したいと思います！</p>\n<p data-sourcepos=\"481:1-481:92\">質問や分からないことがあれば、お気軽にコメントしてください(^-^)</p>\n"}},"pageContext":{"id":"DatoCmsPost-5142984-ja","description":"「今日からReactを始めたい」 「とりあえずReactで何か動かしてみたい」 ここは、そういった方が、Reactを始めみるためのチュートリアルです。 今回は、Reactを使ってFacebookのいいねボタンのようなコンポーネントを実装していきます。 今回作る「いいねボタン」のデモ 実際に押せます↓ チュートリアルの目標 Reactのコンポーネントを実装できるようになる Reactコンポーネントのイベントをハンドリングできるようになる Reactコンポーネントの状態(state)を実装できるようになる Reactの雰囲気をつかめる！ このチュートリアルについて なお、このチュートリアルは、下記","toc":[{"tag":"h1","depth":1,"href":"#%E4%BB%8A%E5%9B%9E%E4%BD%9C%E3%82%8B%E3%80%8C%E3%81%84%E3%81%84%E3%81%AD%E3%83%9C%E3%82%BF%E3%83%B3%E3%80%8D%E3%81%AE%E3%83%87%E3%83%A2","text":"今回作る「いいねボタン」のデモ","html":"今回作る「いいねボタン」のデモ"},{"tag":"h1","depth":1,"href":"#%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AE%E7%9B%AE%E6%A8%99","text":"チュートリアルの目標","html":"チュートリアルの目標"},{"tag":"h1","depth":1,"href":"#%E3%81%93%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6","text":"このチュートリアルについて","html":"このチュートリアルについて"},{"tag":"h1","depth":1,"href":"#%E4%B8%8B%E6%BA%96%E5%82%99","text":"下準備","html":"下準備"},{"tag":"h2","depth":2,"href":"#%E4%B8%8B%E6%BA%96%E5%82%99:%20%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90","text":"下準備: プロジェクト新規作成","html":"下準備: プロジェクト新規作成"},{"tag":"h2","depth":2,"href":"#%E4%B8%8B%E6%BA%96%E5%82%99:%20%E5%BF%85%E8%A6%81%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB","text":"下準備: 必要ツールのインストール","html":"下準備: 必要ツールのインストール"},{"tag":"h2","depth":2,"href":"#%E4%B8%8B%E6%BA%96%E5%82%99:%20webpack%E3%81%AE%E8%A8%AD%E5%AE%9A","text":"下準備: webpackの設定","html":"下準備: webpackの設定"},{"tag":"h2","depth":2,"href":"#%E4%B8%8B%E6%BA%96%E5%82%99:%20%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B","text":"下準備: コンポーネントを実装するファイルを作る","html":"下準備: コンポーネントを実装するファイルを作る"},{"tag":"h2","depth":2,"href":"#%E4%B8%8B%E6%BA%96%E5%82%99:%20%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E3%82%8B","text":"下準備: 確認用ページを作る","html":"下準備: 確認用ページを作る"},{"tag":"h2","depth":2,"href":"#%E4%B8%8B%E6%BA%96%E5%82%99:%20webpack%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E3%82%92%E8%A9%A6%E3%81%99","text":"下準備: webpackでビルドを試す","html":"下準備: webpackでビルドを試す"},{"tag":"h1","depth":1,"href":"#%E3%80%8C%E3%81%84%E3%81%84%E3%81%AD%EF%BC%81%E3%80%8D%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8B","text":"「いいね！」ボタンを作る","html":"「いいね！」ボタンを作る"},{"tag":"h2","depth":2,"href":"#React%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB","text":"Reactをインストール","html":"Reactをインストール"},{"tag":"h2","depth":2,"href":"#%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%93%E3%82%80","text":"ボタンのデザインを作りこむ","html":"ボタンのデザインを作りこむ"},{"tag":"h2","depth":2,"href":"#%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E3%81%8C%E4%B9%97%E3%81%A3%E3%81%9F%E6%99%82%E3%81%AB%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E8%89%B2%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B","text":"カーソルが乗った時にボタンの色を変える","html":"カーソルが乗った時にボタンの色を変える"},{"tag":"h2","depth":2,"href":"#%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%97%E3%81%A6%E3%80%81%E6%95%B0%E3%82%92%E5%A2%97%E3%82%84%E3%81%97%E3%81%9F%E3%82%8A%E6%B8%9B%E3%82%89%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B","text":"ボタンを押して、数を増やしたり減らせるようにする","html":"ボタンを押して、数を増やしたり減らせるようにする"},{"tag":"h1","depth":1,"href":"#%E3%81%8A%E3%82%8F%E3%82%8A","text":"おわり","html":"おわり"}],"ogpImageUrl":"https://www.datocms-assets.com/29850/1593190022-pastedimage20200627146.png?fm=png&mark64=aHR0cHM6Ly93d3cuZGF0b2Ntcy1hc3NldHMuY29tLzI5ODUwLzE1OTMxNTQ2MzYtdHJhbnNwYXJlbnQtcGl4ZWwucG5nP3c9NDAwJmg9NjQmZml0PWNyb3AmYmxlbmQ2ND1hSFIwY0hNNkx5OTNkM2N1WkdGMGIyTnRjeTFoYzNObGRITXVZMjl0THpJNU9EVXdMekUxT1RFNE16TXlPVEF0WVhaaGRHRnlOVEV5TG1wd1p6OXRZWE5yUFdWc2JHbHdjMlVtWm0wOWNHNW5KbmM5TWpVMkptZzlNalUyJmJsZW5kLWg9NjQmYmxlbmQteD0wJmJsZW5kLXk9MCZibGVuZC1tb2RlPW5vcm1hbCZtYXJrNjQ9YUhSMGNITTZMeTloYzNObGRITXVhVzFuYVhndWJtVjBMMzUwWlhoMFAzUjRkQzFoYkdsbmJqMXRhV1JrYkdVbE1rTnNaV1owSm5SNGRDMW1iMjUwUFhOaGJuTXRjMlZ5YVdZbE1rTmliMnhrSm5SNGRDMWpiMnh2Y2oweU1qRTRNVFltZEhoME5qUTlZek5XY0dKbkpuUjRkQzF6YVhwbFBUTXdKbWc5TmpRJm1hcmsteD02NCZtYXJrLWFsaWduPW1pZGRsZSUyQ2xlZnQ&mark-align=bottom%2Cleft&mark-x=100&mark-y=496&blend64=aHR0cHM6Ly93d3cuZGF0b2Ntcy1hc3NldHMuY29tLzI5ODUwLzE1OTMxNTQ2MzYtdHJhbnNwYXJlbnQtcGl4ZWwucG5nP3c9MTIwMCZoPTYzMCZmaXQ9Y3JvcCZtYXJrNjQ9YUhSMGNITTZMeTkzZDNjdVpHRjBiMk50Y3kxaGMzTmxkSE11WTI5dEx6STVPRFV3THpFMU9UTXhOVEE1TkRBdFkzSmhablJ6YldGdUxUQXhMbkJ1WncmbWFyay1hbGlnbj10b3AlMkNjZW50ZXImbWFyay13PTI1MCZtYXJrLXk9ODAmYmxlbmQ2ND1hSFIwY0hNNkx5OWhjM05sZEhNdWFXMW5hWGd1Ym1WMEwzNTBaWGgwUDNSNGRDMWhiR2xuYmoxdGFXUmtiR1VsTWtOalpXNTBaWEltZEhoMExXWnZiblE5YzJGdWN5MXpaWEpwWmlVeVEySnZiR1FtZEhoMExYQmhaRDB4TURBbWRIaDBMV052Ykc5eVBUSXlNVGd4TmlaMGVIUTJORDFOZWtSc2FVbGljR3h3VGxOYVYwWnFaRTlYUm5CbGJWZG5UMDlCYWs5UFFtaFBUMEpvVDA5Q2NtVlBSRzVQVDBOMkxVOUVjeTFQUVdwbFV6bHVUMkZKYTA5UFJHZGxUMFJ3WlU5RWRrOVBSR2xQVDBSeGRVOURiM1ZQUkhFdExUaG5VU1owZUhRdGMybDZaVDAxTlNaM1BURXlNREFtYUQwMk16QSZibGVuZC1tb2RlPW5vcm1hbA&blend-mode=normal","otherPost":{"type":"author","title":"「Halogen」16種のロード中アニメを表示するReactコンポーネント","slug":"/posts/48"}}}}