{"componentChunkName":"component---src-components-blog-template-js","path":"/blog/tictactoe/","result":{"data":{"markdownRemark":{"frontmatter":{"title":"Tic-Tac-Toe Game with Hooks","date":"2019-04-10"},"html":"<p>I learned a lot about React after I followed the tutorial provided by <a href=\"https://reactjs.org/tutorial/tutorial.html\">reactjs.org</a>, which is building a tic-tac-toe game. In my opinion, the tutorial is quite challenging, it consists of several stages with increasing difficulty from creating the game's logic to adding a history and time travel features.</p>\n<p>After I have completed the tutorial, I felt excited and had the urge to challenge myself to build the game again but this time with the new hype: <code class=\"language-text\">React Hooks</code></p>\n<p>The challenge with hooks was figuring out how to change the class components into functional components, which was not possible before hooks came out.</p>\n<p>The first thing that I did was desctructuring some props from Square component and changed the Board class component into a functional component. Here is the change that I did for Square component:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">Square</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> value<span class=\"token punctuation\">,</span> onClick <span class=\"token punctuation\">}</span></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>button className<span class=\"token operator\">=</span><span class=\"token string\">'square'</span> onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>onClick<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n      <span class=\"token punctuation\">{</span>value<span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>It looks cleaner with the props destructured. The next code changed was the Board component:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">Board</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> squares<span class=\"token punctuation\">,</span> onClick <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">renderSquare</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">i</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Square value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>squares<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span> onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">onClick</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Next, I went with Game component, for the state, I replaced it with <code class=\"language-text\">useState</code> such as the code below:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token operator\">...</span>\n<span class=\"token operator\">...</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>history<span class=\"token punctuation\">,</span> setHistory<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">squares</span><span class=\"token operator\">:</span> <span class=\"token function\">Array</span><span class=\"token punctuation\">(</span><span class=\"token number\">9</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">fille</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span> <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>stepNumber<span class=\"token punctuation\">,</span> setStepNumber<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>XisNext<span class=\"token punctuation\">,</span> setNext<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">handleClick</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">i</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> newHistory <span class=\"token operator\">=</span> history<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span>stepNumber <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token operator\">...</span>\n  <span class=\"token operator\">...</span>\n\n  squares<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> XisNext <span class=\"token operator\">?</span> <span class=\"token string\">'X'</span> <span class=\"token operator\">:</span> <span class=\"token string\">'O'</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">setHistory</span><span class=\"token punctuation\">(</span>newHistory<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> squares <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">setStepNumber</span><span class=\"token punctuation\">(</span>newHistory<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">setNext</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>XisNext<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token operator\">...</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Wow, look at the code above, it looks cleaner and more readable compared to using class and state. By the way, you can look the original code (without hooks) from this <a href=\"https://codepen.io/gaearon/pen/gWWZgR?editors=0010\">codepen</a>.</p>\n<p>Overall, the main purpose of using React Hooks is to make React back to <strong>functional programming</strong>. React is a JavaScript library, while JavaScript itself is a functional programming. Using hooks can avoid the use of <strong>this</strong> and <strong>bind</strong> keywords and provides simplicity.</p>"}},"pageContext":{"slug":"/tictactoe/"}},"staticQueryHashes":[]}