<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Learn on Techformist</title>
    <link>https://techformist.com/tags/learn/</link>
    <description>Recent content in Learn on Techformist</description>
    <image>
      <url>https://techformist.com/logo.svg</url>
      <link>https://techformist.com/logo.svg</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 20 Jan 2021 06:30:00 +0000</lastBuildDate><atom:link href="https://techformist.com/tags/learn/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Teleport in VueJS</title>
      <link>https://techformist.com/teleport-vuejs/</link>
      <pubDate>Wed, 20 Jan 2021 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/teleport-vuejs/</guid>
      <description>&lt;p&gt;Teleport is a new feature introduced in Vue 3. Teleport provides better control to developers on where exactly an element is rendered.&lt;/p&gt;
&lt;h2 id=&#34;get-teleporting&#34;&gt;Get Teleporting&lt;/h2&gt;
&lt;p&gt;Let us create a new Vue 3 app to start playing around with teleport. We will use Vite, because it is 2021.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm init @vitejs/app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Provide a project name (&lt;code&gt;teleport&lt;/code&gt;) and select &lt;code&gt;vue&lt;/code&gt; as the template.&lt;/p&gt;
&lt;p&gt;Install dependencies and start the app.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;cd&lt;/span&gt; teleport
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm i
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Navigate to &lt;code&gt;http://localhost:3000&lt;/code&gt; to see your new app.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Teleport is a new feature introduced in Vue 3. Teleport provides better control to developers on where exactly an element is rendered.</p>
<h2 id="get-teleporting">Get Teleporting</h2>
<p>Let us create a new Vue 3 app to start playing around with teleport. We will use Vite, because it is 2021.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm init @vitejs/app
</span></span></code></pre></div><p>Provide a project name (<code>teleport</code>) and select <code>vue</code> as the template.</p>
<p>Install dependencies and start the app.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl"><span class="k">cd</span> teleport
</span></span><span class="line"><span class="cl">npm i
</span></span><span class="line"><span class="cl">npm run dev
</span></span></code></pre></div><p>Navigate to <code>http://localhost:3000</code> to see your new app.</p>
<p>Replace the <code>&lt;template&gt;</code> section in <code>src/components/HelloWorld.vue</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>{{ msg }}<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Create a new component <code>src/components/Messages.vue</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">HelloWorld</span> <span class="na">msg</span><span class="o">=</span><span class="s">&#34;Hello&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">HelloWorld</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">HelloWorld</span> <span class="na">msg</span><span class="o">=</span><span class="s">&#34;Hi&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">HelloWorld</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">HelloWorld</span> <span class="na">msg</span><span class="o">=</span><span class="s">&#34;Goodbye&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">HelloWorld</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">setup</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="nx">HelloWorld</span> <span class="nx">from</span> <span class="s2">&#34;./HelloWorld.vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Replace <code>&lt;template&gt;</code> section in <code>src/App.vue</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">Messages</span><span class="p">&gt;&lt;/</span><span class="nt">Messages</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Vue logo&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;./assets/logo.png&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;height: 100px&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>We are just rearranging a couple of things and setting the stage for demonstrating teleport.</p>
<p>You will see output as expected -</p>
<p><img loading="lazy" src="/2021/vue-simple-app-no-teleport.jpg" type="" alt="vue-simple-app-no-teleport"  /></p>
<p>This makes absolute sense -</p>
<ol>
<li>You create a component and build up UI with components</li>
<li>You use the components in the parent component/view exactly in the place you need it</li>
</ol>
<p>Teleport helps us to write code in a logical fashion but have more control over where the component is rendered.</p>
<p>For e.g., we can change the code in <code>Messages.vue</code> to -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">HelloWorld</span> <span class="na">msg</span><span class="o">=</span><span class="s">&#34;Hello&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">HelloWorld</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">HelloWorld</span> <span class="na">msg</span><span class="o">=</span><span class="s">&#34;Hi&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">HelloWorld</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">teleport</span> <span class="na">to</span><span class="o">=</span><span class="s">&#34;#startapp&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">HelloWorld</span> <span class="na">msg</span><span class="o">=</span><span class="s">&#34;Goodbye&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">HelloWorld</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">teleport</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Now, change <code>App.vue</code> to -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;startapp&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">Messages</span><span class="p">&gt;&lt;/</span><span class="nt">Messages</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Vue logo&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;./assets/logo.png&#34;</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;height: 100px&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>The third message is moved to the first position, i.e, the rendering of the component will be teleported to the tag with id <code>startapp</code>.</p>
<p>You may in fact transport anything outside of the entire Vue render tree. For e.g., change <code>index.html</code> to -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&#34;en&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&#34;UTF-8&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;icon&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/favicon.ico&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;viewport&#34;</span> <span class="na">content</span><span class="o">=</span><span class="s">&#34;width=device-width, initial-scale=1.0&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>Vite App<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;startapp&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;app&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;module&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;/src/main.js&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</span></span></code></pre></div><p><img loading="lazy" src="/2021/vue-simple-app-teleport.jpg" type="" alt="vue-simple-app-teleport"  /></p>
<h2 id="where-to-use-teleport">Where to use teleport?</h2>
<p>Teleport offers a cleaner segregation from the &ldquo;coding&rdquo; side of things as compared to where a component/element is rendered.</p>
<p>Here are a couple of use cases where teleport can help-</p>
<ul>
<li>High degree of control over positioning of elements: Display elements like status bar always at the bottom of page - no matter where they are used. You are not constrained to code in those components at the very end</li>
<li>Modals: You can have a conditional display of modal dialog anywhere in the app, but you may want to move it to end. Or, you may move a full-screen modal to the <code>body</code> tag and have a cleaner UI</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Create a Task Management App with ReactJS in 2021</title>
      <link>https://techformist.com/task-management-app-reactjs-2021/</link>
      <pubDate>Wed, 13 Jan 2021 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/task-management-app-reactjs-2021/</guid>
      <description>&lt;p&gt;In this post let us see how we can easily build a task management app (which is totally &amp;amp; completely different from a todo app) using ReactJS. We will be using React Hooks, Chota CSS for styling and a lot of ES6+. We will not look at any centralised state management, or deal with a backend to store the tasks in this post.&lt;/p&gt;
&lt;h2 id=&#34;get-started&#34;&gt;Get Started&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;create-react-app&lt;/code&gt; to structure your project like any sane person would do -&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In this post let us see how we can easily build a task management app (which is totally &amp; completely different from a todo app) using ReactJS. We will be using React Hooks, Chota CSS for styling and a lot of ES6+. We will not look at any centralised state management, or deal with a backend to store the tasks in this post.</p>
<h2 id="get-started">Get Started</h2>
<p>Use <code>create-react-app</code> to structure your project like any sane person would do -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npx create-react-app tasker-react-sample-app
</span></span></code></pre></div><p>Proceed to have a dozen cups of coffee while your app gets initialised. Open the project root folder in VSCode to see this beautiful structure.</p>
<p><img loading="lazy" src="/2021/create-react-app-structure.jpg" type="" alt="create-react-app-structure"  /></p>
<p>Start your app..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm run start
</span></span></code></pre></div><p>Navigate to <code>http://localhost:3000</code> in your browser to see the app.</p>
<p>While the create-react-app seems to do a lot of things (it does), you only need to care about a few things at this time -</p>
<ul>
<li>The app gets anchored with one HTML file <code>public/index.html</code> and in a single node <code>&lt;div id=&quot;root&quot;&gt;&lt;/div&gt;</code> (for the most part, bear with me). The file itself will not have direct reference to the javascript - that will be done through a build step</li>
<li><code>src/index.js</code> refers to the <code>root</code> element
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">ReactDOM</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="o">&lt;</span><span class="nx">React</span><span class="p">.</span><span class="nx">StrictMode</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="nx">App</span> <span class="o">/&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="o">&lt;</span><span class="err">/React.StrictMode&gt;,</span>
</span></span><span class="line"><span class="cl">  <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;root&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span></code></pre></div></li>
<li><code>App</code> in <code>index.js</code> is where you will start coding React magic. You shall use JSX in the React components to do all that magic, or you shall perish -
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">App</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;App&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">header</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;App-header&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
</ul>
<p>Read more about JSX <a href="https://reactjs.org/docs/introducing-jsx.html">here</a>, or just follow along by keeping mind two things -</p>
<ul>
<li>You can code all the HTML you want within JSX</li>
<li>Use <code>className</code> instead of <code>class</code> to reference css classes</li>
<li>Use <code>{ }</code> notation within JSX for expressions, variables etc.</li>
</ul>
<p>Let&rsquo;s do a quick take on how the components work. Create a new file <code>src/components/HelloWorld.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nx">HelloWorld</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">h3</span><span class="p">&gt;</span><span class="nx">Hello</span> <span class="nx">World</span><span class="p">&lt;/</span><span class="nt">h3</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>JSX can have only one root - <code>&lt;&gt;&lt;/&gt;</code> tags take care of that. Rest is just plain HTML.</p>
<p>Include <code>HelloWorld</code> in <code>App.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">logo</span> <span class="nx">from</span> <span class="s2">&#34;./logo.svg&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="s2">&#34;./App.css&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">HelloWorld</span> <span class="nx">from</span> <span class="s2">&#34;./components/HelloWorld&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">App</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;App&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">header</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;App-header&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="cm">/* - existing code goes here - */</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">HelloWorld</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">App</span><span class="p">;</span>
</span></span></code></pre></div><p>You can see the bold words in your app almost immediately.</p>
<p>Before we proceed, install a few things to make your React development easier -</p>
<ol>
<li>Install <a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en">React Developer Tools</a>. This will add a couple of tabs in your Chrome Developer Tools to view components. By default you should see <code>Components</code> and <code>Profiler</code></li>
<li>Install VSCode extension <a href="https://marketplace.visualstudio.com/itemdetails?itemName=dsznajder.es7-react-js-snippets">ES7 React/Redux/GraphQL/React-Native snippets</a> that will give you a bunch of useful snippets</li>
</ol>
<p>You can use Emmet scripts to quickly create boilerplate and scripts - for e.g. create a new file and type in <code>rfce</code> and tab to see it in action.</p>
<p>Let us also include some styles, because well, we&rsquo;re not cave-men.</p>
<p>Include the below line in your <code>index.html</code> to include a small, class-light library called <code>chota.css</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/chota@latest&#34;</span> <span class="p">/&gt;</span>
</span></span></code></pre></div><p>Create a new file <code>src/assets/styles.css</code> and leave it blank for now. We will use it for custom styling. Include the file in <code>App.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="s2">&#34;./assets/styles.css&#34;</span><span class="p">;</span>
</span></span></code></pre></div><p>I will not really touch upon this topic again - but you can see the CSS code in the Github repo.</p>
<h2 id="creating-structure-for-your-app">Creating Structure for your App</h2>
<p>Let us create the basic elements for our app. First, the header - create a new file called <code>src/components/Header.js</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Header</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">nav</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;nav&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;nav-left&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">a</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;brand&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;#&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nx">Tasker</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;nav-right&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;tabs&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://techformist.com&#34;</span><span class="p">&gt;</span><span class="nx">Techformist</span><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">nav</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Header</span><span class="p">;</span>
</span></span></code></pre></div><p>We have seen this earlier - JSX and stuff. The only difference is the CSS classes. Let&rsquo;s include this <code>Header</code> in <code>App.js</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Header</span> <span class="nx">from</span> <span class="s2">&#34;./components/Header&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ... other code
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">App</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// ...
</span></span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;App&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span><span class="cm">/* .. */</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">Header</span><span class="p">&gt;&lt;/</span><span class="nt">Header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span><span class="cm">/* .. */</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The above changes should give you a good idea about where we are going. We create a <code>Header</code> component, and include it in the main <code>App</code> so that it&rsquo;s available everywhere in the app.</p>
<p>We can now include the main content just below <code>Header</code>.</p>
<h2 id="create-tasks-component">Create Tasks Component</h2>
<p>The simplest way to create a task component is familiar to us by now. Create a new file <code>src/components/Tasks.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Tasks</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;row&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-12&#34;</span><span class="p">&gt;</span><span class="nx">Learn</span> <span class="nx">React</span><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-12&#34;</span><span class="p">&gt;</span><span class="nx">Profit</span><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Tasks</span><span class="p">;</span>
</span></span></code></pre></div><p>Include <code>Tasks</code> in <code>App</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Tasks</span> <span class="nx">from</span> <span class="s2">&#34;./components/Tasks&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ... other code
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">App</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// ...
</span></span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;App&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span><span class="cm">/* .. */</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">Header</span><span class="p">&gt;&lt;/</span><span class="nt">Header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">button</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;button&#34;</span><span class="p">&gt;</span><span class="nx">New</span><span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">Tasks</span><span class="p">&gt;&lt;/</span><span class="nt">Tasks</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span><span class="cm">/* .. */</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>You should now be able to see the tasks and a button &ldquo;New&rdquo; that doesn&rsquo;t do anything.</p>
<p>Let&rsquo;s level up. We will create a state variable <code>tasks</code> that will store tasks and can be accessible from different components. We could eventually use this variable to store tasks retrieved from a database or a file.</p>
<p>In the simplest design we could create <code>tasks</code> in <code>Tasks</code> component, but that would make it difficult to access in a different component. For example, we need <code>tasks</code> in both <code>Tasks</code>, which is a list of tasks, and <code>TaskDetail</code>, which shows the detail task and allows user to edit tasks. So, let&rsquo;s create <code>tasks</code> in <code>App.js</code> for now.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">import</span> <span class="s2">&#34;./App.css&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="s2">&#34;./assets/styles.css&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Header</span> <span class="nx">from</span> <span class="s2">&#34;./components/Header&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Tasks</span> <span class="nx">from</span> <span class="s2">&#34;./components/Tasks&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">useState</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;react&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">App</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="p">[</span><span class="nx">tasks</span><span class="p">,</span> <span class="nx">setTasks</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">([</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="nx">desc</span><span class="o">:</span> <span class="s2">&#34;Learn React&#34;</span><span class="p">,</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">1</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="nx">desc</span><span class="o">:</span> <span class="s2">&#34;Profit&#34;</span><span class="p">,</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">2</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;App&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">Header</span><span class="p">&gt;&lt;/</span><span class="nt">Header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">Tasks</span> <span class="na">tasks</span><span class="o">=</span><span class="p">{</span><span class="nx">tasks</span><span class="p">}&gt;&lt;/</span><span class="nt">Tasks</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">App</span><span class="p">;</span>
</span></span></code></pre></div><p>We have done a couple of cool things here -</p>
<ol>
<li>Import <code>useState</code> from React</li>
<li>Create <code>tasks</code> and initialize it. <code>tasks</code> is the variable name and <code>setTasks</code> is used to set this variable with a value. We will not be using <code>setTasks</code> right now, but directly provide the initial value as a param to <code>useState</code>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">tasks</span><span class="p">,</span> <span class="nx">setTasks</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">([</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span> <span class="nx">desc</span><span class="o">:</span> <span class="s2">&#34;Learn React&#34;</span><span class="p">,</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">1</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span> <span class="nx">desc</span><span class="o">:</span> <span class="s2">&#34;Profit&#34;</span><span class="p">,</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">2</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">]);</span>
</span></span></code></pre></div></li>
<li>Pass <code>tasks</code> as props to the <code>Tasks</code> component</li>
</ol>
<p>Let us receive <code>tasks</code> prop in our <code>Tasks</code> component.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Tasks</span><span class="p">({</span> <span class="nx">tasks</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;row&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-12 text-right&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">button</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;button primary&#34;</span><span class="p">&gt;</span><span class="nx">New</span><span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span><span class="nx">tasks</span><span class="p">.</span><span class="nx">map</span><span class="p">((</span><span class="nx">task</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-12 text-left&#34;</span> <span class="na">key</span><span class="o">=</span><span class="p">{</span><span class="nx">task</span><span class="p">.</span><span class="nx">id</span><span class="p">}&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">h4</span><span class="p">&gt;{</span><span class="nx">task</span><span class="p">.</span><span class="nx">desc</span><span class="p">}&lt;/</span><span class="nt">h4</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">})}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Tasks</span><span class="p">;</span>
</span></span></code></pre></div><p>As you can see -</p>
<ol>
<li>We receive a destructured <code>tasks</code> prop in the function. You could also define param as simply <code>props</code> (no brackets, no destructuring), and refer to tasks as <code>props.tasks</code></li>
<li>We cycle through <code>tasks</code> and display individual task using <code>h3</code> element. The brackets contain the overall expression in JSX
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">tasks</span><span class="p">.</span><span class="nx">map</span><span class="p">((</span><span class="nx">task</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-12 text-left&#34;</span> <span class="na">key</span><span class="o">=</span><span class="p">{</span><span class="nx">task</span><span class="p">.</span><span class="nx">id</span><span class="p">}&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">h4</span><span class="p">&gt;{</span><span class="nx">task</span><span class="p">.</span><span class="nx">desc</span><span class="p">}&lt;/</span><span class="nt">h4</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
</ol>
<p>You should now see..</p>
<h2 id="create-task-component">Create Task Component</h2>
<p><code>Tasks</code> component is doing too many things -</p>
<ol>
<li>List tasks</li>
<li>Show task</li>
<li>er.. that&rsquo;s about it, but it has the potential to much more</li>
</ol>
<p>Let&rsquo;s break the component so that display of a task becomes concern of a different component.</p>
<p>Create a new file <code>src/components/Task.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Task</span><span class="p">({</span> <span class="nx">task</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-12 text-left&#34;</span> <span class="na">key</span><span class="o">=</span><span class="p">{</span><span class="nx">task</span><span class="p">.</span><span class="nx">id</span><span class="p">}&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">h4</span><span class="p">&gt;{</span><span class="nx">task</span><span class="p">.</span><span class="nx">desc</span><span class="p">}&lt;/</span><span class="nt">h4</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Task</span><span class="p">;</span>
</span></span></code></pre></div><p>The code is a direct copy of the fragment responsible to display a specific task in <code>Tasks</code> component.</p>
<p>Include <code>Task</code> in <code>Tasks</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Task</span> <span class="nx">from</span> <span class="s2">&#34;./Task&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Tasks</span><span class="p">({</span> <span class="nx">tasks</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;row&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-12 text-right&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">button</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;button primary&#34;</span><span class="p">&gt;</span><span class="nx">New</span><span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span><span class="nx">tasks</span><span class="p">.</span><span class="nx">map</span><span class="p">((</span><span class="nx">task</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">Task</span> <span class="na">task</span><span class="o">=</span><span class="p">{</span><span class="nx">task</span><span class="p">}</span> <span class="na">key</span><span class="o">=</span><span class="p">{</span><span class="nx">task</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">))}</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-12&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Tasks</span><span class="p">;</span>
</span></span></code></pre></div><p>This is very similar to last time when we included one component in another. We are just using an additional attribute called <code>key</code>, which denotes the unique identifier of each element in the array (and that will be <code>task.id</code> in our case).</p>
<p>The added advantage of segregating task display is that we can use this <code>Task</code> component to display individual task anywhere in the application.</p>
<p>Fantastic.</p>
<p>Let us add more attributes to the task and beautify this a bit. Afterall, a task is not simply about the description.</p>
<p>Add more attributes to the task in <code>App</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">tasks</span><span class="p">,</span> <span class="nx">setTasks</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">([</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span> <span class="nx">desc</span><span class="o">:</span> <span class="s2">&#34;Learn React&#34;</span><span class="p">,</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">date</span><span class="o">:</span> <span class="s2">&#34;2021-01-03 10:00&#34;</span><span class="p">,</span> <span class="nx">status</span><span class="o">:</span> <span class="s2">&#34;Complete&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span> <span class="nx">desc</span><span class="o">:</span> <span class="s2">&#34;Profit&#34;</span><span class="p">,</span> <span class="nx">id</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">date</span><span class="o">:</span> <span class="s2">&#34;2021-01-05 15:00&#34;</span><span class="p">,</span> <span class="nx">status</span><span class="o">:</span> <span class="s2">&#34;Open&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">]);</span>
</span></span></code></pre></div><p>Change <code>Task.js</code> to make tasks come alive -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Task</span><span class="p">({</span> <span class="nx">task</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;card text-left&#34;</span> <span class="na">key</span><span class="o">=</span><span class="p">{</span><span class="nx">task</span><span class="p">.</span><span class="nx">id</span><span class="p">}&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;row&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-10&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">h4</span><span class="p">&gt;{</span><span class="nx">task</span><span class="p">.</span><span class="nx">desc</span><span class="p">}&lt;/</span><span class="nt">h4</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;task-meta&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">img</span>
</span></span><span class="line"><span class="cl">              <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://icongr.am/feather/calendar.svg?size=12&amp;color=b5b5b5&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">alt</span><span class="o">=</span><span class="s">&#34;calendar&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span><span class="nx">task</span><span class="p">.</span><span class="nx">date</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-2 is-center&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">button</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;button icon-only clear&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">img</span>
</span></span><span class="line"><span class="cl">              <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://icongr.am/feather/check-circle.svg?size=24&amp;color=11d054&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Open&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;col-12&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;{</span><span class="nx">task</span><span class="p">.</span><span class="nx">remarks</span><span class="p">}&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Task</span><span class="p">;</span>
</span></span></code></pre></div><p>And, voila..</p>
<p><img loading="lazy" src="/2021/tasker-task-lists-simple.jpg" type="" alt="tasker-task-lists-simple"  /></p>
<h2 id="add-functionality-complete-task">Add Functionality: Complete Task</h2>
<p>We have successfully displayed a task so far, but we don&rsquo;t have any functionality enabled on the task. We will change that by inserting a button to toggle the task status.</p>
<p>Add a function that can get called to change status. If we had a global state (e.g. Redux), we would have more independence to decide where this function has to reside. Since we are using a simple state at <code>App</code> level, we will introduce the function to change that state also within <code>App</code>. Create a new function -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">onTglStatus</span> <span class="o">=</span> <span class="p">(</span><span class="nx">task</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;completing task&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>The child component (<code>Tasks</code> in our case) does not know about this method. We have to pass the function to the inner-most component that will call it for some greater good.</p>
<p>Change <code>App.js</code> to pass <code>onTglStatus</code> as a prop -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">Tasks</span> <span class="na">tasks</span><span class="o">=</span><span class="p">{</span><span class="nx">tasks</span><span class="p">}</span> <span class="na">onTglStatus</span><span class="o">=</span><span class="p">{</span><span class="nx">onTglStatus</span><span class="p">}&gt;&lt;/</span><span class="nt">Tasks</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//  ...
</span></span></span></code></pre></div><p>Repeat the above code in <code>Tasks.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Tasks</span><span class="p">({</span> <span class="nx">tasks</span><span class="p">,</span> <span class="nx">onTglStatus</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">Task</span> <span class="na">task</span><span class="o">=</span><span class="p">{</span><span class="nx">task</span><span class="p">}</span> <span class="na">onTglStatus</span><span class="o">=</span><span class="p">{</span><span class="nx">onTglStatus</span><span class="p">}</span> <span class="p">/&gt;;</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Call the function in <code>Task.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Task</span><span class="p">({</span> <span class="nx">task</span><span class="p">,</span> <span class="nx">onTglStatus</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">button</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;button icon-only clear&#34;</span> <span class="na">onClick</span><span class="o">=</span><span class="p">{()</span> <span class="p">=&gt;</span> <span class="nx">onTglStatus</span><span class="p">(</span><span class="nx">task</span><span class="p">)}&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="o">&gt;</span> <span class="s2">&#34;⬜&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;;</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Click the button to see the debug statement in developer console.</p>
<p>We have moved props including variables(state) and functions that act on the state down the chain, and events get surfaced up the component chain!</p>
<p>Add the function to do something beyond just a debug statement in <code>App.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">onTglStatus</span> <span class="o">=</span> <span class="p">(</span><span class="nx">task</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;completing task&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">setTasks</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="nx">tasks</span><span class="p">.</span><span class="nx">map</span><span class="p">((</span><span class="nx">chkTask</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">chkTask</span><span class="p">.</span><span class="nx">complete</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">        <span class="nx">task</span><span class="p">.</span><span class="nx">id</span> <span class="o">===</span> <span class="nx">chkTask</span><span class="p">.</span><span class="nx">id</span> <span class="o">?</span> <span class="o">!</span><span class="nx">chkTask</span><span class="p">.</span><span class="nx">complete</span> <span class="o">:</span> <span class="nx">chkTask</span><span class="p">.</span><span class="nx">complete</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="nx">chkTask</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">})</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>In the above code we use <code>Array.map</code> function to change status for the matching record. The matching record (<code>task</code>) is supplied by the function called by button click event.</p>
<p>Let us change the checkbox/button in indicate completed tasks in <code>Task.js</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">button</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;button icon-only clear&#34;</span> <span class="na">onClick</span><span class="o">=</span><span class="p">{()</span> <span class="p">=&gt;</span> <span class="nx">onTglStatus</span><span class="p">(</span><span class="nx">task</span><span class="p">)}&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="nx">task</span><span class="p">.</span><span class="nx">complete</span> <span class="o">&amp;&amp;</span> <span class="s2">&#34;✅&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="o">!</span><span class="nx">task</span><span class="p">.</span><span class="nx">complete</span> <span class="o">&amp;&amp;</span> <span class="s2">&#34;⬜&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span></code></pre></div><p>We use one of the old Javascript tricks to display <code>✅</code> when task is complete.</p>
<ul>
<li><code>{task.complete &amp;&amp; &quot;✅&quot;}</code> evaluates to <code>✅</code> when <code>task.complete</code> is true. Else this returns nothing</li>
<li>The next expression <code>{!task.complete &amp;&amp; &quot;⬜&quot;}</code> returns <code>⬜</code> when <code>task.complete</code> is false</li>
</ul>
<p>Since our application is reactive to changes and the button label gets driven by data, we see the below behaviour.</p>
<p><img loading="lazy" src="/2021/reactive-buttons-data-react.gif" type="" alt="reactive-buttons-data-react"  /></p>
<h2 id="add-functionality-add-task">Add Functionality: Add Task</h2>
<p>We need to get task data from user and save new tasks. To that end, add the function to save tasks <code>onSaveTask</code> in <code>App.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">onSaveTask</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">desc</span><span class="p">,</span> <span class="nx">date</span> <span class="p">})</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;saving tasks&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">setTasks</span><span class="p">([</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="nx">desc</span><span class="o">:</span> <span class="nx">desc</span><span class="p">,</span> <span class="nx">date</span><span class="o">:</span> <span class="nx">date</span><span class="p">,</span> <span class="nx">id</span><span class="o">:</span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span><span class="p">(),</span> <span class="nx">complete</span><span class="o">:</span> <span class="kc">false</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">...</span><span class="nx">tasks</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>We are using <code>setTasks</code> like before, but this time we are adding a new element to the array. Again, we don&rsquo;t add the element directly to array since the state variable is immutable. We rather do this -</p>
<ol>
<li>create a new variable</li>
<li>Add <code>{ desc: desc, date: date, id: Date.now(), complete: false },</code> as the first element. <code>desc</code> and <code>date</code> are passed along by the form used to create new tasks. <code>Date.now()</code> is a simple way to make the id unique</li>
<li>Add the existing array elements to the new array variable <code>...tasks</code></li>
</ol>
<p>Next, add a new form to collect data. Let&rsquo;s create a new component <code>src/components/TaskEdit.js</code>. This component will receive the function <code>onSaveTask</code> as props and call it on button click.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">useState</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;react&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">TaskEdit</span><span class="p">({</span> <span class="nx">task</span><span class="p">,</span> <span class="nx">onSaveTask</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="p">[</span><span class="nx">desc</span><span class="p">,</span> <span class="nx">setDesc</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="p">[</span><span class="nx">date</span><span class="p">,</span> <span class="nx">setDate</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">saveTask</span> <span class="o">=</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nx">onSaveTask</span><span class="p">({</span> <span class="nx">desc</span><span class="o">:</span> <span class="nx">desc</span><span class="p">,</span> <span class="nx">date</span><span class="o">:</span> <span class="nx">date</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">setDesc</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">setDate</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;card&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">h3</span><span class="p">&gt;</span><span class="nx">Add</span> <span class="nx">Task</span><span class="p">&lt;/</span><span class="nt">h3</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">form</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">label</span> <span class="na">htmlFor</span><span class="o">=</span><span class="s">&#34;desc&#34;</span><span class="p">&gt;</span><span class="nx">Description</span><span class="p">&lt;/</span><span class="nt">label</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">input</span>
</span></span><span class="line"><span class="cl">          <span class="na">type</span><span class="o">=</span><span class="s">&#34;text&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">name</span><span class="o">=</span><span class="s">&#34;desc&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">id</span><span class="o">=</span><span class="s">&#34;desc&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">value</span><span class="o">=</span><span class="p">{</span><span class="nx">desc</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">          <span class="na">onChange</span><span class="o">=</span><span class="p">{(</span><span class="nx">e</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nx">setDesc</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">)}</span>
</span></span><span class="line"><span class="cl">        <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">label</span> <span class="na">htmlFor</span><span class="o">=</span><span class="s">&#34;date&#34;</span><span class="p">&gt;</span><span class="nb">Date</span><span class="p">&lt;/</span><span class="nt">label</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">input</span>
</span></span><span class="line"><span class="cl">          <span class="na">type</span><span class="o">=</span><span class="s">&#34;text&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">name</span><span class="o">=</span><span class="s">&#34;date&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">id</span><span class="o">=</span><span class="s">&#34;date&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">value</span><span class="o">=</span><span class="p">{</span><span class="nx">date</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">          <span class="na">onChange</span><span class="o">=</span><span class="p">{(</span><span class="nx">e</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nx">setDate</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">)}</span>
</span></span><span class="line"><span class="cl">        <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;text-right&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">button</span> <span class="na">className</span><span class="o">=</span><span class="s">&#34;button dark&#34;</span> <span class="na">onClick</span><span class="o">=</span><span class="p">{</span><span class="nx">saveTask</span><span class="p">}&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nx">Save</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">form</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">TaskEdit</span><span class="p">;</span>
</span></span></code></pre></div><p>We have gone through some of the functions implemented here, while rest are mostly HTML -</p>
<ol>
<li><code>const [desc, setDesc] = useState(&quot;&quot;);</code> creates a new state variale local to <code>TaskEdit</code> and initiates it to <code>&quot;&quot;</code></li>
<li>a standard HTML form displays a couple of text boxes to collect <code>desc</code> and <code>date</code></li>
<li><code>Save</code> button calls a local method <code>saveTask</code>, which will call the <code>onSaveTask</code> function in <code>App.js</code> and resets form</li>
</ol>
<p>Add functionality to <code>New</code> button so that it displays the <code>TaskEdit</code> component and associated form (and can also toggle to hide the form).</p>
<p>In <code>App.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-jsx" data-lang="jsx"><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">showTaskEdit</span><span class="p">,</span> <span class="nx">setShowTaskEdit</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">button</span>
</span></span><span class="line"><span class="cl">  <span class="na">className</span><span class="o">=</span><span class="s">&#34;button outline&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">onClick</span><span class="o">=</span><span class="p">{()</span> <span class="p">=&gt;</span> <span class="nx">setShowTaskEdit</span><span class="p">(</span><span class="o">!</span><span class="nx">showTaskEdit</span><span class="p">)}&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="o">!</span><span class="nx">showTaskEdit</span> <span class="o">&amp;&amp;</span> <span class="s2">&#34;New&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span><span class="nx">showTaskEdit</span> <span class="o">&amp;&amp;</span> <span class="s2">&#34;➖&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">showTaskEdit</span> <span class="o">&amp;&amp;</span> <span class="p">&lt;</span><span class="nt">TaskEdit</span> <span class="na">task</span><span class="o">=</span><span class="p">{{}}</span> <span class="na">onSaveTask</span><span class="o">=</span><span class="p">{</span><span class="nx">onSaveTask</span><span class="p">}</span> <span class="p">/&gt;;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">//  ...
</span></span></span></code></pre></div><p>We conditionally show <code>TaskEdit</code> only if <code>showTaskEdit</code> is <code>true</code>.</p>
<p>Time to see the complete application in action -</p>
<p><img loading="lazy" src="/2021/react-task-manager--simple-app-demo.gif" type="" alt="react-task-manager&ndash;simple-app-demo"  /></p>
<h2 id="next-steps">Next Steps</h2>
<ul>
<li>Enable user to edit tasks to change description and dates</li>
<li>Add a backend for your task manager</li>
</ul>
<p>Code for this project is available in the <a href="https://github.com/prashanth1k/tasker-react-sample-app">Github repo</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Get Started on NextJS</title>
      <link>https://techformist.com/get-started-nextjs/</link>
      <pubDate>Wed, 06 Jan 2021 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/get-started-nextjs/</guid>
      <description>&lt;p&gt;Welcome to 2021. For me this will be an exciting year when I embrace ReactJS and Svelte as friends. And, what better way to start with React than NextJS..? In this post, we will see why and how we can get started on NextJS, and a few good learning resources.&lt;/p&gt;
&lt;h2 id=&#34;but-why&#34;&gt;But, why?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;React continues to be a leader with ~50% market share. It enjoys a lot of developer confidence, community contribution and widespread adoption&lt;/li&gt;
&lt;li&gt;More users have meant more support for the smallest of issues&lt;/li&gt;
&lt;li&gt;React and associated frameworks have been at the forefront of new developments - that may be in the way pages interact with data (Hooks, Suspense), in how front-end gets/updates data (React Server Components), or how the latest technologies can speed up development and enable you to use hybrid frameworks to get things done (Next)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Vue will not be completely replaced in my toolbox - not unless I find a shiny new thing that can completely replace it. In today&amp;rsquo;s world everyone learns from each other and adapts rather quickly - so that scenario is not likely to play out.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Welcome to 2021. For me this will be an exciting year when I embrace ReactJS and Svelte as friends. And, what better way to start with React than NextJS..? In this post, we will see why and how we can get started on NextJS, and a few good learning resources.</p>
<h2 id="but-why">But, why?</h2>
<ol>
<li>React continues to be a leader with ~50% market share. It enjoys a lot of developer confidence, community contribution and widespread adoption</li>
<li>More users have meant more support for the smallest of issues</li>
<li>React and associated frameworks have been at the forefront of new developments - that may be in the way pages interact with data (Hooks, Suspense), in how front-end gets/updates data (React Server Components), or how the latest technologies can speed up development and enable you to use hybrid frameworks to get things done (Next)</li>
</ol>
<p>Vue will not be completely replaced in my toolbox - not unless I find a shiny new thing that can completely replace it. In today&rsquo;s world everyone learns from each other and adapts rather quickly - so that scenario is not likely to play out.</p>
<h2 id="why-next">Why Next?</h2>
<ul>
<li>Next is a hybrid framework. From the same code base you can -
<ul>
<li>fetch content and generate pages on the server-side at runtime. Rapidly changing sites incl. eCommerce sites.</li>
<li>enable client-side data fetching for classic single page applications</li>
<li>generate static sites. Just fetch data and create final HTML pages at build time. Useful for Blogs, documentation sites. Oor, go rogue with incremental static files that can generate pages and hold on to them for specified time (I love this!)</li>
</ul>
</li>
<li>Built-in router that needs you to just create pages to enable routing. Not really a problem in the Vue world (Vue router becomes second nature), but I see React as more fragmented. Router in Next is easy to understand and scale</li>
<li>Many features that optimize applications incl. code splitting, ability to use HTML or JSON to deliver pages, and so on</li>
<li>Many, many features that make development of large apps easier</li>
<li>Super active development and large community.</li>
</ul>
<h2 id="how-to-get-started">How to get started?</h2>
<p>Here&rsquo;s the complicated ceremonty to initiate a Next project.</p>
<ol>
<li>Install NodeJS</li>
<li>Enter command <code>npx create-next-app do-awesome</code></li>
</ol>
<p>Run your app with <code>npm run dev</code> to meet this screen.</p>
<p><img loading="lazy" src="/2021/create-next-app-starting-page.jpg" type="" alt="create-next-app-starting-page"  /></p>
<p>You have the standard SPA development experience - change page content to see the changes reflected immediately.</p>
<ol>
<li>Add new page <code>pages/todo.js</code></li>
<li>Enter below code -
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nx">Todo</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="o">&lt;</span><span class="nx">h3</span><span class="o">&gt;</span><span class="nx">Todo</span> <span class="nx">Awesome</span><span class="o">&lt;</span><span class="err">/h3&gt;;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
</ol>
<p>Navigate to <code>http://localhost:3000/todo</code> to see the new page.</p>
<p>Let&rsquo;s write some simple code in <code>todos</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Todo</span><span class="p">({</span> <span class="nx">todos</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">h2</span><span class="o">&gt;</span><span class="nx">Todo</span> <span class="nx">Awesome</span><span class="o">&lt;</span><span class="err">/h2&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span><span class="nx">todos</span><span class="p">.</span><span class="nx">map</span><span class="p">((</span><span class="nx">todo</span><span class="p">,</span> <span class="nx">index</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="nx">li</span> <span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">index</span><span class="p">}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">description</span><span class="p">}</span><span class="o">&amp;</span><span class="nx">emsp</span><span class="p">;</span><span class="err">⇋</span> <span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">status</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="err">/li&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">))}</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="kd">function</span> <span class="nx">getServerSideProps</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">todos</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="nx">description</span><span class="o">:</span> <span class="s2">&#34;Write blog post&#34;</span><span class="p">,</span> <span class="nx">status</span><span class="o">:</span> <span class="s2">&#34;Open&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="nx">description</span><span class="o">:</span> <span class="s2">&#34;Learn magic trick&#34;</span><span class="p">,</span> <span class="nx">status</span><span class="o">:</span> <span class="s2">&#34;Open&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="nx">description</span><span class="o">:</span> <span class="s2">&#34;Profit from blog&#34;</span><span class="p">,</span> <span class="nx">status</span><span class="o">:</span> <span class="s2">&#34;Cancelled&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">props</span><span class="o">:</span> <span class="p">{</span> <span class="nx">todos</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Todo</span><span class="p">;</span>
</span></span></code></pre></div><p>We did good in a few lines of code -</p>
<ol>
<li>Created some static data in <code>todos</code> as part of <code>getServerSideProps</code> and returned that as <code>props</code></li>
<li><code>getServerSideProps</code> gets executed for every function call, i.e., everytime we visit the route <code>/todos</code>. Rendering function <code>Todo</code> gets the data passed in as props</li>
<li><code>Todo</code> takes care of rendering the todos</li>
</ol>
<p>Rather simple and elegant.</p>
<p><img loading="lazy" src="/2021/next-page-basic-todo.jpg" type="" alt="next-page-basic-todo"  /></p>
<h2 id="add-styles">Add Styles</h2>
<p>There is more than one way to do things in Next, just like in React - unfortunately.
I follow three distinct patterns.</p>
<h4 id="global-or-module-level-styles">Global or Module Level Styles</h4>
<p>Include CSS in <code>styles &gt; global.css</code> for all styles applicable globally. Similarly, <code>&lt;your-page&gt;.module.css</code> gets applied to <code>&lt;your-page&gt;</code>.</p>
<p>There&rsquo;s nothing preventing you from going old school and simple do -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="s2">&#34;../styles.css&#34;</span><span class="p">;</span>
</span></span></code></pre></div><p>.. in any component, but the previous pattern is simpler to use.</p>
<h4 id="global-or-module-level-css-with-cdn">Global or Module Level CSS with CDN</h4>
<p>Use the Next <code>&lt;Head&gt;&lt;/Head&gt;</code> tag anywhere - in <code>_app</code> for global styles or in any modules. Introduce CSS within the <code>HEAD</code> component.</p>
<p>Let us go ahead and do this for our app. Change <code>_app.js</code> to-</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="s2">&#34;../styles/globals.css&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Head</span> <span class="nx">from</span> <span class="s2">&#34;next/head&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">MyApp</span><span class="p">({</span> <span class="nx">Component</span><span class="p">,</span> <span class="nx">pageProps</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">Head</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="nx">link</span> <span class="nx">rel</span><span class="o">=</span><span class="s2">&#34;stylesheet&#34;</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&#34;https://unpkg.com/chota&#34;</span> <span class="o">/&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="err">/Head&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;row&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-1&#34;</span><span class="o">&gt;&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-10&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="o">&lt;</span><span class="nx">Component</span> <span class="p">{...</span><span class="nx">pageProps</span><span class="p">}</span> <span class="o">/&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-1&#34;</span><span class="o">&gt;&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">MyApp</span><span class="p">;</span>
</span></span></code></pre></div><p><code>chota</code> is a small CSS framework that provides you some cool things like class-less styling, grids, out-of-the-box icons - good enough for our small project.</p>
<p>Remember that we are dealing with JSX, so we use <code>className</code> instead of <code>class</code> in normal HTML.</p>
<h4 id="style-libraries-from-npm">Style Libraries from NPM</h4>
<p>Install any CSS library through NPM. You can now include the library in <code>_app.js</code> for global styles.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="s2">&#34;bootstrap/dist/css/bootstrap.css&#34;</span><span class="p">;</span>
</span></span></code></pre></div><h2 id="add-a-db">Add a DB!</h2>
<p>Our <code>todo</code> page is static and shows the same data each time. Let us change that.</p>
<p>First, let us add prisma to our project to make database access a breeze.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm i -D @prisma/cli
</span></span><span class="line"><span class="cl">npm i @prisma/client
</span></span></code></pre></div><p>Create a new folder <code>data</code> under project root.</p>
<p>Initialize prisma -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npx prisma init
</span></span></code></pre></div><p>Prisma CLI creates a few files including -</p>
<ul>
<li><code>.env</code> file (if it doesn&rsquo;t exist) with a database URL</li>
<li><code>prisma/schema.prisma</code> contains the database connection parameters and DB models</li>
</ul>
<p>Open <code>prisma/schema.prisma</code> and replace its contents with the below code -</p>
<pre tabindex="0"><code>datasource db {
  provider = &#34;sqlite&#34;
  url      = &#34;file:../data/data.db&#34;
}

generator client {
  provider = &#34;prisma-client-js&#34;
}

model todo {
  id Int @id @default(autoincrement())
  description String
  status String
}
</code></pre><p>Run the below command to create migration and sync model to database.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npx prisma migrate dev --preview-feature
</span></span></code></pre></div><p><code>preview-feature</code> flag may not be required in later versions of prisma. You can provide any name for the migration.</p>
<p>Finally, run the <code>generate</code> command to generate client that can be used in your application.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npx prisma generate
</span></span></code></pre></div><p>You can connect to the SQLite database using a client like <a href="https://www.heidisql.com/">HeidiSQL</a> and verify whether all your changes are applied to the table.</p>
<p><img loading="lazy" src="/2021/heidi-sql-sqlite.jpg" type="" alt="heidi-sql-sqlite"  /></p>
<p>Or, you could simply do -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npx prisma studio
</span></span></code></pre></div><p>.. to open the database with a simple UI.</p>
<p><img loading="lazy" src="/2021/prisma-studio.jpg" type="" alt="prisma-studio"  /></p>
<p>You are all set to work with the SQLite database from Next using Prisma!</p>
<h2 id="get-todos">Get Todos</h2>
<p>Change <code>pages/todos.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">PrismaClient</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;@prisma/client&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">prisma</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrismaClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Todo</span><span class="p">({</span> <span class="nx">todos</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;row&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">h2</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-12 list-title is-center&#34;</span><span class="o">&gt;</span><span class="nx">My</span> <span class="nx">Todos</span><span class="o">&lt;</span><span class="err">/h2&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-12&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="nx">todoArr</span><span class="p">.</span><span class="nx">map</span><span class="p">((</span><span class="nx">todo</span><span class="p">,</span> <span class="nx">index</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">          <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;row&#34;</span> <span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">index</span><span class="p">}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-1 list-desc&#34;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&#34;id&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-5 list-desc&#34;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&#34;description&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">description</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-4&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="o">&lt;</span><span class="nx">select</span>
</span></span><span class="line"><span class="cl">                <span class="nx">name</span><span class="o">=</span><span class="s2">&#34;status&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="nx">id</span><span class="o">=</span><span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="nx">value</span><span class="o">=</span><span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">status</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="nx">onChange</span><span class="o">=</span><span class="p">{</span><span class="nx">handleStatusChange</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="nx">onBlur</span><span class="o">=</span><span class="p">{</span><span class="nx">handleSubmit</span><span class="p">}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="o">&lt;</span><span class="nx">option</span> <span class="nx">value</span><span class="o">=</span><span class="s2">&#34;Open&#34;</span><span class="o">&gt;</span><span class="nx">Open</span><span class="o">&lt;</span><span class="err">/option&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="o">&lt;</span><span class="nx">option</span> <span class="nx">value</span><span class="o">=</span><span class="s2">&#34;In Progress&#34;</span><span class="o">&gt;</span><span class="nx">In</span> <span class="nx">Progress</span><span class="o">&lt;</span><span class="err">/option&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="o">&lt;</span><span class="nx">option</span> <span class="nx">value</span><span class="o">=</span><span class="s2">&#34;Cancelled&#34;</span><span class="o">&gt;</span><span class="nx">Cancelled</span><span class="o">&lt;</span><span class="err">/option&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="o">&lt;</span><span class="err">/select&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">))}</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">async</span> <span class="kd">function</span> <span class="nx">getServerSideProps</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">todos</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">prisma</span><span class="p">.</span><span class="nx">todo</span><span class="p">.</span><span class="nx">findMany</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">    <span class="nx">orderBy</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">id</span><span class="o">:</span> <span class="s2">&#34;desc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;todos: &#34;</span><span class="p">,</span> <span class="nx">todos</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">props</span><span class="o">:</span> <span class="p">{</span> <span class="nx">todos</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Todo</span><span class="p">;</span>
</span></span></code></pre></div><p>The above code is straight-forward -</p>
<ul>
<li><code>getServerSideProps</code> includes logic that executes on the server side when a request is made to <code>http://localhost:3000/todos</code> (remember that the file is at <code>pages/todos.js</code>)</li>
<li>Next passes the data from <code>getServerSideProps</code> to render function <code>function Todo({ todos })</code></li>
<li>We display the <code>todos</code> data using JSX</li>
</ul>
<h2 id="createedit-todos">Create/Edit Todos</h2>
<p>We need Prisma (i.e., any DB operations) to run on the server. Next makes an easy task of creating backend APIs - no separate server needed (you could have your custom server though).</p>
<h3 id="create-apis">Create APIs</h3>
<h4 id="api-new-todo">API: New Todo</h4>
<p>Create new file <code>pages/api/todos/index.js</code> with below code -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">PrismaClient</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;@prisma/client&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">prisma</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrismaClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="kr">async</span> <span class="kd">function</span> <span class="nx">handle</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Processing todo request..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">id</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">query</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">method</span> <span class="o">==</span> <span class="s2">&#34;GET&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">method</span> <span class="o">==</span> <span class="s2">&#34;POST&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">newTodo</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">prisma</span><span class="p">.</span><span class="nx">todo</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">      <span class="nx">data</span><span class="o">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="nx">newTodo</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Open the Developer Console in Chrome (<code>Ctrl+Shift+i</code>) and enter -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">await</span> <span class="nx">fetch</span> <span class="p">(</span><span class="s1">&#39;http://localhost:3000/api/todos&#39;</span><span class="p">)</span><span class="sb">`
</span></span></span></code></pre></div><p>.. to see &ldquo;hello&rdquo; returned. And oh.. we added the actual method to accept data from frontend and create a new record using Prisma. All it took was a couple of lines of code.</p>
<h4 id="api-updatedelete-todo">API: Update/Delete Todo</h4>
<p>While we are here, we will also handle -</p>
<ol>
<li>Record-specific deletes (<code>DELETE</code> method that will use <code>/api/todos/1</code> to delete record with <code>id</code>=1)</li>
<li>Record-specific updates (<code>PATCH</code> method to <code>/api/todos/2</code> to update record with <code>id</code>=2)</li>
</ol>
<p>The depicted URLs are standard REST resource URLs - nothing fancy here.</p>
<p>Create new file <code>pages/api/todos/index.js</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">PrismaClient</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;@prisma/client&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">prisma</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrismaClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="kr">async</span> <span class="kd">function</span> <span class="nx">handle</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">id</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">query</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">method</span> <span class="o">==</span> <span class="s2">&#34;DELETE&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Processing todo delete..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">todo</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">prisma</span><span class="p">.</span><span class="nx">todo</span><span class="p">.</span><span class="k">delete</span><span class="p">({</span> <span class="nx">where</span><span class="o">:</span> <span class="p">{</span> <span class="nx">id</span><span class="o">:</span> <span class="nb">Number</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">}</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="nx">todo</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">method</span> <span class="o">==</span> <span class="s2">&#34;PATCH&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Processing todo update..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">newTodo</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">prisma</span><span class="p">.</span><span class="nx">todo</span><span class="p">.</span><span class="nx">update</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">      <span class="nx">data</span><span class="o">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="nx">newTodo</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>You might have noticed one key difference between the <code>GET</code> and <code>POST/DELETE/PATCH</code>. While we coded <code>GET</code> within the page itself, we used <code>api</code> folder to house update operations.</p>
<ul>
<li>While <code>prisma</code> was used in the <code>todos.js</code> page, <code>getServerSideProps</code> executes on server. So, we did not have any issues placing backend-specific logic there</li>
<li>Updates are not tied to backend in such fashion. Instead we create APIs in the <code>api</code> folder and call them using <code>fetch</code></li>
</ul>
<h3 id="change-ui-to-call-apis">Change UI to Call APIs</h3>
<p>Before we go ahead with UI changes, you would have noticed a problem with our file structure. While APIs had <code>index</code> and <code>[id]</code> files grouped under a parent <code>todos</code>, we do not have this structure in the frontend yet. Let&rsquo;s change that.</p>
<p>Create a new folder <code>pages/todos</code> - this will house all functions for <code>todos</code>. Move <code>pages/todos.js</code> to <code>pages/todos/</code> and rename it to <code>index.js</code>.</p>
<h4 id="todo-list">Todo List</h4>
<p>Replace current code in <code>pages/todos/index.js</code> with -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">useState</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;react&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">PrismaClient</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;@prisma/client&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Link</span> <span class="nx">from</span> <span class="s2">&#34;next/link&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">prisma</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrismaClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">Todo</span><span class="p">({</span> <span class="nx">todos</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="p">[</span><span class="nx">todoIn</span><span class="p">,</span> <span class="nx">setTodoIn</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="p">[</span><span class="nx">todoArr</span><span class="p">,</span> <span class="nx">setTodoArr</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">(</span><span class="nx">todos</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">handleNewTodoChange</span> <span class="o">=</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nx">setTodoIn</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">handleSubmit</span> <span class="o">=</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s2">&#34;/api/todos&#34;</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">method</span><span class="o">:</span> <span class="s2">&#34;POST&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">body</span><span class="o">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span> <span class="nx">description</span><span class="o">:</span> <span class="nx">todoIn</span><span class="p">,</span> <span class="nx">status</span><span class="o">:</span> <span class="s2">&#34;Open&#34;</span> <span class="p">}),</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">newTodo</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nx">setTodoArr</span><span class="p">([</span><span class="nx">newTodo</span><span class="p">,</span> <span class="p">...</span><span class="nx">todoArr</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">setTodoIn</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">handleStatusChange</span> <span class="o">=</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;target&#34;</span><span class="p">,</span> <span class="nx">e</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s2">&#34;/api/todos&#34;</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">method</span><span class="o">:</span> <span class="s2">&#34;POST&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nx">body</span><span class="o">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">({</span> <span class="nx">description</span><span class="o">:</span> <span class="nx">todoIn</span><span class="p">,</span> <span class="nx">status</span><span class="o">:</span> <span class="s2">&#34;Open&#34;</span> <span class="p">}),</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">newTodo</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nx">setTodoArr</span><span class="p">([</span><span class="nx">newTodo</span><span class="p">,</span> <span class="p">...</span><span class="nx">todoArr</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">deleteTodo</span> <span class="o">=</span> <span class="p">(</span><span class="nx">todo</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="kr">async</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="sb">`/api/todos/</span><span class="si">${</span><span class="nx">todo</span><span class="p">.</span><span class="nx">id</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">method</span><span class="o">:</span> <span class="s2">&#34;DELETE&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">todoArr</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">todo</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">setTodoArr</span><span class="p">([</span>
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">todoArr</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">index</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">todoArr</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="nx">index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">todoArr</span><span class="p">.</span><span class="nx">length</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">]);</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;row&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">h2</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-12 list-title is-center&#34;</span><span class="o">&gt;</span><span class="nx">My</span> <span class="nx">Todos</span><span class="o">&lt;</span><span class="err">/h2&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">form</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-12&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;row&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="o">&lt;</span><span class="nx">span</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-1 list-desc&#34;</span><span class="o">&gt;</span><span class="nx">Add</span><span class="o">&lt;</span><span class="err">/span&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="o">&lt;</span><span class="nx">input</span>
</span></span><span class="line"><span class="cl">            <span class="nx">type</span><span class="o">=</span><span class="s2">&#34;text&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="nx">onBlur</span><span class="o">=</span><span class="p">{</span><span class="nx">handleNewTodoChange</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-5&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="nx">onChange</span><span class="o">=</span><span class="p">{</span><span class="nx">handleNewTodoChange</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="nx">value</span><span class="o">=</span><span class="p">{</span><span class="nx">todoIn</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">          <span class="o">/&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="o">&lt;</span><span class="nx">button</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;button col-2&#34;</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{</span><span class="nx">handleSubmit</span><span class="p">}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nx">Save</span>
</span></span><span class="line"><span class="cl">          <span class="o">&lt;</span><span class="err">/button&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="err">/form&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-12&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="nx">todoArr</span><span class="p">.</span><span class="nx">map</span><span class="p">((</span><span class="nx">todo</span><span class="p">,</span> <span class="nx">index</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">          <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;row&#34;</span> <span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">index</span><span class="p">}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-1 list-desc&#34;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&#34;id&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-5 list-desc&#34;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&#34;description&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">description</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-4&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="o">&lt;</span><span class="nx">select</span>
</span></span><span class="line"><span class="cl">                <span class="nx">name</span><span class="o">=</span><span class="s2">&#34;status&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="nx">id</span><span class="o">=</span><span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="nx">value</span><span class="o">=</span><span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">status</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="nx">onChange</span><span class="o">=</span><span class="p">{</span><span class="nx">handleStatusChange</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="nx">onBlur</span><span class="o">=</span><span class="p">{</span><span class="nx">handleSubmit</span><span class="p">}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="o">&lt;</span><span class="nx">option</span> <span class="nx">value</span><span class="o">=</span><span class="s2">&#34;Open&#34;</span><span class="o">&gt;</span><span class="nx">Open</span><span class="o">&lt;</span><span class="err">/option&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="o">&lt;</span><span class="nx">option</span> <span class="nx">value</span><span class="o">=</span><span class="s2">&#34;In Progress&#34;</span><span class="o">&gt;</span><span class="nx">In</span> <span class="nx">Progress</span><span class="o">&lt;</span><span class="err">/option&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="o">&lt;</span><span class="nx">option</span> <span class="nx">value</span><span class="o">=</span><span class="s2">&#34;Cancelled&#34;</span><span class="o">&gt;</span><span class="nx">Cancelled</span><span class="o">&lt;</span><span class="err">/option&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="o">&lt;</span><span class="err">/select&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;col-2 icon&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="o">&lt;</span><span class="nx">button</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;button icon-only&#34;</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{</span><span class="nx">deleteTodo</span><span class="p">(</span><span class="nx">todo</span><span class="p">)}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="o">&lt;</span><span class="nx">img</span>
</span></span><span class="line"><span class="cl">                  <span class="nx">src</span><span class="o">=</span><span class="s2">&#34;https://icongr.am/feather/delete.svg?size=16&amp;color=93939a&#34;</span>
</span></span><span class="line"><span class="cl">                  <span class="nx">alt</span><span class="o">=</span><span class="s2">&#34;delete&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="o">/&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="o">&lt;</span><span class="err">/button&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="o">&lt;</span><span class="nx">Link</span> <span class="nx">href</span><span class="o">=</span><span class="p">{</span><span class="sb">`/todos/</span><span class="si">${</span><span class="nx">todo</span><span class="p">.</span><span class="nx">id</span><span class="si">}</span><span class="sb">`</span><span class="p">}</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="o">&lt;</span><span class="nx">button</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;button icon-only&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">                  <span class="o">&lt;</span><span class="nx">img</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">src</span><span class="o">=</span><span class="s2">&#34;https://icongr.am/feather/edit-2.svg?size=16&amp;color=93939a&#34;</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">alt</span><span class="o">=</span><span class="s2">&#34;edit&#34;</span>
</span></span><span class="line"><span class="cl">                  <span class="o">/&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="o">&lt;</span><span class="err">/button&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="o">&lt;</span><span class="err">/Link&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">))}</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">async</span> <span class="kd">function</span> <span class="nx">getServerSideProps</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">todos</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">prisma</span><span class="p">.</span><span class="nx">todo</span><span class="p">.</span><span class="nx">findMany</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">    <span class="nx">orderBy</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">id</span><span class="o">:</span> <span class="s2">&#34;desc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;todos: &#34;</span><span class="p">,</span> <span class="nx">todos</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">props</span><span class="o">:</span> <span class="p">{</span> <span class="nx">todos</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">Todo</span><span class="p">;</span>
</span></span></code></pre></div><p>We have added below features -</p>
<ul>
<li>Add an input box and a button to add a new <code>todo</code> record. Add functions to handle changes to input and to respond to the click event</li>
<li>Add functions to handle changes to call backend APIs for inserts and deletes, and make corresponding changes on the UI</li>
<li>Create a button to delete a <code>todo</code> and call API DELETE method</li>
<li>Create a button to navigate to a detail page upon clicking on any todo (the detail page is implemented in the next section)</li>
</ul>
<h4 id="todo-detail">Todo Detail</h4>
<p>With a couple of functions you have created an app to query ( &amp; display), create and delete todos!</p>
<p>Create a new page <code>pages/todos/[id].js</code> and input below code -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">useRouter</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;next/router&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">PrismaClient</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;@prisma/client&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">prisma</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrismaClient</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nx">Todo</span><span class="p">({</span> <span class="nx">todo</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">useRouter</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="p">{</span> <span class="nx">id</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">router</span><span class="p">.</span><span class="nx">query</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&#34;text-center&#34;</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">h3</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="o">&lt;</span><span class="nx">strong</span><span class="o">&gt;</span><span class="p">{</span><span class="o">!!</span><span class="nx">todo</span> <span class="o">&amp;&amp;</span> <span class="nx">todo</span><span class="p">.</span><span class="nx">description</span><span class="p">}</span><span class="o">&lt;</span><span class="err">/strong&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="err">/h3&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span><span class="p">{</span><span class="o">!</span><span class="nx">todo</span> <span class="o">&amp;&amp;</span> <span class="s2">&#34;This todo has migrated to the next universe.&#34;</span><span class="p">}</span><span class="o">&lt;</span><span class="err">/p&gt;</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;&lt;</span><span class="err">/p&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">async</span> <span class="kd">function</span> <span class="nx">getServerSideProps</span><span class="p">({</span> <span class="nx">params</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">todo</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">prisma</span><span class="p">.</span><span class="nx">todo</span><span class="p">.</span><span class="nx">findFirst</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">    <span class="nx">where</span><span class="o">:</span> <span class="p">{</span> <span class="nx">id</span><span class="o">:</span> <span class="nb">Number</span><span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">});</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;todo: &#34;</span><span class="p">,</span> <span class="nx">todo</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">props</span><span class="o">:</span> <span class="p">{</span> <span class="nx">todo</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>This page just demonstrates how we could display a single <code>todo</code> on the frontend. We have not added any functionality to it.</p>
<h2 id="what-next">What Next?</h2>
<p>Find the app code at this <a href="https://github.com/prashanth1k/do-awesome-nextjs-sample-app">Github repo</a>.</p>
<p>You could extend the current app by -</p>
<ol>
<li>Introducing update function - status changes should call <code>PATCH</code> method and change UI elements</li>
<li>Enable user to capture thoughts, ideas and other BS against each <code>todo</code>. Doing this would require you to provide functionality to add <code>comments</code> against any specific <code>todo</code> (utilising the <code>Detail page</code>)</li>
</ol>
<h2 id="learning-resources">Learning Resources</h2>
<p>See more of Next and keep rocking.</p>
<ul>
<li><a href="https://nextjs.org/learn/basics/create-nextjs-app">Learn NextJS</a> by Vercel, creator of NextJS</li>
<li><a href="https://www.youtube.com/watch?v=tt3PUvhOVzo">NextJS in 2 hours</a></li>
<li><a href="https://www.youtube.com/watch?v=1GpbdX8aJCU">Create a Snippet Manager in Next</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Simplest Svelte App with API</title>
      <link>https://techformist.com/simplest-svelte-app-api/</link>
      <pubDate>Wed, 25 Nov 2020 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/simplest-svelte-app-api/</guid>
      <description>&lt;p&gt;Svelte makes working with apps really simple. It brings the clarity of Vue but adds even more simplicity in the way components are created and used.&lt;/p&gt;
&lt;p&gt;For one of the demos I just wanted to showcase what the simplicity translates into for a simple website that shows &amp;ldquo;quote of the day&amp;rdquo; but also needs to provide a &amp;ldquo;SPA experience&amp;rdquo; - completely off the script.&lt;/p&gt;
&lt;p&gt;All I did was to start the app -&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Svelte makes working with apps really simple. It brings the clarity of Vue but adds even more simplicity in the way components are created and used.</p>
<p>For one of the demos I just wanted to showcase what the simplicity translates into for a simple website that shows &ldquo;quote of the day&rdquo; but also needs to provide a &ldquo;SPA experience&rdquo; - completely off the script.</p>
<p>All I did was to start the app -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npx degit sveltejs/template qotd
</span></span><span class="line"><span class="cl"><span class="k">cd</span> quotd
</span></span><span class="line"><span class="cl">npm i
</span></span><span class="line"><span class="cl">code .
</span></span></code></pre></div><p>That will take care of creating the project, installing &lt;100 packages, and opening the project in VSCode.</p>
<p>Next, I just copy and paste the below lines in <code>src/App.svelte</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="kd">let</span> <span class="nx">quotd</span> <span class="o">=</span> <span class="s2">&#34;Patience is the key to good life..&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="kd">let</span> <span class="nx">author</span> <span class="o">=</span> <span class="s2">&#34;Unknown&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">getRandomQuote</span> <span class="o">=</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fetch</span><span class="p">(</span><span class="s2">&#34;https://favqs.com/api/qotd&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">res</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">      <span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">data</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">([</span><span class="nx">quotd</span><span class="p">,</span> <span class="nx">author</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">data</span><span class="p">.</span><span class="nx">quote</span><span class="p">.</span><span class="nx">body</span><span class="p">,</span> <span class="nx">data</span><span class="p">.</span><span class="nx">quote</span><span class="p">.</span><span class="nx">author</span><span class="p">]));</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">button</span> <span class="na">on:click</span><span class="o">=</span><span class="s">&#34;{getRandomQuote}&#34;</span><span class="p">&gt;</span>Get me a quote!<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>{quotd}<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>- {author} -<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>And, lo and behold -</p>
<p><img loading="lazy" src="/2020/simplest-svelte-api-app.gif" type="" alt="simplest-svelte-api-app"  /></p>
<p>This is the simplest API app that I could think of &ldquo;on the fly&rdquo;. It was good enough to demonstrate how simple, light-weight and quick Svelte can be.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Build a Simple Timesheet App using Vue &amp; Vuetify</title>
      <link>https://techformist.com/build-simple-timesheet-app-vue-vuetify/</link>
      <pubDate>Wed, 28 Oct 2020 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/build-simple-timesheet-app-vue-vuetify/</guid>
      <description>&lt;p&gt;In this post we will see how to create a simple timesheet app using Vue and Vuetify. This is not quite a comprehensive tutorial on Vue or Vuetify, rather a demo of front-end features, see how easy it is to build an usable app, and in general, how modern app development makes the whole process enjoyable.&lt;/p&gt;
&lt;h2 id=&#34;what-are-we-building&#34;&gt;What are we building?&lt;/h2&gt;
&lt;p&gt;A simple timesheet app that will -&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;enable to enter time on a day&lt;/li&gt;
&lt;li&gt;enable export of time data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will store everything in browser storage and there will be no standard persistence layer. This app may or may not plugin to backend (Firebase? ExpressJS / Fastify? Hasura? Other?) in the future - comment and let me know if you&amp;rsquo;re interested in seeing that!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In this post we will see how to create a simple timesheet app using Vue and Vuetify. This is not quite a comprehensive tutorial on Vue or Vuetify, rather a demo of front-end features, see how easy it is to build an usable app, and in general, how modern app development makes the whole process enjoyable.</p>
<h2 id="what-are-we-building">What are we building?</h2>
<p>A simple timesheet app that will -</p>
<ul>
<li>enable to enter time on a day</li>
<li>enable export of time data</li>
</ul>
<p>We will store everything in browser storage and there will be no standard persistence layer. This app may or may not plugin to backend (Firebase? ExpressJS / Fastify? Hasura? Other?) in the future - comment and let me know if you&rsquo;re interested in seeing that!</p>
<p>Technically, we will focus on -</p>
<ol>
<li>Use Vuex and router (latter is not quite needed, you will see more of this)</li>
<li>Form validations</li>
<li>Make application a joy to use with keyboard shortcuts</li>
</ol>
<p>This is how it looks..</p>
<p><img loading="lazy" src="/2020/simple-timesheet-app-daily-demo.gif" type="" alt="simple-timesheet-app-daily-demo"  /></p>
<p>Go to <a href="https://simple-timesheet.techformist.com">https://simple-timesheet.techformist.com</a> to see how the application works.</p>
<h2 id="get-started-with-vue">Get started with Vue</h2>
<p>If you don&rsquo;t have Vue CLI, this is a good time to go ahead and install it. Vue CLI is the starting point for all great Vue projects.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm install -g @vue/cli
</span></span></code></pre></div><p>Create the project -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">vue create simple-timesheet
</span></span></code></pre></div><p>Select the Vue version 2 for the sake of this project and instruct wizard that you will <strong>Manually select features</strong>. Also, select the below features/options -</p>
<ul>
<li>Options: Babel, PWA Support (optional), Router, Vuex, Linter / Formatter</li>
<li><code>Use history mode</code> to &lsquo;Y&rsquo; (default)</li>
<li>A sensible option for ESLint - I recommend <code>ESLint + Prettier</code></li>
<li>Store configuration in dedicated configuration files</li>
</ul>
<p>Sit back while Vue CLI downloads packages and creates the project.</p>
<p>Once done, add Vuetify to the project.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl"><span class="k">cd</span> simple-timesheet
</span></span><span class="line"><span class="cl">vue add vuetify
</span></span></code></pre></div><p>Choose the default Vuetify configuration.</p>
<p>Add packages to our app - we will see their role in subsequent sections.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm i --save vuex-persist vue-shortkey
</span></span></code></pre></div><p>Your project is ready to roll. Open the project folder in VS Code, the greatest editor of our times to get started.</p>
<h2 id="wire-everything-up">Wire Everything Up</h2>
<p>Vue comes packaged with all the things you need - so, there&rsquo;s no complex wiring involved. Let us focus on getting everything to a baseline version to start creating magic.</p>
<p>Change the default <code>App.vue</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-app</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-app-bar</span> <span class="na">app</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary darken-2&#34;</span> <span class="na">dark</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">h3</span><span class="p">&gt;</span>Simple Timesheet<span class="p">&lt;/</span><span class="nt">h3</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-spacer</span><span class="p">&gt;&lt;/</span><span class="nt">v-spacer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-btn</span> <span class="na">text</span> <span class="na">to</span><span class="o">=</span><span class="s">&#34;/daily&#34;</span><span class="p">&gt;</span>Daily<span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-btn</span> <span class="na">text</span> <span class="na">to</span><span class="o">=</span><span class="s">&#34;/about&#34;</span><span class="p">&gt;</span>About<span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-app-bar</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-card</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;grey lighten-5&#34;</span> <span class="na">height</span><span class="o">=</span><span class="s">&#34;100%&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-container</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">router-view</span><span class="p">&gt;&lt;/</span><span class="nt">router-view</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">v-container</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-card</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">v-app</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;App&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">components</span><span class="o">:</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">data</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">({</span>
</span></span><span class="line"><span class="cl">      <span class="c1">//
</span></span></span><span class="line"><span class="cl">    <span class="p">}),</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>All we have done here is to change the toolbar, denote where our router will render views (<code>router-view</code> - no surprise there), and wrap the entire thing in a <code>v-container</code> to provide some nice spacing on all sides.</p>
<p>Follow up with a few more changes at the project level -</p>
<ol>
<li>Delete <code>component/HelloWorld.vue</code> component - we will create our own components. Remove <code>HelloWorld</code> references from <code>App.vue</code> and <code>Home.vue</code> view.</li>
<li>Delete <code>views/Home.vue</code> and remove references to <code>Home</code> from <code>router/index.js</code>.</li>
<li>Change <code>About.vue</code> page - include whatever content you want.</li>
<li>Create a new view called <code>views/Daily.vue</code> - let them be blank for now</li>
<li>Change <code>router/index.js</code> to add references to the new view. Let us redirect &ldquo;/&rdquo; to &ldquo;/daily&rdquo; and &ldquo;/daily&rdquo; will point to the &ldquo;Daily&rdquo; view.
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// ... other code
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">path</span><span class="o">:</span> <span class="s2">&#34;/daily&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Daily&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">component</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="kr">import</span><span class="p">(</span><span class="s2">&#34;../views/Daily.vue&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">path</span><span class="o">:</span> <span class="s2">&#34;/weekly&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Weekly&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">component</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="kr">import</span><span class="p">(</span><span class="s2">&#34;../views/Weekly.vue&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">path</span><span class="o">:</span> <span class="s2">&#34;/about&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;About&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">component</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="kr">import</span><span class="p">(</span><span class="cm">/* webpackChunkName: &#34;about&#34; */</span> <span class="s2">&#34;../views/About.vue&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ... other code
</span></span></span></code></pre></div></li>
</ol>
<p>Next, configure any additional packages.</p>
<h3 id="package-1-vuex-persist">Package 1: vuex-persist</h3>
<p><code>vuex-persist</code> enables storing of vuex values to browser local storage. This is quite handy since we don&rsquo;t want to lose values entered by the user whenever the page is refreshed, or when the website is closed.</p>
<p>Make below changes in <code>store/index.js</code> -</p>
<ol>
<li>
<p>Pull <code>vuex-persist</code> module</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">VuexPersistence</span> <span class="nx">from</span> <span class="s2">&#34;vuex-persist&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">vuexLocal</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">VuexPersistence</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">storage</span><span class="o">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">localStorage</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div></li>
<li>
<p>Include as a plugin</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="k">new</span> <span class="nx">Vuex</span><span class="p">.</span><span class="nx">Store</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">state</span><span class="o">:</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">mutations</span><span class="o">:</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">actions</span><span class="o">:</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">modules</span><span class="o">:</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">plugins</span><span class="o">:</span> <span class="p">[</span><span class="nx">vuexLocal</span><span class="p">.</span><span class="nx">plugin</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div></li>
</ol>
<h3 id="package-2-vue-shortkey">Package 2: vue-shortkey</h3>
<p>Change <code>main.js</code>. Just after the line <code>Vue.config.productionTip = false;</code> add another line..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">Vue</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">require</span><span class="p">(</span><span class="s2">&#34;vue-shortkey&#34;</span><span class="p">));</span>
</span></span></code></pre></div><p>This will reference the package we added earlier <code>vue-shortkey</code>, which will enable us to tie keyboard shortcuts to specific actions (e.g. create new record can be tied to <code>Ctrl + N</code>).</p>
<h3 id="additional-configuration">Additional Configuration</h3>
<p>Add a single line to <code>public/index.html</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/microtip/microtip.css&#34;</span> <span class="p">/&gt;</span>
</span></span></code></pre></div><p>This will enable us to use a small, light-weight package called <code>microtip</code> to show tooltips on any UI element. See <a href="/simple-tooltip-vue">creating simple tooltips in Vue</a> for more details.</p>
<h3 id="start-your-project">Start your project</h3>
<p>It&rsquo;s time to start up stuff and see if everything&rsquo;s working.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm run serve
</span></span></code></pre></div><p>You should see your Vue application start up, and automatically open the browser with your application at <code>http://localhost:8080</code>.</p>
<p>Note that -</p>
<ul>
<li>We have not added any functionality yet - will get to that in the next section</li>
<li>UI elements like icons, iamges and fonts were not changed</li>
<li>We did not quite need a router. We could have as well used a tab component in Vuetify and be no wiser. While that keeps things simpler, router is invaluable if you start adding other views and need navigation elements for those views</li>
<li>It&rsquo;s possible to configure vuex-persist to your heart&rsquo;s content, but we are sticking to keeping things simple</li>
</ul>
<h2 id="create-supporting-components">Create Supporting Components</h2>
<p>Let&rsquo;s go ahead and create a couple of reusable components that will be used by other components.</p>
<h3 id="date-pick-component">Date Pick Component</h3>
<p>Vuetify makes creating a field with a date pick quite easy. We can create a text box and enable a date picker using <code>v-date-picker</code>.</p>
<p><img loading="lazy" src="/misc/date-picker-input-box-vuetify.gif" type="" alt="date-picker-input-box-vuetify"  /></p>
<p>But, we don&rsquo;t want to use boilerplate code each time we need to create a date field. Let us create a <code>DatePick</code> component that can be used by other components or views for any date fields.</p>
<p>Create a new file <code>components/DatePick.vue</code>. Add following code -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="c">&lt;!-- Todo: This needs cleaning up - either incl. date format or remove them --&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-menu</span>
</span></span><span class="line"><span class="cl">    <span class="na">ref</span><span class="o">=</span><span class="s">&#34;menu&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">v-model</span><span class="o">=</span><span class="s">&#34;menu&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">:close-on-content-click</span><span class="o">=</span><span class="s">&#34;false&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">transition</span><span class="o">=</span><span class="s">&#34;scale-transition&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">offset-y</span>
</span></span><span class="line"><span class="cl">    <span class="na">:nudge-right</span><span class="o">=</span><span class="s">&#34;40&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">scrollable</span>
</span></span><span class="line"><span class="cl">    <span class="na">max-width</span><span class="o">=</span><span class="s">&#34;290px&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">min-width</span><span class="o">=</span><span class="s">&#34;290px&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">template</span> <span class="na">v-slot:activator</span><span class="o">=</span><span class="s">&#34;{ on }&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-text-field</span>
</span></span><span class="line"><span class="cl">        <span class="na">:value</span><span class="o">=</span><span class="s">&#34;dateDisplay&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">outlined</span>
</span></span><span class="line"><span class="cl">        <span class="na">:label</span><span class="o">=</span><span class="s">&#34;label&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">append-icon</span><span class="o">=</span><span class="s">&#34;mdi-calendar&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">readonly</span>
</span></span><span class="line"><span class="cl">        <span class="na">:dense</span><span class="o">=</span><span class="s">&#34;dense&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">:hide-details</span><span class="o">=</span><span class="s">&#34;hideDetails&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">:disabled</span><span class="o">=</span><span class="s">&#34;disabled&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="err">@</span><span class="na">click:append</span><span class="o">=</span><span class="s">&#34;menu = true&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">v-on</span><span class="o">=</span><span class="s">&#34;on&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;&lt;/</span><span class="nt">v-text-field</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-date-picker</span>
</span></span><span class="line"><span class="cl">      <span class="na">v-model</span><span class="o">=</span><span class="s">&#34;dateValue&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">no-title</span>
</span></span><span class="line"><span class="cl">      <span class="na">scrollable</span>
</span></span><span class="line"><span class="cl">      <span class="na">:min</span><span class="o">=</span><span class="s">&#34;min&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">:max</span><span class="o">=</span><span class="s">&#34;max&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="err">@</span><span class="na">input</span><span class="o">=</span><span class="s">&#34;menu = false&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&gt;&lt;/</span><span class="nt">v-date-picker</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">v-menu</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">props</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">label</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="k">default</span><span class="o">:</span> <span class="s2">&#34;&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">appendIcon</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="k">default</span><span class="o">:</span> <span class="s2">&#34;mdi-calendar&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">field</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="k">default</span><span class="o">:</span> <span class="s2">&#34;&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">dense</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">Boolean</span><span class="p">,</span> <span class="k">default</span><span class="o">:</span> <span class="kc">false</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">hideDetails</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">Boolean</span><span class="p">,</span> <span class="k">default</span><span class="o">:</span> <span class="kc">false</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">disabled</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">Boolean</span><span class="p">,</span> <span class="k">default</span><span class="o">:</span> <span class="kc">false</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">min</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="k">default</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="kr">const</span> <span class="nx">dt</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">          <span class="nx">dt</span><span class="p">.</span><span class="nx">setDate</span><span class="p">(</span><span class="nx">dt</span><span class="p">.</span><span class="nx">getDate</span><span class="p">()</span> <span class="o">-</span> <span class="mi">30</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">          <span class="k">return</span> <span class="nx">dt</span><span class="p">.</span><span class="nx">toISOString</span><span class="p">().</span><span class="nx">substring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">max</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="k">default</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="kr">const</span> <span class="nx">dt</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">          <span class="nx">dt</span><span class="p">.</span><span class="nx">setDate</span><span class="p">(</span><span class="nx">dt</span><span class="p">.</span><span class="nx">getDate</span><span class="p">()</span> <span class="o">+</span> <span class="mi">365</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">          <span class="k">return</span> <span class="nx">dt</span><span class="p">.</span><span class="nx">toISOString</span><span class="p">().</span><span class="nx">substring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">data</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">menu</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">modal</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">menu2</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">localField</span><span class="o">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">dateValue</span><span class="o">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">computed</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">dateDisplay</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">get</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">dateValue</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nx">set</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="k">this</span><span class="p">.</span><span class="nx">$emit</span><span class="p">(</span><span class="s2">&#34;update:field&#34;</span><span class="p">,</span> <span class="nx">val</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">localFieldFmt</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">get</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">formatDate</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">localField</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nx">set</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="k">this</span><span class="p">.</span><span class="nx">$emit</span><span class="p">(</span><span class="s2">&#34;update:field&#34;</span><span class="p">,</span> <span class="nx">val</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">watch</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">localFieldFmt</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">$emit</span><span class="p">(</span><span class="s2">&#34;update:field&#34;</span><span class="p">,</span> <span class="nx">val</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">dateValue</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">$emit</span><span class="p">(</span><span class="s2">&#34;update:field&#34;</span><span class="p">,</span> <span class="nx">val</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mounted</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">this</span><span class="p">.</span><span class="nx">dateValue</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">field</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="c1">// this.localField = this.parseDate(this.field);
</span></span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">methods</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">test</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;wow&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">formatDate</span><span class="p">(</span><span class="nx">date</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">date</span><span class="p">)</span> <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="p">[</span><span class="nx">year</span><span class="p">,</span> <span class="nx">month</span><span class="p">,</span> <span class="nx">day</span><span class="p">]</span> <span class="o">=</span> <span class="nx">date</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s2">&#34;-&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="c1">//   return `${day}/${month}/${year}`;
</span></span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="sb">`</span><span class="si">${</span><span class="nx">year</span><span class="si">}</span><span class="sb">-</span><span class="si">${</span><span class="nx">month</span><span class="si">}</span><span class="sb">-</span><span class="si">${</span><span class="nx">day</span><span class="si">}</span><span class="sb">`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nx">parseDate</span><span class="p">(</span><span class="nx">date</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">date</span><span class="p">)</span> <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="p">[</span><span class="nx">day</span><span class="p">,</span> <span class="nx">month</span><span class="p">,</span> <span class="nx">year</span><span class="p">]</span> <span class="o">=</span> <span class="nx">date</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s2">&#34;-&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="sb">`</span><span class="si">${</span><span class="nx">year</span><span class="si">}</span><span class="sb">-</span><span class="si">${</span><span class="nx">month</span><span class="p">.</span><span class="nx">padStart</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s2">&#34;0&#34;</span><span class="p">)</span><span class="si">}</span><span class="sb">-</span><span class="si">${</span><span class="nx">day</span><span class="p">.</span><span class="nx">padStart</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s2">&#34;0&#34;</span><span class="p">)</span><span class="si">}</span><span class="sb">`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nx">setLocalFieldFmt</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">localFieldFmt</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">localField</span> <span class="o">=</span> <span class="nx">val</span> <span class="o">?</span> <span class="k">this</span><span class="p">.</span><span class="nx">parseDate</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="o">:</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Don&rsquo;t quite worry if you don&rsquo;t get what&rsquo;s going on here. We are doing a couple of things -</p>
<ol>
<li>Create a text field input box that can take in user inputs</li>
<li>Enable date control using <code>v-date-picker</code></li>
<li>Raise an event whenever the date is set so that the calling component can set a value based on user input</li>
<li>We can also parse date values to handle international dates, but we will not quite use that here</li>
</ol>
<p>We can now use this component in any other view or component like so -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">DatePick</span>
</span></span><span class="line"><span class="cl">  <span class="na">name</span><span class="o">=</span><span class="s">&#34;todayDate&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">:field</span><span class="o">=</span><span class="s">&#34;dayDate&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="err">@</span><span class="na">update:field</span><span class="o">=</span><span class="s">&#34;setDayDate($event)&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">:dense</span><span class="o">=</span><span class="s">&#34;true&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">&gt;&lt;/</span><span class="nt">DatePick</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Here -</p>
<ul>
<li><code>dayDate</code> is a field (can be from Vuex or at the component level - we will see how this is used shortly)</li>
<li>On <code>update:field</code> event (which corresponds to the date input by user) we call a method called <code>setDayDate</code></li>
</ul>
<p>See <a href="/vuetify-input-field-date-picker/">reusable date picker field for Vuetify</a> for more details about the date picker field.</p>
<h3 id="confirm-component">Confirm component</h3>
<p>It is a common UI experience to ask for confirmation before allowing specific user actions - especially if they are irreversible. Vuetify has a <code>v-dialog</code> component to show a popup to that purpose, but it would need some boilerplate code to enable it each time to ask a question. Let&rsquo;s create a <code>Confirm</code> component to make it easier.</p>
<p>Create a new file <code>components/Confirm.vue</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-dialog</span>
</span></span><span class="line"><span class="cl">    <span class="na">v-model</span><span class="o">=</span><span class="s">&#34;dialog&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">:max-width</span><span class="o">=</span><span class="s">&#34;options.width&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">:style</span><span class="o">=</span><span class="s">&#34;{ zIndex: options.zIndex }&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="err">@</span><span class="na">keydown</span><span class="err">.</span><span class="na">esc</span><span class="o">=</span><span class="s">&#34;cancel&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-card</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-toolbar</span> <span class="na">dark</span> <span class="na">:color</span><span class="o">=</span><span class="s">&#34;options.color&#34;</span> <span class="na">dense</span> <span class="na">flat</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-toolbar-title</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;text-body-2 font-weight-bold grey--text&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          {{ title }}
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">v-toolbar-title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-toolbar</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-card-text</span>
</span></span><span class="line"><span class="cl">        <span class="na">v-show</span><span class="o">=</span><span class="s">&#34;!!message&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">class</span><span class="o">=</span><span class="s">&#34;pa-4 black--text&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">v-html</span><span class="o">=</span><span class="s">&#34;message&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;&lt;/</span><span class="nt">v-card-text</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-card-actions</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pt-3&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-spacer</span><span class="p">&gt;&lt;/</span><span class="nt">v-spacer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">          <span class="na">v-if</span><span class="o">=</span><span class="s">&#34;!options.noconfirm&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">color</span><span class="o">=</span><span class="s">&#34;grey&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">text</span>
</span></span><span class="line"><span class="cl">          <span class="na">class</span><span class="o">=</span><span class="s">&#34;body-2 font-weight-bold&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="err">@</span><span class="na">click</span><span class="err">.</span><span class="na">native</span><span class="o">=</span><span class="s">&#34;cancel&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&gt;</span>Cancel<span class="p">&lt;/</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">        <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">          <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">class</span><span class="o">=</span><span class="s">&#34;body-2 font-weight-bold&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">outlined</span>
</span></span><span class="line"><span class="cl">          <span class="err">@</span><span class="na">click</span><span class="err">.</span><span class="na">native</span><span class="o">=</span><span class="s">&#34;agree&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&gt;</span>OK<span class="p">&lt;/</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">        <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-card-actions</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-card</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">v-dialog</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Confirm&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">data</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">dialog</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">resolve</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">reject</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">message</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">title</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">options</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">color</span><span class="o">:</span> <span class="s2">&#34;grey lighten-3&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">width</span><span class="o">:</span> <span class="mi">400</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">zIndex</span><span class="o">:</span> <span class="mi">200</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nx">noconfirm</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">methods</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">open</span><span class="p">(</span><span class="nx">title</span><span class="p">,</span> <span class="nx">message</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">dialog</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">title</span> <span class="o">=</span> <span class="nx">title</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">message</span> <span class="o">=</span> <span class="nx">message</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">options</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">assign</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">options</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">((</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="k">this</span><span class="p">.</span><span class="nx">resolve</span> <span class="o">=</span> <span class="nx">resolve</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="k">this</span><span class="p">.</span><span class="nx">reject</span> <span class="o">=</span> <span class="nx">reject</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">agree</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">dialog</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">cancel</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">dialog</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>In the above code -</p>
<ul>
<li>we show a message popup using <code>v-dialog</code>. The message is passed to the component using props</li>
<li>we pass along the user action (<code>yes</code> or <code>no</code> for example) so that the caller can take action based on the answer</li>
</ul>
<p>We use the <code>Confirm</code> component in two parts.</p>
<ol>
<li>
<p>First, create a reference to <code>Confirm</code> in <code>&lt;template&gt;</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="c">&lt;!-- other code --&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">confirm</span> <span class="na">ref</span><span class="o">=</span><span class="s">&#34;confirm&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="c">&lt;!-- other code --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Import the component.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// other code
</span></span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">components</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">Confirm</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="kr">import</span><span class="p">(</span><span class="s2">&#34;../components/Confirm&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// other code
</span></span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div></li>
<li>
<p>Call the confirm dialog whenever needed</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// other code
</span></span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">methods</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="kr">async</span> <span class="nx">deleteRecordWithConfirm</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">          <span class="kr">await</span> <span class="k">this</span><span class="p">.</span><span class="nx">$refs</span><span class="p">.</span><span class="nx">confirm</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;Confirm Delete&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;Are you sure you want to delete this record?&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">          <span class="k">this</span><span class="p">.</span><span class="nx">deleteRecord</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// other code
</span></span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div></li>
</ol>
<p>Again, don&rsquo;t worry too much into how confirm works - you will get time to see much more later.</p>
<p>Now that everything&rsquo;s wired up and we created baseline infrastructure, it is time to write our core functionality.</p>
<h2 id="create-daily-component">Create Daily Component</h2>
<p>We already created a view called <code>Daily.vue</code>. We will add a simple form and some code to enable users to create/edit/view timesheet entries.</p>
<p>Add the below code -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;center&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-card</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;white&#34;</span> <span class="na">width</span><span class="o">=</span><span class="s">&#34;70%&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-toolbar</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;grey lighten-3&#34;</span> <span class="na">flat</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;font-weight-black h6&#34;</span><span class="p">&gt;</span>Daily Timesheet<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-spacer</span><span class="p">&gt;&lt;/</span><span class="nt">v-spacer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">          <span class="na">small</span>
</span></span><span class="line"><span class="cl">          <span class="na">class</span><span class="o">=</span><span class="s">&#34;mr-2&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;resetAfterConfirm&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">aria-label</span><span class="o">=</span><span class="s">&#34;Reset timesheet. Delete all entries below.&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">data-microtip-position</span><span class="o">=</span><span class="s">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">role</span><span class="o">=</span><span class="s">&#34;tooltip&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">small</span> <span class="na">dark</span><span class="p">&gt;</span>mdi-delete-sweep<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span> Reset
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-menu</span> <span class="na">offset-y</span> <span class="na">close-on-content-click</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">template</span> <span class="na">v-slot:activator</span><span class="o">=</span><span class="s">&#34;{ on, attrs }&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">              <span class="na">small</span>
</span></span><span class="line"><span class="cl">              <span class="na">class</span><span class="o">=</span><span class="s">&#34;mr-2&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">aria-label</span><span class="o">=</span><span class="s">&#34;Download timesheet.&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">data-microtip-position</span><span class="o">=</span><span class="s">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">role</span><span class="o">=</span><span class="s">&#34;tooltip&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">v-bind</span><span class="o">=</span><span class="s">&#34;attrs&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">v-on</span><span class="o">=</span><span class="s">&#34;on&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">small</span> <span class="na">dark</span><span class="p">&gt;</span>mdi-download<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              Export
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">v-list</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">v-list-item</span>
</span></span><span class="line"><span class="cl">              <span class="na">v-for</span><span class="o">=</span><span class="s">&#34;(item, index) in downloadItems&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="na">:key</span><span class="o">=</span><span class="s">&#34;index&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;invokeAction(item.action)&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;</span><span class="nt">v-list-item-title</span><span class="p">&gt;</span>{{ item.title }}<span class="p">&lt;/</span><span class="nt">v-list-item-title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">v-list-item</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">v-list</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">v-menu</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">          <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">small</span>
</span></span><span class="line"><span class="cl">          <span class="na">class</span><span class="o">=</span><span class="s">&#34;mr-2&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;newDayTime&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">v-shortkey</span><span class="o">=</span><span class="s">&#34;[&#39;alt&#39;, &#39;shift&#39;, &#39;n&#39;]&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="err">@</span><span class="na">shortkey</span><span class="o">=</span><span class="s">&#34;newDayTime()&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">aria-label</span><span class="o">=</span><span class="s">&#34;Create new time. [alt+shift+n]&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">data-microtip-position</span><span class="o">=</span><span class="s">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">role</span><span class="o">=</span><span class="s">&#34;tooltip&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">small</span> <span class="na">dark</span><span class="p">&gt;</span>mdi-plus<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span>Add
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-toolbar</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-container</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;left&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pl-3 pr-3&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">label</span> <span class="na">for</span><span class="o">=</span><span class="s">&#34;todayDate&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;font-weight-bold grey--text&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            Date
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">label</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">DatePick</span>
</span></span><span class="line"><span class="cl">            <span class="na">name</span><span class="o">=</span><span class="s">&#34;todayDate&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">:field</span><span class="o">=</span><span class="s">&#34;dayDate&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="err">@</span><span class="na">update:field</span><span class="o">=</span><span class="s">&#34;setDayDate($event)&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">:dense</span><span class="o">=</span><span class="s">&#34;true&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&gt;&lt;/</span><span class="nt">DatePick</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;text-h6&#34;</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;left&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            Total Hours:
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;font-weight-bold&#34;</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              {{ totalTime }}
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-card</span>
</span></span><span class="line"><span class="cl">          <span class="na">flat</span>
</span></span><span class="line"><span class="cl">          <span class="na">color</span><span class="o">=</span><span class="s">&#34;transparent&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">height</span><span class="o">=</span><span class="s">&#34;400px&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">class</span><span class="o">=</span><span class="s">&#34;pl-3&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="na">style</span><span class="o">=</span><span class="s">&#34;overflow-y:auto; overflow-x:hidden&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">v-form</span> <span class="err">@</span><span class="na">submit</span><span class="err">.</span><span class="na">prevent</span><span class="o">=</span><span class="s">&#34;addEntry&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">v-row</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;center&#34;</span> <span class="na">dense</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;12&#34;</span> <span class="na">sm</span><span class="o">=</span><span class="s">&#34;10&#34;</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;left&#34;</span><span class="p">&gt;</span> <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;</span><span class="nt">v-col</span>
</span></span><span class="line"><span class="cl">                <span class="na">cols</span><span class="o">=</span><span class="s">&#34;12&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="na">v-for</span><span class="o">=</span><span class="s">&#34;(dayTime, index) in dayTimes&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="na">:key</span><span class="o">=</span><span class="s">&#34;index&#34;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;</span><span class="nt">v-row</span> <span class="na">dense</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                  <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;12&#34;</span> <span class="na">sm</span><span class="o">=</span><span class="s">&#34;8&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;</span><span class="nt">v-text-field</span>
</span></span><span class="line"><span class="cl">                      <span class="na">placeholder</span><span class="o">=</span><span class="s">&#34;What work is this for?&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">v-model</span><span class="o">=</span><span class="s">&#34;dayTime[&#39;desc&#39;]&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">dense</span>
</span></span><span class="line"><span class="cl">                      <span class="na">outlined</span>
</span></span><span class="line"><span class="cl">                      <span class="na">autofocus</span>
</span></span><span class="line"><span class="cl">                      <span class="err">@</span><span class="na">focus</span><span class="o">=</span><span class="s">&#34;activeIndex = index&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">hide-details</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&gt;&lt;/</span><span class="nt">v-text-field</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                  <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                  <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;10&#34;</span> <span class="na">sm</span><span class="o">=</span><span class="s">&#34;2&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;</span><span class="nt">v-text-field</span>
</span></span><span class="line"><span class="cl">                      <span class="na">dense</span>
</span></span><span class="line"><span class="cl">                      <span class="na">placeholder</span><span class="o">=</span><span class="s">&#34;Hours&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">v-model</span><span class="o">=</span><span class="s">&#34;dayTime[&#39;time&#39;]&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">outlined</span>
</span></span><span class="line"><span class="cl">                      <span class="na">type</span><span class="o">=</span><span class="s">&#34;number&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">reverse</span>
</span></span><span class="line"><span class="cl">                      <span class="err">@</span><span class="na">focus</span><span class="o">=</span><span class="s">&#34;activeIndex = index&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">hide-details</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&gt;&lt;/</span><span class="nt">v-text-field</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                  <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                  <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;2&#34;</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;left&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">                      <span class="na">fab</span>
</span></span><span class="line"><span class="cl">                      <span class="na">icon</span>
</span></span><span class="line"><span class="cl">                      <span class="na">small</span>
</span></span><span class="line"><span class="cl">                      <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;delDayTimeByIndex(activeIndex)&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">v-shortkey</span><span class="o">=</span><span class="s">&#34;[&#39;alt&#39;, &#39;shift&#39;, &#39;del&#39;]&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="err">@</span><span class="na">shortkey</span><span class="o">=</span><span class="s">&#34;delDayTimeByIndex(activeIndex)&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">aria-label</span><span class="o">=</span><span class="s">&#34;Delete this entry. [alt+shift+del]&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">data-microtip-position</span><span class="o">=</span><span class="s">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">data-microtip-size</span><span class="o">=</span><span class="s">&#34;medium&#34;</span>
</span></span><span class="line"><span class="cl">                      <span class="na">role</span><span class="o">=</span><span class="s">&#34;tooltip&#34;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                      <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;grey&#34;</span><span class="p">&gt;</span>mdi-delete<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                  <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&lt;/</span><span class="nt">v-row</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">v-row</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">v-form</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">v-card</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-container</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-card</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">confirm</span> <span class="na">ref</span><span class="o">=</span><span class="s">&#34;confirm&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="p">{</span> <span class="nx">mapState</span><span class="p">,</span> <span class="nx">mapMutations</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;vuex&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Daily&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">components</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">DatePick</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="kr">import</span><span class="p">(</span><span class="s2">&#34;../components/DatePick&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">      <span class="nx">Confirm</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="kr">import</span><span class="p">(</span><span class="s2">&#34;../components/Confirm&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">data</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">activeIndex</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">downloadItems</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">          <span class="p">{</span> <span class="nx">title</span><span class="o">:</span> <span class="s2">&#34;CSV&#34;</span><span class="p">,</span> <span class="nx">action</span><span class="o">:</span> <span class="s2">&#34;generateDownloadCsv&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">          <span class="p">{</span> <span class="nx">title</span><span class="o">:</span> <span class="s2">&#34;TXT&#34;</span><span class="p">,</span> <span class="nx">action</span><span class="o">:</span> <span class="s2">&#34;generateDownloadTxt&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">],</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">computed</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">mapState</span><span class="p">(</span><span class="s2">&#34;daystr&#34;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&#34;dayTimes&#34;</span><span class="p">,</span> <span class="s2">&#34;dayDate&#34;</span><span class="p">]),</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nx">totalTime</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">dayTimes</span><span class="p">.</span><span class="nx">reduce</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">          <span class="p">(</span><span class="nx">sum</span><span class="p">,</span> <span class="nx">element</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nx">sum</span> <span class="o">+</span> <span class="p">(</span><span class="nb">Number</span><span class="p">(</span><span class="nx">element</span><span class="p">[</span><span class="s2">&#34;time&#34;</span><span class="p">])</span> <span class="o">||</span> <span class="mi">0</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">          <span class="mi">0</span>
</span></span><span class="line"><span class="cl">        <span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mounted</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">dayTimes</span><span class="p">.</span><span class="nx">length</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">resetDay</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">methods</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">mapMutations</span><span class="p">(</span><span class="s2">&#34;daystr&#34;</span><span class="p">,</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;newDayTime&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;setActiveDayTime&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;setDayDate&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;resetDay&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;delDayTimeByIndex&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">]),</span>
</span></span><span class="line"><span class="cl">      <span class="kr">async</span> <span class="nx">resetAfterConfirm</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">          <span class="kr">await</span> <span class="k">this</span><span class="p">.</span><span class="nx">$refs</span><span class="p">.</span><span class="nx">confirm</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;Confirm Reset&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;Are you sure you want to reset timesheet? You will lose all data on this page.&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">          <span class="k">this</span><span class="p">.</span><span class="nx">resetDay</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">invokeAction</span><span class="p">(</span><span class="nx">action</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">[</span><span class="nx">action</span><span class="p">]();</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">generateDownloadCsv</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">generateExportAndDownload</span><span class="p">(</span><span class="s2">&#34;data:text/csv&#34;</span><span class="p">,</span> <span class="s2">&#34;csv&#34;</span><span class="p">,</span> <span class="s2">&#34;,&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">generateDownloadTxt</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">generateExportAndDownload</span><span class="p">(</span><span class="s2">&#34;data:text/txt&#34;</span><span class="p">,</span> <span class="s2">&#34;txt&#34;</span><span class="p">,</span> <span class="s2">&#34; - &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nx">generateExportAndDownload</span><span class="p">(</span><span class="nx">filetype</span><span class="p">,</span> <span class="nx">extn</span><span class="p">,</span> <span class="nx">separator</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">let</span> <span class="nx">strDayTimes</span> <span class="o">=</span> <span class="sb">`</span><span class="si">${</span><span class="nx">filetype</span><span class="si">}</span><span class="sb">;charset=utf-8,Timesheet for Date: </span><span class="si">${</span><span class="k">this</span><span class="p">.</span><span class="nx">dayDate</span><span class="si">}</span><span class="sb"> \n\rTotal Time: </span><span class="si">${</span><span class="k">this</span><span class="p">.</span><span class="nx">totalTime</span><span class="si">}</span><span class="sb"> hours \n\rTime Records\n===============================\n`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">strDayTimes</span> <span class="o">+=</span> <span class="sb">`Description</span><span class="si">${</span><span class="nx">separator</span><span class="si">}</span><span class="sb">Time (Hours)\n===============================\n`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">strDayTimes</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">dayTimes</span>
</span></span><span class="line"><span class="cl">          <span class="p">.</span><span class="nx">map</span><span class="p">((</span><span class="nx">element</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="sb">`</span><span class="si">${</span><span class="nx">element</span><span class="p">[</span><span class="s2">&#34;desc&#34;</span><span class="p">]</span><span class="si">}${</span><span class="nx">separator</span><span class="si">}${</span><span class="nx">element</span><span class="p">[</span><span class="s2">&#34;time&#34;</span><span class="p">]</span><span class="si">}</span><span class="sb">`</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">          <span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s2">&#34;\n&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">          <span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/(^\[)|(\]$)/gm</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">fileData</span> <span class="o">=</span> <span class="nb">encodeURI</span><span class="p">(</span><span class="nx">strDayTimes</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">link</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nx">link</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s2">&#34;href&#34;</span><span class="p">,</span> <span class="nx">fileData</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nx">link</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s2">&#34;download&#34;</span><span class="p">,</span> <span class="sb">`timesheet.</span><span class="si">${</span><span class="nx">extn</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nx">link</span><span class="p">.</span><span class="nx">click</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>There are quite a few things going on here. Let us dissect them in detail.</p>
<h3 id="start-up">Start up</h3>
<p><code>mounted()</code> method in a Vue component helps us to &ldquo;hook&rdquo; into the component start up and run some code each time the component gets displayed.</p>
<p>We are including the following code in <code>mounted</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">dayTimes</span><span class="p">.</span><span class="nx">length</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">resetDay</span><span class="p">();</span>
</span></span></code></pre></div><p>This will call a method <code>resetDay</code> only if <code>dayTimes</code> array does not have any elements. <code>resetDay</code> is outlined in the Vuex store. It will -</p>
<ol>
<li>Reset the date to today&rsquo;s date</li>
<li>Delete all entries in the timesheet</li>
</ol>
<h3 id="ui-elements">UI Elements</h3>
<p>Everything within <code>&lt;template&gt;</code> tags form our UI. Here we use Vuetify grid, ready-made components from Vuetify like button, text input box, and more to create our timesheet.</p>
<h4 id="toolbar">Toolbar</h4>
<p>Toolbar consists of a couple of buttons and a menu item to show export options.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">v-toolbar</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;grey lighten-3&#34;</span> <span class="na">flat</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;font-weight-black h6&#34;</span><span class="p">&gt;</span>Daily Timesheet<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-spacer</span><span class="p">&gt;&lt;/</span><span class="nt">v-spacer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">    <span class="na">small</span>
</span></span><span class="line"><span class="cl">    <span class="na">class</span><span class="o">=</span><span class="s">&#34;mr-2&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;resetAfterConfirm&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">aria-label</span><span class="o">=</span><span class="s">&#34;Reset timesheet. Delete all entries below.&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">data-microtip-position</span><span class="o">=</span><span class="s">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">role</span><span class="o">=</span><span class="s">&#34;tooltip&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">small</span> <span class="na">dark</span><span class="p">&gt;</span>mdi-delete-sweep<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span> Reset
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-menu</span> <span class="na">offset-y</span> <span class="na">close-on-content-click</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">template</span> <span class="na">v-slot:activator</span><span class="o">=</span><span class="s">&#34;{ on, attrs }&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">        <span class="na">small</span>
</span></span><span class="line"><span class="cl">        <span class="na">class</span><span class="o">=</span><span class="s">&#34;mr-2&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">aria-label</span><span class="o">=</span><span class="s">&#34;Download timesheet.&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">data-microtip-position</span><span class="o">=</span><span class="s">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">role</span><span class="o">=</span><span class="s">&#34;tooltip&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">v-bind</span><span class="o">=</span><span class="s">&#34;attrs&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">v-on</span><span class="o">=</span><span class="s">&#34;on&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">small</span> <span class="na">dark</span><span class="p">&gt;</span>mdi-download<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        Export
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-list</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-list-item</span>
</span></span><span class="line"><span class="cl">        <span class="na">v-for</span><span class="o">=</span><span class="s">&#34;(item, index) in downloadItems&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">:key</span><span class="o">=</span><span class="s">&#34;index&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;invokeAction(item.action)&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-list-item-title</span><span class="p">&gt;</span>{{ item.title }}<span class="p">&lt;/</span><span class="nt">v-list-item-title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-list-item</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-list</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">v-menu</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">    <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">small</span>
</span></span><span class="line"><span class="cl">    <span class="na">class</span><span class="o">=</span><span class="s">&#34;mr-2&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;newDayTime&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">v-shortkey</span><span class="o">=</span><span class="s">&#34;[&#39;alt&#39;, &#39;shift&#39;, &#39;n&#39;]&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="err">@</span><span class="na">shortkey</span><span class="o">=</span><span class="s">&#34;newDayTime()&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">aria-label</span><span class="o">=</span><span class="s">&#34;Create new time. [alt+shift+n]&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">data-microtip-position</span><span class="o">=</span><span class="s">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="na">role</span><span class="o">=</span><span class="s">&#34;tooltip&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">small</span> <span class="na">dark</span><span class="p">&gt;</span>mdi-plus<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span>Add
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">v-toolbar</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>You may note that -</p>
<ul>
<li><code>v-menu</code> pulls in the list of menu items using a <code>&lt;v-list&gt;</code> from a variable called <code>downloadItems</code>. This variable is specific to this Vue component and is defined in <code>data</code> section</li>
<li>we used <code>microtip</code> required parameters like <code>aria-label</code>, <code>data-microtip-position</code> and <code>role</code> to create tooltips on button</li>
<li>we called methods defined in the <code>script</code> section using the magical <code>@click</code> event from buttons (<code>v-btn</code>)</li>
<li>buttons use <code>v-shortkey</code> to denote the shortcut key combination to simulate button click and <code>@shotcutkey</code> to denote which method should be called on click</li>
</ul>
<h4 id="header">Header</h4>
<p>Create -</p>
<ul>
<li>a date field that the user can update. Use the <code>DatePick</code> component created earlier</li>
<li>a field that shows the total time entered. Use <code>totalTime</code> computed variable - details on the computed variable in the <code>computed</code> section</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">DatePick</span>
</span></span><span class="line"><span class="cl">  <span class="na">name</span><span class="o">=</span><span class="s">&#34;todayDate&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">:field</span><span class="o">=</span><span class="s">&#34;dayDate&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="err">@</span><span class="na">update:field</span><span class="o">=</span><span class="s">&#34;setDayDate($event)&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">:dense</span><span class="o">=</span><span class="s">&#34;true&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">&gt;&lt;/</span><span class="nt">DatePick</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;text-h6&#34;</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;left&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  Total Hours:
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">span</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;font-weight-bold&#34;</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span><span class="p">&gt;</span> {{ totalTime }} <span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span></code></pre></div><h4 id="timesheet-entries">Timesheet entries</h4>
<p>Show the list of timesheet entries recorded in <code>dayTimes</code> array with the below code block -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;12&#34;</span> <span class="na">v-for</span><span class="o">=</span><span class="s">&#34;(dayTime, index) in dayTimes&#34;</span> <span class="na">:key</span><span class="o">=</span><span class="s">&#34;index&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-row</span> <span class="na">dense</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;12&#34;</span> <span class="na">sm</span><span class="o">=</span><span class="s">&#34;8&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-text-field</span>
</span></span><span class="line"><span class="cl">        <span class="na">placeholder</span><span class="o">=</span><span class="s">&#34;What work is this for?&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">v-model</span><span class="o">=</span><span class="s">&#34;dayTime[&#39;desc&#39;]&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">dense</span>
</span></span><span class="line"><span class="cl">        <span class="na">outlined</span>
</span></span><span class="line"><span class="cl">        <span class="na">autofocus</span>
</span></span><span class="line"><span class="cl">        <span class="err">@</span><span class="na">focus</span><span class="o">=</span><span class="s">&#34;activeIndex = index&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">hide-details</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;&lt;/</span><span class="nt">v-text-field</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;10&#34;</span> <span class="na">sm</span><span class="o">=</span><span class="s">&#34;2&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-text-field</span>
</span></span><span class="line"><span class="cl">        <span class="na">dense</span>
</span></span><span class="line"><span class="cl">        <span class="na">placeholder</span><span class="o">=</span><span class="s">&#34;Hours&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">v-model</span><span class="o">=</span><span class="s">&#34;dayTime[&#39;time&#39;]&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">outlined</span>
</span></span><span class="line"><span class="cl">        <span class="na">type</span><span class="o">=</span><span class="s">&#34;number&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">reverse</span>
</span></span><span class="line"><span class="cl">        <span class="err">@</span><span class="na">focus</span><span class="o">=</span><span class="s">&#34;activeIndex = index&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">hide-details</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;&lt;/</span><span class="nt">v-text-field</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;2&#34;</span> <span class="na">align</span><span class="o">=</span><span class="s">&#34;left&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-btn</span>
</span></span><span class="line"><span class="cl">        <span class="na">fab</span>
</span></span><span class="line"><span class="cl">        <span class="na">icon</span>
</span></span><span class="line"><span class="cl">        <span class="na">small</span>
</span></span><span class="line"><span class="cl">        <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;delDayTimeByIndex(activeIndex)&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">v-shortkey</span><span class="o">=</span><span class="s">&#34;[&#39;alt&#39;, &#39;shift&#39;, &#39;del&#39;]&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="err">@</span><span class="na">shortkey</span><span class="o">=</span><span class="s">&#34;delDayTimeByIndex(activeIndex)&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">aria-label</span><span class="o">=</span><span class="s">&#34;Delete this entry. [alt+shift+del]&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">data-microtip-position</span><span class="o">=</span><span class="s">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">data-microtip-size</span><span class="o">=</span><span class="s">&#34;medium&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="na">role</span><span class="o">=</span><span class="s">&#34;tooltip&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;grey&#34;</span><span class="p">&gt;</span>mdi-delete<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">v-row</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span></code></pre></div><h3 id="computed-variables">Computed variables</h3>
<p>Computed variables allow us to use calculated values, values that dymamically change at different stages of the component based on component state, data variables, external data, user actions and so on.</p>
<p>We created two different types of variables here -</p>
<ol>
<li>Pull in the Vuex state variables from <code>daystr</code> module with <code>...mapState(&quot;daystr&quot;, [&quot;dayTimes&quot;, &quot;dayDate&quot;])</code></li>
<li>Create a <code>totalTime</code> value that will add up all time entries and provide the total time entered on the timesheet. There are multiple ways of doing this including a simple <code>for</code> statement to loop through the <code>dayTimes</code> array, but we have used some shortcut methods to keep the code clean 😜</li>
</ol>
<p>The overall <code>computed</code> code block is below -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">computed</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="p">...</span><span class="nx">mapState</span><span class="p">(</span><span class="s2">&#34;daystr&#34;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&#34;dayTimes&#34;</span><span class="p">,</span> <span class="s2">&#34;dayDate&#34;</span><span class="p">]),</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">totalTime</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">dayTimes</span><span class="p">.</span><span class="nx">reduce</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="p">(</span><span class="nx">sum</span><span class="p">,</span> <span class="nx">element</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nx">sum</span> <span class="o">+</span> <span class="p">(</span><span class="nb">Number</span><span class="p">(</span><span class="nx">element</span><span class="p">[</span><span class="s2">&#34;time&#34;</span><span class="p">])</span> <span class="o">||</span> <span class="mi">0</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">      <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span>
</span></span></code></pre></div><h3 id="methods">Methods</h3>
<p>Most of the methods are mutations defined in the Vuex module <code>dailystr</code>. These are referenced in our component with the following line -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">methods</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">...</span><span class="nx">mapMutations</span><span class="p">(</span><span class="s2">&#34;daystr&#34;</span><span class="p">,</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;newDayTime&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;setActiveDayTime&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;setDayDate&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;resetDay&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;delDayTimeByIndex&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">]),</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>Beyond Vuex, we have a few more methods -</p>
<h4 id="method-1-invokeaction">Method 1: InvokeAction</h4>
<p>This method simply calls another method. It is used in a list so that we can call methods dynamically while we are defining the list.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">invokeAction</span><span class="p">(</span><span class="nx">action</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">this</span><span class="p">[</span><span class="nx">action</span><span class="p">]();</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span>
</span></span></code></pre></div><h4 id="method-2-confirm-and-reset-timesheet">Method 2: Confirm and reset timesheet</h4>
<p>This method gets invoked when user clicks on &ldquo;Reset&rdquo; button. Ask user to confirm reset and call a Vuex mutation that will reset the <code>dayTimes</code> array and reset date to today&rsquo;s date.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">async</span> <span class="nx">resetAfterConfirm</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="kr">await</span> <span class="k">this</span><span class="p">.</span><span class="nx">$refs</span><span class="p">.</span><span class="nx">confirm</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;Confirm Reset&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;Are you sure you want to reset timesheet? You will lose all data on this page.&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">this</span><span class="p">.</span><span class="nx">resetDay</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span>
</span></span></code></pre></div><h4 id="methods-3--4-generatedownload-methods">Methods 3 &amp; 4: generateDownLoad methods</h4>
<p>We invoke two distinct methods when user clicks on export button - one of them facilitates export to CSV file format, while the other option enables a text export.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">generateDownloadCsv</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">this</span><span class="p">.</span><span class="nx">generateExportAndDownload</span><span class="p">(</span><span class="s2">&#34;data:text/csv&#34;</span><span class="p">,</span> <span class="s2">&#34;csv&#34;</span><span class="p">,</span> <span class="s2">&#34;,&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="nx">generateDownloadTxt</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">this</span><span class="p">.</span><span class="nx">generateExportAndDownload</span><span class="p">(</span><span class="s2">&#34;data:text/txt&#34;</span><span class="p">,</span> <span class="s2">&#34;txt&#34;</span><span class="p">,</span> <span class="s2">&#34; - &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span>
</span></span></code></pre></div><p>Both these methods call <code>generateExportAndDownload</code>, which will export the timesheet entries to a file based on input arguments. We could have called <code>generateExportAndDownload</code> method directly from the <code>template</code> HTML with arguments, but we used different methods for any future scalability. (yes, this is sarcasm)</p>
<h4 id="method-5-generateexportanddownload-method">Method 5: generateExportAndDownload method</h4>
<p><code>generateExportAndDownload</code> will -</p>
<ul>
<li>take three arguments for the export file type, the extension to be used for the export file and the separator to be used between the timesheet description and number of hours</li>
<li>fetch the entries from the Vuex store variables (the &ldquo;state&rdquo; values) <code>dayDate</code> and <code>dayTimes</code></li>
<li>create a string for export by joining some informational statements and the <code>dayTimes</code> array</li>
<li>create an <code>a</code> tag with the content as newly created string</li>
<li>simulate a click on the <code>a</code> link to download content to a file</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">generateExportAndDownload</span><span class="p">(</span><span class="nx">filetype</span><span class="p">,</span> <span class="nx">extn</span><span class="p">,</span> <span class="nx">separator</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">strDayTimes</span> <span class="o">=</span> <span class="sb">`</span><span class="si">${</span><span class="nx">filetype</span><span class="si">}</span><span class="sb">;charset=utf-8,Timesheet for Date: </span><span class="si">${</span><span class="k">this</span><span class="p">.</span><span class="nx">dayDate</span><span class="si">}</span><span class="sb"> \n\rTotal Time: </span><span class="si">${</span><span class="k">this</span><span class="p">.</span><span class="nx">totalTime</span><span class="si">}</span><span class="sb"> hours \n\rTime Records\n===============================\n`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">strDayTimes</span> <span class="o">+=</span> <span class="sb">`Description</span><span class="si">${</span><span class="nx">separator</span><span class="si">}</span><span class="sb">Time (Hours)\n===============================\n`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">strDayTimes</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">dayTimes</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">element</span> <span class="p">=&gt;</span> <span class="sb">`</span><span class="si">${</span><span class="nx">element</span><span class="p">[</span><span class="s2">&#34;desc&#34;</span><span class="p">]</span><span class="si">}${</span><span class="nx">separator</span><span class="si">}${</span><span class="nx">element</span><span class="p">[</span><span class="s2">&#34;time&#34;</span><span class="p">]</span><span class="si">}</span><span class="sb">`</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s2">&#34;\n&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/(^\[)|(\]$)/gm</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">fileData</span> <span class="o">=</span> <span class="nb">encodeURI</span><span class="p">(</span><span class="nx">strDayTimes</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">link</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">link</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s2">&#34;href&#34;</span><span class="p">,</span> <span class="nx">fileData</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">link</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s2">&#34;download&#34;</span><span class="p">,</span> <span class="sb">`timesheet.</span><span class="si">${</span><span class="nx">extn</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">link</span><span class="p">.</span><span class="nx">click</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span>
</span></span></code></pre></div><h2 id="modify-vuex-store">Modify Vuex store</h2>
<p>The <code>Daily</code> timesheet component references Vuex store and specifically a module called <code>dailystr</code>. Let us include that.</p>
<p>Create a new file called <code>store/dailystr.js</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">namespaced</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;daystr&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">state</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">dayDate</span><span class="o">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nx">dayTimes</span><span class="o">:</span> <span class="p">[],</span>
</span></span><span class="line"><span class="cl">    <span class="nx">activeDayTime</span><span class="o">:</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">mutations</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newDayTime</span><span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">state</span><span class="p">.</span><span class="nx">dayTimes</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span> <span class="nx">desc</span><span class="o">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span> <span class="nx">time</span><span class="o">:</span> <span class="mi">1</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">setActiveDayTime</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">state</span><span class="p">.</span><span class="nx">activeDayTime</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">delDayTimeByIndex</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span> <span class="nx">index</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">state</span><span class="p">.</span><span class="nx">dayTimes</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">setDayDate</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">state</span><span class="p">.</span><span class="nx">dayDate</span> <span class="o">=</span> <span class="nx">val</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">resetDay</span><span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">state</span><span class="p">.</span><span class="nx">dayDate</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">().</span><span class="nx">toISOString</span><span class="p">().</span><span class="nx">substr</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="nx">state</span><span class="p">.</span><span class="nx">dayTimes</span> <span class="o">=</span> <span class="p">[{</span> <span class="nx">desc</span><span class="o">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span> <span class="nx">time</span><span class="o">:</span> <span class="mi">1</span> <span class="p">}];</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>We create a bunch of variables to store time entries in a day, and also created <code>mutations</code> that allow us to change those variable values.</p>
<p>Change <code>store/index.js</code> to include the newly created module. The complete code is outlined below.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Vue</span> <span class="nx">from</span> <span class="s2">&#34;vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Vuex</span> <span class="nx">from</span> <span class="s2">&#34;vuex&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">VuexPersistence</span> <span class="nx">from</span> <span class="s2">&#34;vuex-persist&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">daystr</span> <span class="nx">from</span> <span class="s2">&#34;./daystr&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Vue</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">Vuex</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">vuexLocal</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">VuexPersistence</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">storage</span><span class="o">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">localStorage</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="k">new</span> <span class="nx">Vuex</span><span class="p">.</span><span class="nx">Store</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">  <span class="nx">state</span><span class="o">:</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">mutations</span><span class="o">:</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">actions</span><span class="o">:</span> <span class="p">{},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">modules</span><span class="o">:</span> <span class="p">{</span> <span class="nx">daystr</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nx">plugins</span><span class="o">:</span> <span class="p">[</span><span class="nx">vuexLocal</span><span class="p">.</span><span class="nx">plugin</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span></code></pre></div><p>We had made the <code>vuex-persist</code> related changes at the beginning of this post.</p>
<h2 id="enable-pwa">Enable PWA</h2>
<p>If you had selected the <code>PWA</code> option while creating the project using Vue CLI, your app is automatically available as a progressive web app. You cannot test this unless you are connected using <code>https</code>. Since we don&rsquo;t really do any changes here, you can see the PWA in action after deploying the application.</p>
<h2 id="deploy">Deploy</h2>
<p>Deploying a client-application is really easy - thanks to build/deploy/host application services available today.</p>
<p>As an example, we will use <a href="https://vercel.com">vercel.com</a>.</p>
<p>Go to vercel.com, create an account if you don&rsquo;t have one, or login to your existing account.</p>
<p>On dashboard, click on <code>Import Project</code> button. Vercel will ask you for the Git repository to import and may also ask you for additional permissions to access repository.</p>
<p><img loading="lazy" src="/2020/deploy-vue-app-vercel.jpg" type="" alt="deploy-vue-app-vercel"  /></p>
<p>Once the repo is imported, Vercel should automatically identify the project as a Vue app and set build configuration. Review the configuration and click on <code>Deploy</code> to deploy your app and make it available to the world. Vercel will provide the URL that you can use to access your app.</p>
<p>The URL for your app will be available over https (e.g. <a href="https://simple-timesheet.vercel.app">simple-timesheet.vercel.app</a>). You will be able to install this app to your desktop or mobile using the functionality enabled by PWA.</p>
<h2 id="finis">Finis</h2>
<p>That&rsquo;s it - you have created and deployed a totally real-world timesheet application usign Vue, Vuetify and friends.</p>
<p>The repository with full code is at <a href="https://github.com/prashanth1k/simple-timesheet">https://github.com/prashanth1k/simple-timesheet</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Create Simple Tooltips in Vue</title>
      <link>https://techformist.com/simple-tooltip-vue/</link>
      <pubDate>Wed, 21 Oct 2020 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/simple-tooltip-vue/</guid>
      <description>&lt;p&gt;Tooltips are omnipresent, or rather have to be. While there have been excellent standardisation of user experience since we saw what Bootstrap was capable of, there are days and applications that can throw off users with strange icons, buttons and navigation. Ergo, tooltips.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://techformist.com/2020/vuetify-tool-tip.gif&#34; type=&#34;&#34; alt=&#34;vuetify-tool-tip&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;The humble tooltip can provide helpful hints, short messages and guide user on what a particular button, text box or any other element will do before clicking the thingy and causing destruction of a planet.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Tooltips are omnipresent, or rather have to be. While there have been excellent standardisation of user experience since we saw what Bootstrap was capable of, there are days and applications that can throw off users with strange icons, buttons and navigation. Ergo, tooltips.</p>
<p><img loading="lazy" src="/2020/vuetify-tool-tip.gif" type="" alt="vuetify-tool-tip"  /></p>
<p>The humble tooltip can provide helpful hints, short messages and guide user on what a particular button, text box or any other element will do before clicking the thingy and causing destruction of a planet.</p>
<p>Vue has more than few options for creating tooltips.</p>
<h2 id="use-tooltip-from-ui-library">Use tooltip from UI library</h2>
<p>Every UI library has support for tooltips in some form. Take Vuetify as an example.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;text-center d-flex align-center&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-tooltip</span> <span class="na">bottom</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">template</span> <span class="na">v-slot:activator</span><span class="o">=</span><span class="s">&#34;{ on, attrs }&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-btn</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span> <span class="na">dark</span> <span class="na">v-bind</span><span class="o">=</span><span class="s">&#34;attrs&#34;</span> <span class="na">v-on</span><span class="o">=</span><span class="s">&#34;on&#34;</span><span class="p">&gt;</span>Button<span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">span</span><span class="p">&gt;</span>Yes, this is a button<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-tooltip</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Just encapsulate any component with <code>v-tooltip</code> and you are all set.</p>
<blockquote>
<p>See how you can <a href="/tooltip-vuetify">create reusable tooltip in Vuetify</a>.</p>
</blockquote>
<p>Other libraries are somewhat better - BootstrapVue, Buefy etc. have simple ways to enable tooltips.</p>
<p>I typically prefer to use the tooltip provided by the styling libraries -</p>
<ul>
<li>has uniform user experience as compared to rest of the application</li>
<li>(mostly) has no/minimal overhead since we are downloading other components anyway</li>
</ul>
<p>But as you can see from the Vuetify example, it is no where near to ideal. Also, you may not use styling libraries for whatever strange reason and we don&rsquo;t want you to be stuck without tooltips. See those options next.</p>
<h2 id="tooltip-using-js">Tooltip using JS</h2>
<p>We are accustomed to someone else doing the hard work in the Javascript world. For Vue that happens to be <a href="https://github.com/Akryum">@akryum</a> from the Vue core team.</p>
<p>To get started, install <code>v-tooltip</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm install --save v-tooltip
</span></span></code></pre></div><p>Refer the package in the <code>main.js</code> file in your Vue project.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">VTooltip</span> <span class="nx">from</span> <span class="s2">&#34;v-tooltip&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Vue</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">VTooltip</span><span class="p">);</span>
</span></span></code></pre></div><p>.. and start using the tooltip.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">button</span>
</span></span><span class="line"><span class="cl">  <span class="na">v-tooltip</span><span class="o">=</span><span class="s">&#34;{
</span></span></span><span class="line"><span class="cl"><span class="s">  content: msg,
</span></span></span><span class="line"><span class="cl"><span class="s">  placement: placement,
</span></span></span><span class="line"><span class="cl"><span class="s">}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  Hover me
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span></code></pre></div><p><img loading="lazy" src="/2020/v-tooltip-vue.gif" type="" alt="v-tooltip-vue"  /></p>
<p>See <a href="https://akryum.github.io/v-tooltip/#/">v-tooltip demo and code</a>.</p>
<p>This way of enabling tooltip in Vue projects is really simple. But, the javascript code (<code>v-tooltip</code> uses <code>popper.js</code>), (minimal) CSS and any other components add up to the long list of components to be downloaded by the browser.</p>
<p>Bundlephobia reports <code>v-tooltip</code> as being 64.7kB minified and 19.9kB gzipped. Not ideal at all. Other options like <code>tooltip.js</code>, <code>tippy.js</code> etc. do exist, but none of they clock ~8-13 kB upwards minified+gzipped.</p>
<h2 id="simple-css-for-tooltips">Simple CSS for Tooltips</h2>
<p>Tooltips can be created for any component using pure CSS. While this option may not be super powerful but more than makes up for that with it&rsquo;s lightweight nature.</p>
<p>There are multiple options to enable tooltip using CSS - balloon-css, hint.css and microtip are popular options. All these clock ~1KB minified+gzipped.</p>
<p>For example, this is what we need to do to use microtip.</p>
<p>Add the CSS reference in <code>index.html</code> in your Vue project.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/microtip/microtip.css&#34;</span> <span class="p">/&gt;</span>
</span></span></code></pre></div><p>Start using the tooltip.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">button</span>
</span></span><span class="line"><span class="cl">  <span class="na">aria-label</span><span class="o">=</span><span class="s">&#34;This is a cool tooltip&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">data-microtip-position</span><span class="o">=</span><span class="s">&#34;bottom&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="na">role</span><span class="o">=</span><span class="s">&#34;tooltip&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">/&gt;</span>
</span></span></code></pre></div><p>You could also install <code>microtip</code> as a package and reference that in the project.</p>
<p>Tooltip using CSS is simple and effective!</p>
<h2 id="finis">Finis</h2>
<p>Using tooltips based on CSS is super useful, and is my preferred option (whenever UI libraries fall flat that is). But, I totally understand popular libraries like <code>v-tooltip</code> have their place and am cool with that too :)</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Find user&#39;s country without Geolocation and IP Lookup</title>
      <link>https://techformist.com/find-user-country-no-geolocation-ip-lookup/</link>
      <pubDate>Wed, 23 Sep 2020 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/find-user-country-no-geolocation-ip-lookup/</guid>
      <description>&lt;p&gt;I have this nagging problem of determining an end user&amp;rsquo;s country/region in my web apps. The reasons for doing that are many -&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Automatic conversion of an event date/time&lt;/li&gt;
&lt;li&gt;Display regional news&lt;/li&gt;
&lt;li&gt;Show prices in user&amp;rsquo;s currency&lt;/li&gt;
&lt;li&gt;.. and so on&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We could do two things to determine a user&amp;rsquo;s region -&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use geo location&lt;/li&gt;
&lt;li&gt;Use external services to look up the IP&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Option (1) is ideal. It is quite easy - thanks to HTML5.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have this nagging problem of determining an end user&rsquo;s country/region in my web apps. The reasons for doing that are many -</p>
<ol>
<li>Automatic conversion of an event date/time</li>
<li>Display regional news</li>
<li>Show prices in user&rsquo;s currency</li>
<li>.. and so on</li>
</ol>
<p>We could do two things to determine a user&rsquo;s region -</p>
<ol>
<li>Use geo location</li>
<li>Use external services to look up the IP</li>
</ol>
<p>Option (1) is ideal. It is quite easy - thanks to HTML5.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">navigator</span><span class="p">.</span><span class="nx">geolocation</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">navigator</span><span class="p">.</span><span class="nx">geolocation</span><span class="p">.</span><span class="nx">getCurrentPosition</span><span class="p">(</span><span class="nx">showPosition</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">x</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">&#34;Geolocation not supported!&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We can use geo location almost always, except that the user gets prompted to allow our app to access her location. This leads to a bad user experience, and more than that, I don&rsquo;t want the user to think about our app as yet another shady site that collects unneeded personal information.</p>
<p>We avoid the above problem by looking up user IP against a database, which is the second option outlined above. For e.g. you can use APIs from <a href="https://ipstack.com/">IP Stack</a>, <a href="https://apility.io/apidocs/#geo-ip-look-up">Apility Geo IP lookup</a>, <a href="https://labstack.com/ip">Labstack IP lookup</a> or use the data sets from <a href="https://www.ip2location.com/">ip2location</a> to lookup the user region based on IP address.</p>
<p>While not always accurate, looking up the region using IP is a good enough approximation that just works. However, this costs money in form of external services (monthly costs) or in form of enhancements in your product + cost of third party datasets.</p>
<p>A third option exists if you are not a super professional org and can live with &ldquo;approximated&rdquo; regions - looking up the region using time zone.</p>
<p>Just do this in Javascript ..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">tzone</span> <span class="o">=</span> <span class="nx">Intl</span><span class="p">.</span><span class="nx">DateTimeFormat</span><span class="p">().</span><span class="nx">resolvedOptions</span><span class="p">().</span><span class="nx">timeZone</span><span class="p">;</span>
</span></span></code></pre></div><p><code>tzone</code> gives you the user&rsquo;s time zone, which can be now looked up to find the country of user.</p>
<p>For e.g. to find whether my user is logging in from India -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">indiaOrBust</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">tzone</span> <span class="o">=</span> <span class="nx">Intl</span><span class="p">.</span><span class="nx">DateTimeFormat</span><span class="p">().</span><span class="nx">resolvedOptions</span><span class="p">().</span><span class="nx">timeZone</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">tzone</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="s2">&#34;Kolkata&#34;</span><span class="p">)</span> <span class="o">||</span> <span class="nx">tzone</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="s2">&#34;Calcutta&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">?</span> <span class="s2">&#34;India&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="o">:</span> <span class="s2">&#34;Not India&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Not really ideal if -</p>
<ul>
<li>you are lucky enough to be in a region with multiple timezones and want to drilldown to the hyper locale.</li>
<li>have to distinguish / identify all the countries of the world</li>
<li>your &ldquo;do or die&rdquo; business logic relies on the country and you may lose a million dollars if that does not work</li>
</ul>
<p>.. but, it&rsquo;s a totally workable solution that does not add to the bundle or monetary costs.</p>
<p>See <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/resolvedOptions">documentation</a> for more details, use <code>Intl</code> and rejoice!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Multiple Ways to Define Functions in Javascript</title>
      <link>https://techformist.com/multiple-ways-define-function-javascript/</link>
      <pubDate>Wed, 16 Sep 2020 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/multiple-ways-define-function-javascript/</guid>
      <description>&lt;p&gt;We have looked at functions quite a bit on this blog over the last two years. We have seen many avatars of a function including &lt;a href=&#34;https://techformist.com/function-object-constructor-javascript/&#34;&gt;a function object&lt;/a&gt;, &lt;a href=&#34;https://techformist.com/method-of-function-javascript/&#34;&gt;a function&amp;rsquo;s method&lt;/a&gt;, &lt;a href=&#34;https://techformist.com/function-of-functions-javascript/&#34;&gt;function of functions&lt;/a&gt;, and so on. But, what we have not done is to document all the ways in which we can define functions.. so here it is. :)&lt;/p&gt;
&lt;h2 id=&#34;functions-in-javascript&#34;&gt;Functions in Javascript&lt;/h2&gt;
&lt;p&gt;Function is a reusable body of code.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say we have to add two numbers. You can write some simple code like so..&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We have looked at functions quite a bit on this blog over the last two years. We have seen many avatars of a function including <a href="/function-object-constructor-javascript/">a function object</a>, <a href="/method-of-function-javascript/">a function&rsquo;s method</a>, <a href="/function-of-functions-javascript/">function of functions</a>, and so on. But, what we have not done is to document all the ways in which we can define functions.. so here it is. :)</p>
<h2 id="functions-in-javascript">Functions in Javascript</h2>
<p>Function is a reusable body of code.</p>
<p>Let&rsquo;s say we have to add two numbers. You can write some simple code like so..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span> <span class="o">=</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;sum: &#34;</span><span class="p">,</span> <span class="nx">sum</span><span class="p">);</span>
</span></span></code></pre></div><p>But, what if you want to define code that can take any two arbitrary numbers and provide the sum? Not surprisingly, we have what is called a &ldquo;function&rdquo; to do exactly that.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span> <span class="o">=</span> <span class="nx">sum</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;sum: &#34;</span><span class="p">,</span> <span class="nx">sum</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">sum</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The art and science of specifying some code for a function is a &ldquo;function declaration&rdquo;. The code within the <code>sum</code> function brackets is the body of the function and defines what the function does. There is more than one way to declare a function. Once the function is declared, you can call it from other code to get the result of function execution, yay.</p>
<h2 id="simple-function-declaration">Simple Function Declaration</h2>
<p>Example above, nothing specific to report here.</p>
<p>Functions may or may not have arguments (<code>a</code>, <code>b</code>), and may or may not return values (<code>return a + b</code>).</p>
<h2 id="function-expression">Function Expression</h2>
<p>A function is also an object in Javascript. So, we can easily do ..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>The difference from earlier declaration is that we used an expression to declare a function and assigned it to a variable called <code>sum</code> (instead of directly declaring a function called <code>sum</code>). For all practical purposes <code>sum</code> is a &ldquo;normal&rdquo; function that takes two arguments like before and returns the sum.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span></code></pre></div><p>This form of declaring function as an expression is also called &ldquo;named function expression&rdquo;.</p>
<p>You can also name the inner function, but the results will remain the same.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">sumIn</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span> <span class="c1">//3
</span></span></span></code></pre></div><p>You cannot call <code>sumIn</code> directly.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">sumIn</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sumIn</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ReferenceError: sumIn is not defined
</span></span></span></code></pre></div><h2 id="function-expression-using-new">Function Expression using <code>new</code></h2>
<p>An alternative form of the above expression is to use a <code>new</code> keyword to declare the function and use the function body as the last argument.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Function</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="s2">&#34;return a + b&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span></code></pre></div><p>See more details of this rarely used form <a href="https://javascript.info/new-function">here</a>.</p>
<h2 id="arrow-functions">Arrow Functions</h2>
<p>Arrow functions are one of my favourite things in the world. You just don&rsquo;t name the functions anything, but use them to their full power.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">sum</span> <span class="o">=</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span> <span class="c1">//3
</span></span></span></code></pre></div><p>We did not use <code>function</code> key word to declare the function, but instead used a &ldquo;shorter&rdquo; notation with <code>=&gt;</code> syntax. The end result is the same.</p>
<p>Also see <a href="/arrow-functions-and-this-in-javascript/">the perceived problem with <code>this</code> in arrow functions</a>, and <a href="/implicit-return-gotcha-arrow-functions/">implicit return gotcha in arrow functions</a>.</p>
<h2 id="more-to-functions">More to Functions</h2>
<p>Functions are super useful and you will use them probably everywhere in Javascript. Of course, functions could do way more - also see <a href="/whos-afraid-of-recursion/">function recursion</a>, and <a href="/generators-javascript/">generators</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Using Nullish Coalescing Operator</title>
      <link>https://techformist.com/using-nullish-coalescing-operator/</link>
      <pubDate>Wed, 08 Jul 2020 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/using-nullish-coalescing-operator/</guid>
      <description>&lt;p&gt;ES2020 introduced nullish coalescing operator. We will see just how and where can you find use for it?&lt;/p&gt;
&lt;h2 id=&#34;what-it-is&#34;&gt;What it is?&lt;/h2&gt;
&lt;p&gt;Nullish coalescing operator (&lt;code&gt;??&lt;/code&gt;) is introduced in the newest Javascript specification. It&amp;rsquo;s primary design goal is quite simple - provide a way to check for nulls to return &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt; values from an expression.&lt;/p&gt;
&lt;p&gt;The operator follows in the footsteps of shorcircuitinng operators &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; and &lt;code&gt;||&lt;/code&gt; to provide developers with a reliable way of checking for -&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>ES2020 introduced nullish coalescing operator. We will see just how and where can you find use for it?</p>
<h2 id="what-it-is">What it is?</h2>
<p>Nullish coalescing operator (<code>??</code>) is introduced in the newest Javascript specification. It&rsquo;s primary design goal is quite simple - provide a way to check for nulls to return <code>true</code> or <code>false</code> values from an expression.</p>
<p>The operator follows in the footsteps of shorcircuitinng operators <code>&amp;&amp;</code> and <code>||</code> to provide developers with a reliable way of checking for -</p>
<ol>
<li>Null values</li>
<li>Differentiating between nulls and values that exist but are falsy</li>
</ol>
<p>The basic usage is simple.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">check</span><span class="p">(</span><span class="nx">planet</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;awesome&#34;</span><span class="p">]</span> <span class="o">??</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">earth</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">awesome</span><span class="o">:</span> <span class="kc">true</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">pluto</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">awesome</span><span class="o">:</span> <span class="kc">false</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">mars</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">check</span><span class="p">(</span><span class="nx">earth</span><span class="p">));</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">check</span><span class="p">(</span><span class="nx">pluto</span><span class="p">));</span> <span class="c1">// false
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">check</span><span class="p">(</span><span class="nx">mars</span><span class="p">));</span> <span class="c1">// true
</span></span></span></code></pre></div><p>Null coalescing operator evaluates to true only for <code>null</code> and <code>undefined</code>. And, any evaluation of the expression is skipped if the left-most expression evaluates to <code>null</code> or <code>undefined</code> (similar to truthy checks in <code>||</code>).</p>
<p>The results would have been different if you had used a simple <code>||</code> operator without null checks.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">check</span><span class="p">(</span><span class="nx">planet</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;awesome&#34;</span><span class="p">]</span> <span class="o">||</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">earth</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">awesome</span><span class="o">:</span> <span class="kc">true</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">pluto</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">awesome</span><span class="o">:</span> <span class="kc">false</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">mars</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">check</span><span class="p">(</span><span class="nx">earth</span><span class="p">));</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">check</span><span class="p">(</span><span class="nx">pluto</span><span class="p">));</span> <span class="c1">// true. Wait what?
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">check</span><span class="p">(</span><span class="nx">mars</span><span class="p">));</span> <span class="c1">// true
</span></span></span></code></pre></div><h2 id="why-is-null-coalescing-operator-required">Why is null coalescing operator required?</h2>
<p>Javascript does not require you to specify types, but they are implicitly assumed by the runtime.</p>
<p>Let us take this simple example.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">a</span> <span class="o">=</span> <span class="s2">&#34;abc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">b</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">c</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">==</span> <span class="s2">&#34;abc&#34;</span> <span class="o">&amp;&amp;</span> <span class="nx">b</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="nx">c</span> <span class="o">==</span> <span class="kc">true</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;so true&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// so true
</span></span></span></code></pre></div><p>Or, you could just use -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">&amp;&amp;</span> <span class="nx">b</span> <span class="o">&amp;&amp;</span> <span class="nx">c</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;so true&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// so true
</span></span></span></code></pre></div><p>&ldquo;Free typing&rdquo; allows us to do some magical (horrifying to some) things. The above block script executes because the string and number are converted to boolean, and rules are automatically applied to convert values to boolean for evaluation.</p>
<p>We could make the script more readable by shortcircuiting it.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="k">return</span> <span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;awesome&#34;</span><span class="p">]</span> <span class="o">||</span> <span class="kc">true</span><span class="p">;</span>
</span></span></code></pre></div><p>If <code>planet</code> has <code>awesome</code> property set return that property, OR return <code>true</code>.</p>
<p>While this is awesome and all, you can see where it can go wrong.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">pluto</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">awesome</span><span class="o">:</span> <span class="kc">false</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">check</span><span class="p">(</span><span class="nx">pluto</span><span class="p">));</span> <span class="c1">//
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">check</span><span class="p">(</span><span class="nx">planet</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;awesome&#34;</span><span class="p">]</span> <span class="o">||</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// true for pluto
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Even when we specify <code>pluto</code> is not awesome, our program (rightfully) assumes it is. This happens because of the way <code>||</code> evaluates the expression-</p>
<ol>
<li>Start from left to right</li>
<li>Check if first expression is <code>true</code>. Return <code>true</code> if it is</li>
<li>Check if next expression is <code>true</code>. Return <code>true</code> if it is</li>
<li>&hellip; and so on till the entire expression is evaluated</li>
</ol>
<p>In our case -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="k">return</span> <span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;awesome&#34;</span><span class="p">]</span> <span class="o">||</span> <span class="kc">true</span><span class="p">;</span>
</span></span></code></pre></div><p>We pass <code>pluto</code> to the function -</p>
<ol>
<li><code>pluto['awesome']</code> is <code>false</code></li>
<li><code>OR</code> moves to the right, and gets <code>true</code></li>
<li>Expression returns <code>true</code></li>
</ol>
<p>Our favourite way to solve this so far has been -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">pluto</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">awesome</span><span class="o">:</span> <span class="kc">false</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">check</span><span class="p">(</span><span class="nx">pluto</span><span class="p">));</span> <span class="c1">//
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">check</span><span class="p">(</span><span class="nx">planet</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">planet</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="s2">&#34;awesome&#34;</span><span class="p">)</span> <span class="o">?</span> <span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;awesome&#34;</span><span class="p">]</span> <span class="o">:</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// false
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>If <code>pluto</code> has a prop called <code>awesome</code>, return that. Or, return <code>true</code>.</p>
<p>Null coalescing operator simplifies this check.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">pluto</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">awesome</span><span class="o">:</span> <span class="kc">false</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">check</span><span class="p">(</span><span class="nx">pluto</span><span class="p">));</span> <span class="c1">//
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">check</span><span class="p">(</span><span class="nx">planet</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;awesome&#34;</span><span class="p">]</span> <span class="o">??</span> <span class="kc">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// false
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We are now effectively saying if <code>awesome</code> prop is not null, return that. Else, return <code>true</code>.</p>
<h2 id="how-does-nullish-coalescing-operator-behave-under-pressure">How does nullish coalescing operator behave under pressure?</h2>
<p>Quite well, actually.</p>
<p>Nullish coalescing operator acts very similar to <code>||</code>, but, we are effectively checking for nulls.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">undefined</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// false
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">null</span> <span class="o">||</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">||</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// true
</span></span></span></code></pre></div><p>Now, consider these interesting expressions -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;abc&#34;</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// &#34;abc&#34;
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;&#34;</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// &#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">1</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// 1
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">0</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// 0
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">true</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">false</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span> <span class="c1">// false
</span></span></span></code></pre></div><h2 id="use-cases">Use Cases</h2>
<p>You can use nullish coalescing operator with ES2020. It is supported in Node 14+ and in all major browsers. Using variables for falsy checks without worrying about whether the return value is false simplifies our code.</p>
<p>A few use cases are outlined below.</p>
<h5 id="1-truthy-checks-alongside-null-values">1. Truthy checks alongside null values</h5>
<p>This is the simplest use case, but one that you probably will never use.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="s2">&#34;earth&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span> <span class="o">??</span> <span class="s2">&#34;no planet&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// earth
</span></span></span></code></pre></div><h5 id="2-prop-checks">2. Prop checks</h5>
<p>This will be the most likely use case. Use this new operator and avoid null checks.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">earth</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">awesome</span><span class="o">:</span> <span class="kc">true</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">earth</span><span class="p">[</span><span class="s2">&#34;awesome&#34;</span><span class="p">]</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span>
</span></span></code></pre></div><p>You will do this if you don&rsquo;t want to use the new optional chaining operator. Both the operators do the same thing differently.</p>
<p>Optional chaining operator (<code>?.</code>) offers a convenient way to use props without ever caring about the object is valid. For e.g. consider this code ..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">.</span><span class="nx">earth</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span> <span class="c1">// error
</span></span></span></code></pre></div><p>To avoid the null game, we were forced to introduce our own checks like so -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">planet</span> <span class="o">&amp;&amp;</span> <span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;earth&#34;</span><span class="p">])</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;earth&#34;</span><span class="p">][</span><span class="s2">&#34;name&#34;</span><span class="p">]);</span>
</span></span></code></pre></div><p>But, now we can rock the world with a cooler way to do the same thing.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">.</span><span class="nx">earth</span><span class="o">?</span><span class="p">.</span><span class="nx">name</span><span class="o">?</span><span class="p">.</span><span class="nx">toUpperCase</span><span class="p">());</span> <span class="c1">// no error :)
</span></span></span></code></pre></div><h5 id="3-arg-checks">3. Arg checks</h5>
<p>Another strong use case - thanks to Javascript&rsquo;s typing powers.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">isPlanet</span><span class="p">(</span><span class="nx">planet</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">planet</span><span class="p">[</span><span class="s2">&#34;type&#34;</span><span class="p">]</span> <span class="o">??</span> <span class="kc">true</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Again, this could be better served by optional chaining depending on your use case.</p>
<h2 id="when-not-to-use-this-operator">When not to use this operator?</h2>
<p>Nullish coalescing operator is of course no hammer, and it does not offer you peace of mind even with the narrow coverage it offers.</p>
<h5 id="cant-chain-with-and--or">Can&rsquo;t chain with AND / OR</h5>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span>    <span class="kc">true</span> <span class="o">||</span> <span class="nx">planet</span> <span class="o">??</span> <span class="s2">&#34;ok&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// syntax error
</span></span></span></code></pre></div><h5 id="support-is-limited">Support is limited</h5>
<p>You cannot go crazy with nullish coalescing operator.</p>
<ul>
<li>Node v14+ is required</li>
<li>Not supported in IE (are you still using IE?), Firefox for Android, Opera for Android. Check <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator#Browser_compatibility">browser compatibility</a> to know current status</li>
</ul>
<h2 id="fin">Fin</h2>
<p>That&rsquo;s about it folks. Start coding cool stuff!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Javascript - A Beginner Guide</title>
      <link>https://techformist.com/javascript-beginner-guide/</link>
      <pubDate>Wed, 03 Jun 2020 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/javascript-beginner-guide/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a good guide to get you started on Javascript in a practical way.&lt;/p&gt;
&lt;h2 id=&#34;why-another-guide&#34;&gt;Why another guide?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Practical - don&amp;rsquo;t learn for the sake of learning, learn for the sake of doing!&lt;/li&gt;
&lt;li&gt;Tactical - learn what matters, fast (yes, that&amp;rsquo;s what everyone says)&lt;/li&gt;
&lt;li&gt;Strategic - see the big picture&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This guide will get you started from the beginning, graduate you to using industry standard tools, and point you towards the right direction for learning even more than what can be offered in one guide or course.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Here&rsquo;s a good guide to get you started on Javascript in a practical way.</p>
<h2 id="why-another-guide">Why another guide?</h2>
<ul>
<li>Practical - don&rsquo;t learn for the sake of learning, learn for the sake of doing!</li>
<li>Tactical - learn what matters, fast (yes, that&rsquo;s what everyone says)</li>
<li>Strategic - see the big picture</li>
</ul>
<p>This guide will get you started from the beginning, graduate you to using industry standard tools, and point you towards the right direction for learning even more than what can be offered in one guide or course.</p>
<h2 id="what-makes-me-qualified">What makes me qualified?</h2>
<p>I have been using Javascript since late 90&rsquo;s, and am absolutely in love with the language. I was an avid hobbyist developer using JS in packaged products, and after 15 years of doing that changed into a full-stack developer and consultant creating web-based technology products and services.</p>
<p>In summary - nothing that qualifies me to an epic level, but I do have a thing or two to share.</p>
<h2 id="who-is-this-guide-for">Who is this guide for?</h2>
<p>This guide is intended for folks who want a practical introduction to Javascript.</p>
<p>If you are a developer in any language, it is highly likely that you have used Javascript in some shape and form, and may not find it super interesting to start from the beginning.</p>
<h2 id="the-many-faces-of-javascript">The Many Faces of Javascript</h2>
<p>Javascript started as the language for the web - automating web pages and bringing interactivity to clients using a browser. It is the only language that does that to this day at the browser level (though things are changing fast). But, JS has grown much much more - for everything from pushing boundaries on interactivity over web to making animations, drawing charts, and creating desktop and mobile apps.</p>
<p>Javascript can today run on web, desktop and such typical computing devices, mobile phones, on embedded devices. The evolving standards have made it easier to learn and scale the language to newer heights.</p>
<h2 id="get-started">Get Started</h2>
<p>Why, in the web of course.</p>
<ol>
<li>Take the first steps by learning how Javascript can be used today and how you can create your own magic with a few lines of code.</li>
<li>Create the first few projects using just Javascript</li>
<li>Graduate to using a full-fledged development environment and create more projects</li>
</ol>
<p>My goal is to make this guide as practical as possible - hence the focus on projects. You may enjoy the guide more if you follow along.</p>
<h3 id="tools-of-trade">Tools of Trade</h3>
<p>Before delving further, let&rsquo;s set everything up for our journey.</p>
<p>We will begin our journey with a simple tool - no installation required. Just start using one of the below tools -</p>
<ul>
<li><a href="https://codepen.io">CodePen</a></li>
<li><a href="https://webmaker.app/app/">Webmaker</a></li>
</ul>
<p>You may optionally sign up for a free account in either (or both?) of the services.</p>
<p>Later on we will start using a code editor - <a href="https://code.visualstudio.com/">VSCode</a>. Code along and see working examples hosted on <a href="https://github.com/techformist/javascript-beginner-guide">Github</a>.</p>
<h3 id="start-coding">Start Coding</h3>
<p>Javascript works beautifully in web - it plays along well with HTML (Hyper Text Markup Language - the language to create the user interface of web pages) and CSS (cascading style sheets - style the webpage).</p>
<p>A typical example will look like this ..</p>
<ol>
<li>
<p>Create a file called <code>index.html</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">html</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;style.css&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;text/javascript&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;./script.js&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>Hello World<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</span></span></code></pre></div></li>
<li>
<p>Create another file called <code>style.css</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">h1</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">color</span><span class="p">:</span> <span class="kc">blue</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
<li>
<p>Create yet another file called <code>script.js</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">alert</span><span class="p">(</span><span class="s2">&#34;hello world&#34;</span><span class="p">);</span>
</span></span></code></pre></div></li>
</ol>
<p>Open the HTML page to see a page with the <code>hello world</code> message that shows dialog box when it is loaded (or refreshed).</p>
<p><img loading="lazy" src="/2020/javascript-hello-world-html.gif" type="" alt="hello-world-javascript-html"  /></p>
<p>Congratulations of your first line of Javascript!</p>
<p>The structure represents how today&rsquo;s web works. When you visit a web page -</p>
<ol>
<li>Your browser downloads HTML, Javascript and CSS</li>
<li>Renders HTML page and applies styles</li>
<li>Applies Javascript logic to change content, add/change styles or respond to user actions</li>
</ol>
<p>Since everything described above is user-facing and &ldquo;front-ends&rdquo; the application, Javascript is associated with &ldquo;frontend&rdquo; languages that deals with user interfaces and interaction.</p>
<p>But, when you run Javascript in other modes (for e.g. in desktop or mobile phones), it is executed by some form of <a href="https://nodejs.org/">NodeJS</a>. Node is a Javascript runtime engine that will execute Javascript on the device and can function without any interaction with HTML/CSS layers. This execution can happen on your machine (hence executing any code that you type), on web servers that serve websites, on desktop or mobiles using frameworks that encapsulate Node. Node enables Javascript execution in the backend.</p>
<p>Executing Javascript in frontend is optional - but you have to deal with limited user interactivity. You can just have styled static pages without supporting any dynamic interactions. Similarly, you can have all the frontend functions without using any Javascript in the backend (e.g. you could use PHP, Go or some other language for servers).</p>
<p>Let&rsquo;s get back to our project at hand. Instead of creating all the required files locally we can make our life easier for now and use one of the online tools - e.g. <a href="https://webmaker.app/app/">Webmaker</a>. Just go to the site, click on <code>New</code> &gt; <code>Start Blank</code>. Add the content of the <code>html</code>, <code>js</code> and <code>css</code> in the various panes - you don&rsquo;t need to reference the files since they are already tied together. Double click on the <code>Console</code> pane to see the console output - this is where you can see output from Javascript execution regardless of what is on the HTML page.</p>
<p>If you are using <code>codepen</code> - choose <code>Create Pen</code> from the left sidebar. Replace the content of the panes with what you used earlier to see the same beautiful page! You can see the console by clicking on the <code>Console</code> button at the bottom of the page.</p>
<p>Find <a href="https://codepen.io/techformist/pen/BajBvMx">Codepen for the above example here</a>. Just open code pen to execute the code.</p>
<p><img loading="lazy" src="/2020/codepen-html-js-hello-world.jpg" type="" alt="codepen-html-js-hello-world"  /></p>
<p>Webmaker app and Codepen execute your code as you type the lines - so don&rsquo;t get surprised with errors when you stop typing for any reason.</p>
<p>Since we will not be using HTML and CSS as much, you will refer the JS pane and console for the most part.</p>
<p>I will use Codepen specific references here on, but the actions are similar in any other tool incl. Webmaker.</p>
<p>You can start creating new pens for trying out the examples. You can find all the examples from this guide in a <a href="https://codepen.io/collection/nYYYdz">Codepen collection</a>.</p>
<h4 id="viewing-output">Viewing Output</h4>
<p>We previously had a single line of code. We will start building up on top of that.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;hello world&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;you are awesome&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p><code>console</code> is an easy way to print a message during code execution. In a browser you can see console output in web developer tools (e.g. Ctrl + Shift + I to developer tools &gt; head over to <code>Console</code> tab). In Codepen, you simply click the <code>Console</code> button to show console - this is hidden by default.</p>
<p>When the browser (or runtime) executes Javascript, it just executes statements one line after the another. Javascript is an &ldquo;interpreted&rdquo; language since the code is not compiled to any intermittent state before execution. The tool ecosystem is quite powerful to make you forget that to an extent - but keep that in mind.</p>
<p>You can also do simple (or complex operations when you print output).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;sum: &#34;</span><span class="p">,</span> <span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// sum: 3
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;The answer to all questions is &#34;</span><span class="p">,</span> <span class="mi">6</span> <span class="o">*</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// The answer to all questions is 42
</span></span></span></code></pre></div><p>See the <code>//</code>? That is a comment. Comments are ways for other humans (and future you) to understand code. Comments are ignored by the runtime - they are not executed, but just sit there in the code.</p>
<p>Comments can be single or multiple line.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// single line comment
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">
</span></span></span><span class="line"><span class="cl"><span class="cm">    Multiple line comment
</span></span></span><span class="line"><span class="cl"><span class="cm">    ...
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><h2 id="variables-and-types">Variables and Types</h2>
<p>A variable is a temporary storage location for your program. You can assign a &ldquo;value&rdquo; to a variable, recall the value at a later time, and process the variable like you would process the data.</p>
<p>Creating a variable (&ldquo;declaring variable&rdquo;) and assigning a value is as simple as -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a:&#34;</span><span class="p">,</span> <span class="nx">a</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// a: 1
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// reassign value
</span></span></span><span class="line"><span class="cl"><span class="nx">a</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a next:&#34;</span><span class="p">,</span> <span class="nx">a</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// a next: 2
</span></span></span></code></pre></div><p>Variables can be used to carry out operations similar to what we did earlier.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">b</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;sum:&#34;</span><span class="p">,</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">);</span>
</span></span></code></pre></div><p>The values that remain constant (e.g. 1, 2) are called &ldquo;constants&rdquo;. Constants can be assigned to variables and used in any calculations along with variables.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">n</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;double:&#34;</span><span class="p">,</span> <span class="nx">n</span> <span class="o">*</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// double: 6
</span></span></span></code></pre></div><p>You can also do -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">name</span> <span class="o">=</span> <span class="s2">&#34;Peter Parker&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;My name is &#34;</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// My name is Peter Parker
</span></span></span></code></pre></div><p>While Javascript allows you to assign variables as and when you please, modern build tools may not always agree with you. It is a good idea to &ldquo;declare&rdquo; a variable explicitly by using <code>var</code>, <code>const</code> or <code>let</code> keywords.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">num</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;num: &#34;</span><span class="p">,</span> <span class="nx">num</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// num: 1
</span></span></span></code></pre></div><p>Keywords in a programming language are words that denote special meaning. In the above e.g. <code>var</code> declares a variable called <code>num</code>. You cannot use keywords as variable names.</p>
<p>The below code will not work.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">var</span> <span class="kd">var</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// error
</span></span></span></code></pre></div><p>Other keywords include words to check conditions (e.g. <code>if</code>, <code>else</code>), specify conditions to run code &ldquo;in a loop&rdquo;, i.e., execute code repeatedly until a condition is satisfied (e.g. <code>while</code>, <code>for</code>), and more. See the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords">complete list of Javascript keywords on MDN</a>.</p>
<p>When you declare a variable using <code>const</code> you cannot reassign values to that variable. Other than that the different declarations differ in how variable values are made available at different locations within the code. We will revisit this later.</p>
<p>You may have also observed that we did not specify if a given variable stores</p>
<ul>
<li>a number (for e.g. 1, 2, or 33)</li>
<li>a string (e.g. &ldquo;Peter Parker&rdquo;)</li>
<li>or something else.</li>
</ul>
<p><code>number</code>, <code>string</code> etc. are called variable &ldquo;types&rdquo;.</p>
<p>You cannot specify types in your code. Javascript provides &ldquo;implicit types&rdquo;, which is just a fancy way of saying that the Javascript runtime looks at the variable value and assumes a type for the variable.</p>
<p>You can see the &ldquo;deduced type&rdquo; using <code>typeof</code> keyword.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">num1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">num2</span> <span class="o">=</span> <span class="mf">3.14</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">num3</span> <span class="o">=</span> <span class="o">-</span><span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">strWorld</span> <span class="o">=</span> <span class="s2">&#34;world&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">strW</span> <span class="o">=</span> <span class="s2">&#34;w&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="k">typeof</span> <span class="nx">num2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="k">typeof</span> <span class="nx">num2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="k">typeof</span> <span class="nx">num3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="k">typeof</span> <span class="nx">strWorld</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="k">typeof</span> <span class="nx">strW</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// &#34;number&#34; &#34;number&#34; &#34;number&#34; &#34;string&#34; &#34;string&#34;
</span></span></span></code></pre></div><p>As you can see there are no specific types for decimals, whole numbers or negative integers - all of them are simply <code>number</code>. Similarly any number of characters will denote a <code>string</code> type.</p>
<p>Let us see more types.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">result</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="c1">// there are no quotes around `true`
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">nothing</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">result</span><span class="p">,</span> <span class="k">typeof</span> <span class="nx">realResult</span><span class="p">,</span> <span class="k">typeof</span> <span class="nx">nothing</span><span class="p">,</span> <span class="nx">nothing</span> <span class="o">==</span> <span class="kc">null</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// &#34;boolean&#34; &#34;undefined&#34; &#34;object&#34; true
</span></span></span></code></pre></div><p>The last statement is just an equality check to ask runtime to check whether <code>nothing</code> is <code>null</code>, and therefore the result is true.</p>
<p>There are two more types - <code>bigint</code> (for handling large integers) and <code>symbol</code> (for handling symbols).</p>
<p>There are also special values called <code>NaN</code> and <code>Infinity</code> which are of number types but not really numbers.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">noNum</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">half</span> <span class="o">=</span> <span class="nx">noNum</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">half</span><span class="p">);</span> <span class="c1">// NaN
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">half</span><span class="p">);</span> <span class="c1">// number
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;abc&#34;</span> <span class="o">*</span> <span class="mi">2</span><span class="p">);</span> <span class="c1">// NaN
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">2</span> <span class="o">/</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// Infinity
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="p">(</span><span class="mi">2</span> <span class="o">/</span> <span class="mi">0</span><span class="p">));</span> <span class="c1">// number
</span></span></span></code></pre></div><p>While one may initially think that using no types in a programming language is easier (it is indeed..), no explicit types may lead to unexpected results and hard-to-debug issues. More over, invalid operations like dividing a string by number cannot be caught during development (during &ldquo;compilation&rdquo;) since types are not deduced until runtime.</p>
<p>For e.g.,</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">str1</span> <span class="o">=</span> <span class="s2">&#34;hello&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">str1</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// hello2
</span></span></span></code></pre></div><p>When you add a string to a number, Javascript automatically converts the integer to a &ldquo;more complex&rdquo; string type and combines the two (&quot;+&quot; operator can work on numbers as well as strings).</p>
<p>Conversion of types is supported across the board in Javascript. There are so many use cases that there are even shortcuts for type conversion.</p>
<p>Consider below examples.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">strA</span> <span class="o">=</span> <span class="s2">&#34;1&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">strA</span><span class="p">,</span> <span class="k">typeof</span> <span class="nx">strA</span><span class="p">);</span> <span class="c1">// &#34;1&#34; &#34;string&#34;
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numA</span> <span class="o">=</span> <span class="nb">Number</span><span class="p">(</span><span class="nx">strA</span><span class="p">);</span> <span class="c1">// 1
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">numA</span><span class="p">,</span> <span class="k">typeof</span> <span class="nx">numA</span><span class="p">);</span> <span class="c1">// 1 &#34;number&#34;
</span></span></span></code></pre></div><p>In fact, I used different variables for <code>strA</code> and <code>numA</code> for demonstration purposes. Nothing prevents me from using the same variable name. During program execution Javascript points the variable to a new storage location with number type in the background.</p>
<p>Also, did you also observe that we used string variables using a double quote (<code>&quot;</code>), but assigned a number without quotes? Strings can be quoted with single or double quotes, rest of the types (or objects) are not.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">hello</span> <span class="o">=</span> <span class="s2">&#34;world&#34;</span><span class="p">;</span> <span class="c1">// string
</span></span></span><span class="line"><span class="cl"><span class="nx">x</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// number
</span></span></span><span class="line"><span class="cl"><span class="nx">isAwesome</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="c1">// boolean
</span></span></span></code></pre></div><p>Instead of quotes, we can also use ``` - these are called as string literals and are awesome.</p>
<p>Remember how we printed out the values earlier?</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;hello: &#34;</span><span class="p">,</span> <span class="nx">hello</span><span class="p">);</span>
</span></span></code></pre></div><p>We can do the same thing by using string literals -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`hello: </span><span class="si">${</span><span class="nx">hello</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span></code></pre></div><p>You can also do simple calculations within the string literals with or without using string literals.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`sum: </span><span class="si">${</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`product: </span><span class="si">${</span><span class="mi">3</span> <span class="o">*</span> <span class="mi">2</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span></code></pre></div><p>The final variable types we will talk about is <code>null</code> and <code>undefined</code>.</p>
<p><code>null</code> assigns a null value to a variable - it does exactly what it sounds like. Variable is assigned a value <code>null</code>!</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span><span class="p">);</span> <span class="c1">//null
</span></span></span></code></pre></div><p>Null can be assigned to any types and is commonly used in checking for a valid value in the variable.</p>
<p>Undefined, on the other hand, just tells us that a variable is not defined.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">b</span><span class="p">);</span> <span class="c1">//undefined
</span></span></span></code></pre></div><p><code>null</code> = no value in variable
<code>undefined</code> = variable has not been defined</p>
<p><a href="https://codepen.io/techformist/pen/MWKgLZe">See this Codepen for working examples.</a>.</p>
<h2 id="operations-and-operators">Operations and Operators</h2>
<p>An operation is just a term to process data and obtain an end result. An operation can include -</p>
<ol>
<li>One or more variables</li>
<li>One or more constants</li>
<li>One or more operators</li>
</ol>
<h3 id="arithmetic-operators">Arithmetic Operators</h3>
<p>Simple arithmetic operations are supported out of the box in Javascript.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">y</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// addition operation with `+` operator
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">);</span> <span class="c1">// 5
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// multiplication with `*` operator
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span> <span class="o">*</span> <span class="nx">y</span><span class="p">);</span> <span class="c1">// 6
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// division with `/` operator
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">y</span> <span class="o">/</span> <span class="nx">x</span><span class="p">);</span> <span class="c1">//1.5
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// modulo operator
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">y</span> <span class="o">%</span> <span class="nx">x</span><span class="p">);</span> <span class="c1">//1
</span></span></span></code></pre></div><p>You can use more than one operators in one go -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span> <span class="o">-</span> <span class="nx">y</span><span class="p">);</span> <span class="c1">//2
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span> <span class="o">*</span> <span class="nx">y</span><span class="p">);</span> <span class="c1">//11
</span></span></span></code></pre></div><p><a href="https://codepen.io/techformist/pen/WNremOG">See this Codepen for working examples.</a></p>
<p>See more arithmetic operators <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators">here</a>.</p>
<h3 id="comparison-operators">Comparison Operators</h3>
<p>Comparison operators help you to compare between two values.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">b</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">==</span> <span class="nx">b</span><span class="p">);</span> <span class="c1">// is `a` equal to `b` - false
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&lt;</span> <span class="nx">b</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&lt;=</span> <span class="nx">b</span><span class="p">);</span> <span class="c1">// is `a` less than or equal to `b` - true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&gt;</span> <span class="nx">b</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&gt;=</span> <span class="nx">b</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">!=</span> <span class="nx">b</span><span class="p">);</span> <span class="c1">// is `a` not equal to `b` - true
</span></span></span></code></pre></div><p>Comparison operators always return a boolean.</p>
<p>Common use cases for comparison operators is are in conditional statements that are used to execute specific code blocks.</p>
<p>A simple e.g.:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">==</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a and b are equal&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a and b are NOT equal&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The implicit type deductions in Javascript may not always be intuitive for people from other languages. For e.g. you can compare a <code>3</code> (number) with <code>&quot;3&quot;</code> (string), and the results will be &ldquo;equal&rdquo;.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">3</span> <span class="o">==</span> <span class="s2">&#34;3&#34;</span><span class="p">);</span> <span class="c1">// true
</span></span></span></code></pre></div><p>Javascript converts the types and keeps you happily chugging along. But, there can be places where you want to avoid this type of comparison.</p>
<p>For e.g.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="s2">&#34;1&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">x</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">.</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span> <span class="c1">// error since x is not a number and toFixed can only work on numbers
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>.. or in situations like this..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">result</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">result</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// check if you did not receive result
</span></span></span><span class="line"><span class="cl">  <span class="c1">// result is implicitly converted to boolean condition.
</span></span></span><span class="line"><span class="cl">  <span class="c1">// Since the number `0` is false, this condition evaluates to not(`false`) = `true`
</span></span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Did not receive result&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>We can use strict comparison operators to force Javascript to consider types as well as values.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">3</span> <span class="o">===</span> <span class="s2">&#34;3&#34;</span><span class="p">);</span> <span class="c1">// strictly equal. values and types should be equal - false
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">!==</span> <span class="nx">b</span><span class="p">);</span>
</span></span></code></pre></div><h3 id="logical-operators">Logical Operators</h3>
<p>So far we have seen one comparison being made at a time.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">==</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// false
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">);</span> <span class="c1">// true
</span></span></span></code></pre></div><p>Real-world problems can have more than one condition to check. What if you want to check if <code>a</code> is greater than <code>0</code> and also less than <code>5</code>? You can do that using logical operators.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">a</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">);</span> <span class="c1">// true. check if `a &gt; 0` and also `a &lt; 5`
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&gt;</span> <span class="mi">5</span> <span class="o">&amp;&amp;</span> <span class="nx">a</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">);</span> <span class="c1">// false
</span></span></span></code></pre></div><p><code>&amp;&amp;</code> represents the <code>AND</code> operator. It results in <code>true</code> only if <em>all expressions</em> used in <code>AND</code> expression are true.</p>
<p>Other logical operators :</p>
<ol>
<li><code>OR</code> - <code>||</code>: results in <code>true</code> if <em>any</em> value is <code>true</code></li>
<li><code>NOT</code> - <code>!</code>: unary operator. Just reverses the result - <code>true</code> to <code>false</code> or otherwise.</li>
</ol>
<p>You can mix and match logical operators and any other operators in an expression.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">a</span> <span class="o">&lt;</span> <span class="mi">10</span> <span class="o">&amp;&amp;</span> <span class="nx">a</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">// true
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="p">(</span><span class="nx">a</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="nx">a</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">));</span> <span class="c1">// false - a &lt; 1 AND a should be fully divisible by `2`
</span></span></span></code></pre></div><p>Consider one more example using simple conditional statements.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">color</span> <span class="o">=</span> <span class="s2">&#34;white&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">animal</span> <span class="o">=</span> <span class="s2">&#34;tiger&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">((</span><span class="nx">color</span> <span class="o">==</span> <span class="s2">&#34;white&#34;</span> <span class="o">&amp;&amp;</span> <span class="nx">animal</span> <span class="o">=</span> <span class="s2">&#34;tiger&#34;</span><span class="p">))</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;ok&#34;</span><span class="p">);</span> <span class="c1">// &#34;ok&#34;
</span></span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">((</span><span class="nx">color</span> <span class="o">==</span> <span class="s2">&#34;white&#34;</span> <span class="o">&amp;&amp;</span> <span class="nx">animal</span> <span class="o">=</span> <span class="s2">&#34;elephant&#34;</span><span class="p">))</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;whoa&#34;</span><span class="p">);</span> <span class="c1">// will not print
</span></span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">color</span> <span class="o">==</span> <span class="s2">&#34;white&#34;</span> <span class="o">&amp;&amp;</span> <span class="nx">animal</span> <span class="o">!=</span> <span class="s2">&#34;tiger&#34;</span> <span class="o">&amp;&amp;</span> <span class="nx">animal</span> <span class="o">!=</span> <span class="s2">&#34;elephant&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;white something&#34;</span><span class="p">);</span> <span class="c1">// will not print
</span></span></span></code></pre></div><p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators">Read up more on operators</a>.</p>
<h2 id="collections">Collections</h2>
<p>Collections are just bringing variables and values together in one group.</p>
<h3 id="arrays">Arrays</h3>
<p>The most common collection is an <code>array</code>. We can create arrays with same type of variables, constants, other arrays, or any objects.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// a simple number array
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">nums</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>
</span></span></code></pre></div><p>You can access any or all elements of an array.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">);</span> <span class="c1">// [1,2,3,4,5]
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// 1
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="c1">// 2
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">[</span><span class="mi">4</span><span class="p">]);</span> <span class="c1">// 5
</span></span></span></code></pre></div><p>An array can be -</p>
<ol>
<li>Artists in an album <code>const wow=[&quot;Kula Shaker&quot;, &quot;Deep Purple&quot;]</code></li>
<li>List of students in a class <code>const class = [&quot;Kent&quot;, &quot;Parker&quot;]</code></li>
<li>Or any collection, really. We keep related elements since we want to group things and process them with code.</li>
</ol>
<p>Below is an example of an array with seemingly unrelated stuff.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">mix1</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="s1">&#39;y&#39;</span><span class="p">]]]</span> <span class="c1">// array within an array
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">mix1</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// a
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">mix1</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span> <span class="c1">// [&#39;x&#39;, &#39;y&#39;]
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;array length = total number of elements in array = &#39;</span><span class="p">,</span> <span class="nx">mix1</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span> <span class="c1">// 3
</span></span></span></code></pre></div><p>We discussed methods and how they are applicable to specific objects. Arrays have their own special methods too.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">nums2</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums2</span><span class="p">);</span> <span class="c1">//[1,2,3,4,5,6]
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums2</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span> <span class="c1">// array length = 6
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">nums2</span> <span class="o">=</span> <span class="nx">nums2</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="mi">7</span><span class="p">);</span> <span class="c1">// add 7 to array - at the end
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums2</span><span class="p">);</span> <span class="c1">//[1,2,3,4,5,6,7]
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">nums2</span> <span class="o">=</span> <span class="nx">nums2</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> <span class="c1">// remove the last element of array
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums2</span><span class="p">);</span> <span class="c1">//[1,2,3,4,5,6]
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums2</span><span class="p">.</span><span class="nx">sort</span><span class="p">());</span> <span class="c1">//[1,2,3,4,5,6] - already sorted
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums2</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span> <span class="c1">//true. Does the array include `1`?
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums2</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span> <span class="c1">//1. Index of `2`. Array starts at zero and counts up
</span></span></span></code></pre></div><p>There are also <code>shift</code> and <code>unshift</code> methods that work similar to <code>pop</code> and <code>push</code> but do that at the beginning of the array.</p>
<p>Strings are nothing but arrays of characters. You could apply arrays-specific methods like <code>length</code> to strings as well.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">name</span> <span class="o">=</span> <span class="s2">&#34;Parker&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// P
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">name</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span> <span class="c1">// r
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">name</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span> <span class="c1">// 6
</span></span></span></code></pre></div><p>See this <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections">MDN page to read more on arrays</a>.</p>
<h3 id="objects">Objects</h3>
<p>An object is a collection of one or more key-value pairs called &ldquo;properties&rdquo;.</p>
<p>Example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">student</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Ram&#34;</span><span class="p">,</span> <span class="nx">age</span><span class="o">:</span> <span class="s2">&#34;9&#34;</span><span class="p">,</span> <span class="kr">class</span><span class="o">:</span> <span class="s2">&#34;4&#34;</span> <span class="p">};</span>
</span></span></code></pre></div><p>Here <code>name</code>, <code>age</code> and <code>class</code> are props of <code>student</code> object. Note that property name (the key) is unique.</p>
<p>Do you remember that we saw earlier that almost everything is an object? This was the &ldquo;object&rdquo; we were referring to all along. Every primitive, function or any other Javascript entity is an object and has its properties.</p>
<p>You can get an individual property value by -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;name: &#34;</span><span class="p">,</span> <span class="nx">student</span><span class="p">[</span><span class="s2">&#34;name&#34;</span><span class="p">]);</span> <span class="c1">// Ram
</span></span></span></code></pre></div><p>You would have seen by now that objects are similar to arrays in that they group stuff together. The keys are ordered in arrays, and they are not controlled by you. Objects enable you to have your own keys and use it too, but the order of key/value pairs is not maintained or guaranteed.</p>
<p>You can have collection of collections. For e.g. an array of objects can be declared with following code -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">students</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Ram&#34;</span><span class="p">,</span> <span class="nx">age</span><span class="o">:</span> <span class="s2">&#34;9&#34;</span><span class="p">,</span> <span class="kr">class</span><span class="o">:</span> <span class="s2">&#34;4&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Chris&#34;</span><span class="p">,</span> <span class="nx">age</span><span class="o">:</span> <span class="s2">&#34;9&#34;</span><span class="p">,</span> <span class="kr">class</span><span class="o">:</span> <span class="s2">&#34;4&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Adi&#34;</span><span class="p">,</span> <span class="nx">age</span><span class="o">:</span> <span class="s2">&#34;8&#34;</span><span class="p">,</span> <span class="kr">class</span><span class="o">:</span> <span class="s2">&#34;3&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">];</span>
</span></span></code></pre></div><p>How do you refer individual student? Follow the pattern followed for an array and for an object.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">students</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// { name: &#34;Ram&#34;, age: &#34;9&#34;, class: &#34;4&#34; }
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">students</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&#34;name&#34;</span><span class="p">]);</span> <span class="c1">// Ram
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">students</span><span class="p">[</span><span class="nx">students</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="s2">&#34;class&#34;</span><span class="p">]);</span> <span class="c1">// 3
</span></span></span></code></pre></div><p><a href="https://codepen.io/techformist/pen/LYGVbON">Examples for collections are in this Codepen</a>.</p>
<p>There are other types of collections too - namely <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Keyed_collections">sets and maps</a>. But, we will not go into that right now.</p>
<h2 id="conditional-statements">Conditional Statements</h2>
<p>A conditional statement enables execution of different code based on given set of conditions.</p>
<h3 id="if-else"><code>if-else</code></h3>
<p>We have already seen a simple <code>if</code> example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is one&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><code>console.log(&quot;a is one&quot;);</code> is executed only if <code>a</code> == 1.</p>
<p>You can pair <code>if</code> with <code>else</code>, and also use more than one <code>if</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is one&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is zero&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is neither one nor zero&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><ul>
<li>Execute first block of code if <code>a</code> is <code>1</code></li>
<li>Execute second block of code if <code>a</code> is <code>0</code>.</li>
<li>Execute third block of code for all other conditions</li>
</ul>
<p>Only one block is executed at any time with an <code>if/else-if/else</code> block.</p>
<p>You can also &ldquo;nest&rdquo; <code>if</code> statements.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// will be executed only if a &gt; 0
</span></span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is one&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">else</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is something else&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// a &lt;= 0
</span></span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is NOT greater than zero&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Did you also observe that I left out <code>{}</code> for <code>else</code>. This is perfectly valid if you have only one statement in the <code>if</code> or <code>else</code> blocks.</p>
<p>Consider another example where you want to provide free admittance to kids and seniors &gt; 70 years.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">age</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">cost</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">hasPass</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">age</span> <span class="o">&lt;=</span> <span class="mi">8</span><span class="p">)</span> <span class="nx">cost</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">age</span> <span class="o">&gt;</span> <span class="mi">8</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="nx">age</span> <span class="o">&lt;</span> <span class="mi">70</span><span class="p">)</span> <span class="nx">cost</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">hasPass</span> <span class="o">==</span> <span class="kc">true</span><span class="p">)</span> <span class="nx">cost</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">age</span> <span class="o">&gt;=</span> <span class="mi">70</span><span class="p">)</span> <span class="nx">cost</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span> <span class="nx">cost</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span></span></code></pre></div><p>Since we already know the logical operators can be combined, we can simplify it to -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">age</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">cost</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">hasPass</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">age</span> <span class="o">&lt;=</span> <span class="mi">8</span> <span class="o">||</span> <span class="nx">age</span> <span class="o">&gt;=</span> <span class="mi">70</span> <span class="o">||</span> <span class="nx">hasPass</span><span class="p">)</span> <span class="nx">cost</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// using just `hasPass` is equivalent to a boolean expression - `hasPass == true`
</span></span></span><span class="line"><span class="cl"><span class="k">else</span> <span class="nx">cost</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span></span></code></pre></div><h3 id="switch"><code>switch</code></h3>
<p>You can use <code>switch</code> to provide a readable conditional block. It functions similar to an <code>if</code>/<code>else if</code> block.</p>
<p>We can rewrite the earlier <code>if</code> example as -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">switch</span> <span class="p">(</span><span class="nx">a</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// compare `a` to values provided in `case`
</span></span></span><span class="line"><span class="cl">  <span class="k">case</span> <span class="mi">1</span><span class="o">:</span> <span class="c1">// if a == 1
</span></span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is one&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">case</span> <span class="mi">0</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is zero&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is neither one nor zero&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><code>default</code> block is executed if none of the <code>case</code> statements get satisfied, and hence is at the very end of <code>switch</code>.</p>
<p>You also observe <code>break</code> in all <code>case</code> blocks. This is by design. If you don&rsquo;t use <code>break</code> the control starts going through the next <code>case</code> block and executes the block if it satisfies the condition.</p>
<p>For e.g..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">switch</span> <span class="p">(</span><span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// compare `true` to case variables or expressions
</span></span></span><span class="line"><span class="cl">  <span class="k">case</span> <span class="nx">a</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">:</span> <span class="c1">// if a &gt; 0
</span></span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is greater than zero&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">case</span> <span class="nx">a</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is less than 10&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;a is something else&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// a is greater than zero
</span></span></span><span class="line"><span class="cl"><span class="c1">// a is less than 10
</span></span></span></code></pre></div><p>A lot of people argue that using <code>switch</code> is more readable than a series of <code>if</code>/<code>else if</code> statements, and faster to execute. I tend to agree with them on the former.</p>
<h2 id="loops">Loops</h2>
<p>Loops enable us to repeat &ldquo;stuff&rdquo;.</p>
<p>So far we have seen trying to add numbers, printing messages and doing other great things. But, what if we have 10s or 100s of numbers to add, print dozens of messages, or do greater things?</p>
<p>Enter loops. There are different types of loops available in Javascript.</p>
<h3 id="while"><code>while</code></h3>
<p>A <code>while</code> executes a block of code until a given condition is satisfied.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="p">(</span><span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;i am&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">i</span> <span class="o">=</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;i am&#34; 1
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;i am&#34; 2
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;i am&#34; 3
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;i am&#34; 4
</span></span></span></code></pre></div><p>In the loop -</p>
<ol>
<li>create a variable called <code>i</code>, initialise it to <code>0</code></li>
<li>start <code>while</code> loop to repeat code within brackets until <code>i</code> is less than <code>5</code></li>
<li>within the loop, print a message and increment <code>i</code> (else the loop will run indefinitely)</li>
</ol>
<h3 id="do-while"><code>do-while</code></h3>
<p>There is an alternative to <code>while</code> to execute the code block at least once and repeat till the given condition is not satisfied.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">do</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;i am&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">i</span> <span class="o">=</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;i am&#34; 1
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;i am&#34; 2
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;i am&#34; 3
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;i am&#34; 4
</span></span></span></code></pre></div><p>While the above code has similar output as the earlier <code>while</code> loop, the following block of code is repeated once and only once (even though the <code>while</code> loop condition was not satisfied).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">j</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">do</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;i am do while&#34;</span><span class="p">,</span> <span class="nx">j</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">j</span> <span class="o">=</span> <span class="nx">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="nx">j</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;i am do while&#34; 10
</span></span></span></code></pre></div><h3 id="for"><code>for</code></h3>
<p>A <code>for</code> loop allows limited execution of a block of code until a specific count is reached.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="nx">i</span> <span class="o">=</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// hello 0
</span></span></span><span class="line"><span class="cl"><span class="c1">// hello 1
</span></span></span><span class="line"><span class="cl"><span class="c1">// hello 2
</span></span></span><span class="line"><span class="cl"><span class="c1">// hello 3
</span></span></span><span class="line"><span class="cl"><span class="c1">// hello 4
</span></span></span></code></pre></div><p>While the <code>for</code> loop does a similar job as a <code>while</code> loop, it functions a tad differently.</p>
<ol>
<li>
<p>initiate a <code>for</code> loop</p>
<ul>
<li>a variable and a value from where we need to start the loop. We declared <code>i</code> in <code>for</code> while initiating loop itself, but it can be declared earlier in the code as well. <code>i</code> was initiated to <code>0</code></li>
<li>specify when to stop. Thiscify the condition to be true for the loop to continue. <code>i &lt; 5</code> specified that the loop code should execute until <code>i</code> was less than <code>5</code></li>
<li>what should we do after each iteration of loop. Here we increment <code>i</code>. We have used a unary operator <code>i++</code> instead of writing <code>i=i+1</code>. You can count up or count down with any number (for e.g. <code>i=i+10</code> will increment <code>i</code> by <code>10</code> after each iteration)</li>
</ul>
</li>
<li>
<p><code>for</code> loop will also feature a block of code that needs to be executed until the specified condition holds <code>true</code>. We just print a message</p>
</li>
</ol>
<h3 id="loops-for-collections">Loops for Collections</h3>
<p>We have seen about collections earlier. We can combine that knowledge with loops to iterate through every element in a collection.</p>
<p><code>for</code> is quite a common sight to work with arrays.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">colors</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;green&#34;</span><span class="p">,</span> <span class="s2">&#34;red&#34;</span><span class="p">,</span> <span class="s2">&#34;blue&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">colors</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">colors</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span> <span class="c1">// get the element at position i
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// green
</span></span></span><span class="line"><span class="cl"><span class="c1">// red
</span></span></span><span class="line"><span class="cl"><span class="c1">// blue
</span></span></span></code></pre></div><p>There is also a variation of <code>for</code> loop to iterate through arrays - <code>for</code>/<code>of</code> loop.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">color</span> <span class="k">of</span> <span class="nx">colors</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">color</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>One of the popular ways of iterating objects is by using a variation of <code>for</code> loop - <code>for</code> / <code>in</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">student1</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;Ram&#34;</span><span class="p">,</span> <span class="nx">age</span><span class="o">:</span> <span class="s2">&#34;9&#34;</span><span class="p">,</span> <span class="kr">class</span><span class="o">:</span> <span class="s2">&#34;4&#34;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">property</span> <span class="k">in</span> <span class="nx">student1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`</span><span class="si">${</span><span class="nx">property</span><span class="si">}</span><span class="sb">: </span><span class="si">${</span><span class="nx">student1</span><span class="p">[</span><span class="nx">property</span><span class="p">]</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// output
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;name: Ram&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;age: 9&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1">// &#34;class: 4&#34;
</span></span></span></code></pre></div><h2 id="functions">Functions</h2>
<p>Function is a block of code that performs a task. A function allows us to write reusable code.</p>
<p>Take our earlier example of getting a sum of two numbers.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">sum</span> <span class="o">=</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;sum: &#34;</span><span class="p">,</span> <span class="nx">sum</span><span class="p">);</span>
</span></span></code></pre></div><p>Now, what happens if you also want the multiplication result?</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">b</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">sum</span> <span class="o">=</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">sum</span> <span class="o">=</span> <span class="nx">a</span> <span class="o">*</span> <span class="nx">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;sum: &#34;</span><span class="p">,</span> <span class="nx">sum</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;product: &#34;</span><span class="p">,</span> <span class="nx">product</span><span class="p">);</span>
</span></span></code></pre></div><p>You could go on and on with the calculations and make your code hard to understand. Or, you could keep it simple by organizing code into functions.</p>
<p>Let us rewrite the code using functions to get sum, get product or do something else.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">b</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">));</span> <span class="c1">// 5
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">product</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">));</span> <span class="c1">// 6
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">sum</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">product</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">*</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The block of code starting with <code>function</code> keyword is called the function definition. You define a function like so -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">sum</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>A function can have zero or more &ldquo;arguments&rdquo; - these are values passed to the function (like <code>x</code>, <code>y</code>). A function may &ldquo;return&rdquo; a value or just execute some logic and not return anything.</p>
<p>You can then call this function from anywhere (provided the function is accessible from that place) -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">total</span> <span class="o">=</span> <span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
</span></span></code></pre></div><p>While the function existed all this time, we execute the code only when we call that function. The function will take the arguments, total them and return the <code>sum</code>. We store the returned value in <code>total</code>.</p>
<p>You also see that we have used <code>x</code> and <code>y</code> in more than one function. The variables passed as arguments or those created within the function are available only in that function. There will be a larger discussion about &ldquo;scopes&rdquo; or when you are able to access a variable within functions soon.</p>
<h2 id="methods">Methods</h2>
<p>Methods are just functions that belong to a &ldquo;object&rdquo;. Javascript treats (almost) everything (variables, constants, functions, etc.) as an object. So, it follows that there are specific methods available against objects.</p>
<p>Consider this example to change case of a string.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">message</span> <span class="o">=</span> <span class="s2">&#34;hello world&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">message</span><span class="p">.</span><span class="nx">toUpperCase</span><span class="p">());</span> <span class="c1">// HELLO WORLD
</span></span></span></code></pre></div><p>Similarly, we can have a rounding-off method to display a formatted number.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">numPrice</span> <span class="o">=</span> <span class="mf">123.34567</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;numPrice:&#34;</span><span class="p">,</span> <span class="nx">numPrice</span><span class="p">);</span> <span class="c1">// 123.34567
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;Converted to string + rounded:&#34;</span><span class="p">,</span> <span class="nx">numPrice</span><span class="p">.</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span> <span class="c1">// 123.35
</span></span></span></code></pre></div><p>Note that the method does not change the original value unless explicitly instructed to do so.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">announce</span> <span class="o">=</span> <span class="s2">&#34;the name is kent&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;announce: &#34;</span><span class="p">,</span> <span class="nx">announce</span><span class="p">);</span> <span class="c1">// the name is kent
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">announce</span> <span class="o">=</span> <span class="nx">announce</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s2">&#34;kent&#34;</span><span class="p">,</span> <span class="s2">&#34;parker&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;announce: &#34;</span><span class="p">,</span> <span class="nx">announce</span><span class="p">);</span> <span class="c1">// the name is parker
</span></span></span></code></pre></div><p>Examples for functions and methods are available <a href="https://codepen.io/pen/?editors=1111">in this Codepen</a>.</p>
<p>See complete reference for <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#Instance_methods">string methods</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number#Instance_methods">number methods</a> and more on MDN.</p>
<h2 id="graduating-to-next-level-set-up">Graduating to Next Level: Set up</h2>
<p>So far we have executed projects by using online editors and had fun doing that. But, real-world projects can get complex with a lot of files, need a lot of space, or you may simply want to work on projects offline without typing in the browser.</p>
<p>We code Javascript using -</p>
<ol>
<li>Code editors - we live by <a href="https://code.visualstudio.com/">VS Code</a></li>
<li><a href="https://nodejs.org/en/">NodeJS</a> - executes Javascript locally on your computer and makes it easier to debug. Further, tools are built on top of Node to build and deploy projects over web, or for various devices</li>
</ol>
<p>Download both tools and install them on your computer by following the instructions on the respective websites.</p>
<p>Create a new folder on your computer and open that folder in VSCode (<code>File</code> &gt; <code>Open Folder</code>).</p>
<p>You can now start creating Javascript files (with suffix <code>.js</code>). Right click on the folder name in the left pane, click <code>New File</code> and name the file as <code>hello.js</code>. Enter this line in the file -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p>You can execute this Javascript using Node. Go to <code>Terminal</code> &gt; <code>New Terminal</code> in VSCode to open a new terminal.</p>
<p>Type -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">node hello.js
</span></span></code></pre></div><p>The command outputs <code>hello</code>.</p>
<p>Subsequent examples assume that you are using Node. Each time -</p>
<ul>
<li>You will create a file (or change existing file)</li>
<li>Execute Javascript with <code>node &lt;file_name&gt;</code> in Terminal</li>
<li>See result in Terminal</li>
</ul>
<p>Most of these examples are simple enough to work on Codepen too - so you can continue that. But, as you get more into Node you will find it faster and easier to type stuff local to your computer and execute them.</p>
<p>If you are using a browser, the browser itself executes the Javascript and there is no Node involved. Node facilitates execution of Javascript on your computer without a browser. There are other ways to execute Javascript on your computer - including Deno but we will use Node for now.</p>
<p>Now, you can just created a Javascript file - say &ldquo;hello.js&rdquo;..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;hello world&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p>Open a command prompt (within VSCode or otherwise), go to directory of the file, and execute it to see the output.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">node hello.js
</span></span></code></pre></div><p>Now, you can create and execute any Javascript!</p>
<h2 id="projects">Projects</h2>
<p>You can create these projects using Codepen or on your local computer.</p>
<h3 id="print-numbers-from-10-to-20">Print numbers from 10 to 20</h3>
<p>As the title says - just use <code>console.log</code> to print numbers.</p>
<h3 id="print-numbers-between-100-to-200-that-are-fully-divisible-by-7">Print numbers between 100 to 200 that are fully divisible by 7.</h3>
<p>Explore options to get numbers in multiples of 7.</p>
<ul>
<li>Get the first number after a given number (100 in our case) that is fully divisible by 7. Print the numbers by adding 7 in a loop until the max number is reached (200 in our case)</li>
<li>Use modulo operator to get the first number divisible by 7 - then use logic similar to above</li>
</ul>
<h3 id="calculate-sum-of-numbers-between-10-and-25">Calculate sum of numbers between 10 and 25</h3>
<p>Calculate sum of numbers - 10 + 11 + 12 + 13 + &hellip; + 25</p>
<h3 id="find-average-and-maximum-with-a-given-array">Find average and maximum with a given array</h3>
<p>Assume the input array to be <code>[10, 12, 15, 17, 5, 19]</code>.</p>
<ul>
<li>Calculate sum of all numbers</li>
<li>Calculate average (sum of all numbers divided by the count of numbers)</li>
</ul>
<h3 id="reverse-numbers">Reverse numbers</h3>
<p>Assume the input array to be <code>[10, 12, 15, 17, 5, 19]</code>.</p>
<ul>
<li>Reverse the array - <code>[19, 5, 17...,10]</code></li>
<li>Sort array in descending order</li>
</ul>
<h3 id="array-comparison">Array comparison</h3>
<p>Take two arrays as input.</p>
<ul>
<li>assume <code>[1,5,7,11,23,19]</code>, <code>[8,11,23,1,21,25]</code></li>
<li>output numbers that are in one array or the other, but not both</li>
<li>output numbers that are in both arrays</li>
</ul>
<h3 id="create-a-palindrome-checker">Create a palindrome checker</h3>
<p>Create a palindrome checker and output whether a given word is a palindrome.</p>
<ol>
<li>Method will take a valid string input</li>
<li>Check palindrome</li>
<li>Return <code>true</code> or <code>false</code></li>
</ol>
<h3 id="create-a-rot13-encryption-encoder-and-decoder">Create a ROT13 encryption encoder and decoder</h3>
<p>ROT13 replaces a letter with the letter 13 letters after it in the alphabet. See this (example](<a href="https://rot13.com/)">https://rot13.com/)</a>.</p>
<ul>
<li>Accept an input string and encrypt with ROT13 encryption</li>
<li>Decode a string using similar algorithm</li>
</ul>
<h3 id="object-to-array-printer">Object to array printer</h3>
<p>Given an object -</p>
<ul>
<li>print in the format [<code>key1:val1</code>, <code>key2:val2</code>&hellip;] for all keys</li>
<li>print all keys and all values in two separate arrays</li>
</ul>
<h3 id="create-a-simple-calculator">Create a simple calculator</h3>
<p>This uses both HTML and Javascript. Skip this project if you are not familiar with HTML.</p>
<ol>
<li>Enable user to select numbers, brackets and arithmetic operators - use HTML</li>
<li>Optionally use a simple to use library like <a href="https://andybrewer.github.io/mvp/">MVP.css</a>. Just include the stylesheet in your HTML - you don&rsquo;t need to learn CSS</li>
<li>Display results</li>
<li>User should be able to continue calculations with the result or clear it to perform new calculations</li>
</ol>
<h2 id="next-steps">Next Steps</h2>
<p>So far you have seen the basics of Javascript -</p>
<ul>
<li>get to know how to start writing Javascript</li>
<li>variables and types</li>
<li>conditional statements</li>
<li>loops</li>
</ul>
<p>We have not coded frontend or written any apps, but we will get there. A few resources to help you on your journey -</p>
<ul>
<li><a href="https://www.freecodecamp.org/learn/">FreeCodeCamp Learn</a></li>
<li><a href="https://www.theodinproject.com/tracks/full-stack-javascript">Full stack Javascript on The Odin Project</a></li>
<li><a href="https://eloquentjavascript.net/">Eloquent Javascript - Free Book</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>A quick start on ASP.NET Core Razor Pages</title>
      <link>https://techformist.com/asp-net-razor-pages-quick-start/</link>
      <pubDate>Wed, 05 Feb 2020 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/asp-net-razor-pages-quick-start/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a quick introduction to Razor pages in ASP.NET core, and an opinionated way to quickly start building applications using Razor pages. And yes, there is a case for using Razor pages even in 2020.&lt;/p&gt;
&lt;h3 id=&#34;so-aspnet&#34;&gt;So.. ASP.net?&lt;/h3&gt;
&lt;p&gt;Yes, indeed. I have had a love-hate relationship with ASP.NET through years. I am way less productive using ASP.net but cannot ignore the speed that a dotnet web server provides. Take into account the super debugging capabilities/tooling and the sizeable market that keeps providing projects on the platform, we surely have more than a winner in ASP.NET.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Here&rsquo;s a quick introduction to Razor pages in ASP.NET core, and an opinionated way to quickly start building applications using Razor pages. And yes, there is a case for using Razor pages even in 2020.</p>
<h3 id="so-aspnet">So.. ASP.net?</h3>
<p>Yes, indeed. I have had a love-hate relationship with ASP.NET through years. I am way less productive using ASP.net but cannot ignore the speed that a dotnet web server provides. Take into account the super debugging capabilities/tooling and the sizeable market that keeps providing projects on the platform, we surely have more than a winner in ASP.NET.</p>
<p>And oh, it immensely helps that innovations like Blazor are exciting options to make web development arguably more productive and easier.</p>
<h2 id="why-yet-another-introduction">Why yet another introduction?</h2>
<p>There are a million other introductions to ASP.NET platform. Microsoft&rsquo;s own documentation and guides are immensely helpful for beginners at all stages. But, what I love to see is a quick way to create an app (or two) and make new developers comfortable with the ecosystem. At least that&rsquo;s how I learn stuff and I found some of the tutorials I glanced through to be either too detailed, or at a superficially high level.</p>
<p>This introduction is more for developers who use a different language for web development. It is not quite intended for absolute beginners, but anyone should be able to follow along.</p>
<h2 id="firing-off-with-aspnet">Firing off with ASP.net</h2>
<p>There are two main ways to get started on development using ASP.net platform.</p>
<ol>
<li>Use Visual Studio: proven way that has been forever</li>
<li>Use Visual Studio Code or your favourite editor and dotnet core CLI</li>
</ol>
<p>Both ways deserve all the love they can get. I prefer VSCode, but will use Visual Studio in this tutorial because - why not. Going forward I will be basing discussions primarily on Visual Studio 2019 and dotnet Core 3.1.</p>
<p>Installation is somewhat boring and works on expected lines.</p>
<ol>
<li>Download Visual Studio from <a href="https://visualstudio.microsoft.com/">https://visualstudio.microsoft.com/</a></li>
<li>Click, click, click to install</li>
</ol>
<p>Visual Studio comes with dotnet SDK, and you should be all set by now. If you decide to use VSCode, just install the dotnet SDK separately. You should then be able to use all the command line goodness on the best code editor ever(tm).</p>
<p>See the <a href="https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/install">install docs</a> if you are stuck. (Stuck during install, really?)</p>
<p>Once everything&rsquo;s ready, just create a new project.</p>
<p><img loading="lazy" src="/misc/dotnet-razor-pages-new-project.jpg" type="" alt="dotnet-razor-pages-new-project"  /></p>
<p>Select &ldquo;ASP.NET Core Web Application&rdquo;. Hit next and name your project. You will get another screen where you can select an &ldquo;Web Application&rdquo; template. This option will instruct Visual Studio to scaffold a few things when the project is created.</p>
<h2 id="the-structure">The Structure</h2>
<p>As any modern web development stack, the files generated can be overwhelming at the beginning. We can break the structure down to basics.</p>
<p>A typical ASP.net project consists of one solution (which is a container for projects), and one or more projects. It will have at least one project (of course), anything else is optional and enables you to build stuff incrementally.</p>
<p><img loading="lazy" src="/misc/project-structure-visual-studio-asp-net-core-razor.jpg" type="" alt="project-structure-visual-studio-asp-net-core-razor"  /></p>
<h3 id="beginning-of-everything-startupcs-and-programcs">Beginning of everything: <code>Startup.cs</code> and <code>Program.cs</code></h3>
<p>These are the two files that bootstrap our app and give it ASP powers. When our app starts, the runtime calls <code>Main</code> method defined in <code>Program.cs</code>, which configures itself and starts running as an ASP app.</p>
<p>If you were so far wondering how our humble app came to acquire ASP powers, <code>IHostBuilder</code> is to blame. That interface provides our function <code>CreateHostBuilder</code> abilities to assume the powers of ASP.net, configure itself and start running - all in a simple one-line statement..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cs" data-lang="cs"><span class="line"><span class="cl"><span class="n">CreateHostBuilder</span><span class="p">(</span><span class="n">args</span><span class="p">).</span><span class="n">Build</span><span class="p">().</span><span class="n">Run</span><span class="p">();</span>
</span></span></code></pre></div><p>More code in <code>Program.cs</code> uses <a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions">C# lambdas</a> and <a href="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1">Dependency Injection</a> (&ldquo;DI&rdquo;) to apply configuration parameters and methods defined in <code>Startup.cs</code> to our application.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cs" data-lang="cs"><span class="line"><span class="cl"><span class="kd">public</span> <span class="kd">static</span> <span class="n">IHostBuilder</span> <span class="n">CreateHostBuilder</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> <span class="p">=&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="n">Host</span><span class="p">.</span><span class="n">CreateDefaultBuilder</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">.</span><span class="n">ConfigureWebHostDefaults</span><span class="p">(</span><span class="n">webBuilder</span> <span class="p">=&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">webBuilder</span><span class="p">.</span><span class="n">UseStartup</span><span class="p">&lt;</span><span class="n">Startup</span><span class="p">&gt;();</span>
</span></span><span class="line"><span class="cl">            <span class="p">});</span>
</span></span></code></pre></div><p>Further, <code>ConfigureServices</code> in <code>Startup.cs</code> has a specific block that enables Razor pages in your app.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cs" data-lang="cs"><span class="line"><span class="cl"><span class="kd">public</span> <span class="k">void</span> <span class="n">ConfigureServices</span><span class="p">(</span><span class="n">IServiceCollection</span> <span class="n">services</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">services</span><span class="p">.</span><span class="n">AddRazorPages</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The <code>Configure</code> method in <code>Startup.cs</code> enables a pipeline to include middleware, which in-turn enables various features for your app - all without needing you to code them in.</p>
<p>For e.g. -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cs" data-lang="cs"><span class="line"><span class="cl"><span class="kd">public</span> <span class="k">void</span> <span class="n">Configure</span><span class="p">(</span><span class="n">IApplicationBuilder</span> <span class="n">app</span><span class="p">,</span> <span class="n">IWebHostEnvironment</span> <span class="n">env</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// ...</span>
</span></span><span class="line"><span class="cl">    <span class="n">app</span><span class="p">.</span><span class="n">UseHttpsRedirection</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// ...</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>&hellip; tells runtime to redirect HTTP requests to HTTPS.</p>
<p>We will deal with lambda functions, DI etc. in more detail some other time. For now, we will move on and find out how we can quickly create our app on ASP.net.</p>
<h3 id="before-we-dig-in-settings-and-launchsettingsjson">Before we dig-in: settings and <code>launchSettings.json</code></h3>
<p>We have created a web application that runs as a command line app. The server is just serving content defined in web stuff like HTML/JS/CSS etc and in Razor pages, but does not render UI on its own.</p>
<p>Configuration parameters for our app is defined in <code>launchSettings.json</code>.</p>
<p>You can see the values defined in settings file in a nice user interface - right-click on the project (not the solution) in the right-hand-side bar, and select properties. Any change in one place is reflected in the other - just sayin'.</p>
<p>You may also notice the word &ldquo;development&rdquo; in the configuration file. We can provide parameters for any number of environments including development, and the start-up logic figures out the settings to apply. Further, secrets can be managed quite efficiently and made accessible to those who &ldquo;need to know&rdquo;. This is super helpful as you might imagine.</p>
<p>By default, the app uses IISExpress but there are options to use Kestrel, which is a light-weight (&amp; a more modern) server by Microsoft. You will see these configuration options selected in the Toolbar as well. Typically, I prefer Kestrel since it is fast, and I end up hosting dotnet on Linux (where IIS is not available).</p>
<h3 id="the-client-facing-wwwroot">The &lsquo;client-facing&rsquo; <code>wwwroot</code></h3>
<p>All the client-facing assets are stored in the <code>www</code> folder. This includes CSS, JS (custom and any libraries), static HTML, and anything else that finds its way to the browser.</p>
<p>Right off the bat, you see a sample CSS and JS, bootstrap and JQuery in the scaffolded files. Any and all of this can be changed or replaced. For e.g. you can replace Bootstrap with Bulma and chug along a different path.</p>
<h3 id="pages-folder"><code>Pages</code> folder</h3>
<p>Most of the action takes place here. <code>Pages</code> is where you place razor pages created using C#. The pages in C# get converted to something that the browser can understand by ASP.NET – we will see way more of pages in a few moments. Razor pages have the extension &lsquo;cshtml&rsquo; files</p>
<p>You also see a <code>Shared</code> folder and a bunch of files starting with <code>_</code>. Shared folder is used to contain assets shared across the project, and the <code>_</code> is a convention to create something called a &lsquo;partial&rsquo;. A partial is not a &lsquo;complete&rsquo; page in itself, but comes together with other partials or pages to form complete pages.</p>
<p><code>Layout.cshtml</code> is an example of a partial. In this file we have the header (which forms the header in the pages using this layout), a container (which will contain data), and the footer. The file also has references to script and HTML.</p>
<p>Of course, you can use different layouts, or decide not to use layouts at all – but building pages like this will make the entire process easy to build and to maintain.</p>
<p>In other notes, take a look at -</p>
<ul>
<li><code>_ViewImports.cshtml</code>: enables tag helpers globally</li>
<li><code>_ViewStart.cshtml</code>: base/master page</li>
</ul>
<p>Error, Index and Privacy pages are the actual Razor pages. You will create something on these lines to for adding more pages to your app.</p>
<p>Expand <code>Index.cshtml</code> page to find a file called <code>Index.cshtml.cs</code>. This file has the C# code to go along with the mark-up page. You can refer to the variables, methods, etc. from this c# page in the mark-up <code>cshtml</code> page. This arrangement is akin to mark-up + code arrangement in any Vue/React/Svelte application. In Blazor, you can have mark-up + code in same or different files - but that is for a different day.</p>
<p>This structure is different from a typical MVC model that touts a distinct controller, model and view layer. These functions are present in the Razor page app, but not fashioned in MVC style.</p>
<h2 id="more-about-the-internals-and-workings-of-an-aspnet-app">More about the internals and workings of an ASP.net app</h2>
<p>We are now masters of the structure of ASP.net core razor page project, and it is time to move on and see how everything comes together.</p>
<p>If you&rsquo;re serious about your trade, you will skip this section altogether. The terms here just help you speak the same language - you will probably figure this out by yourself while building the actual app.</p>
<h3 id="routing">Routing</h3>
<p>The <code>Pages</code> folder takes care of routing in our application. The files in the folder represent the URLs served by your application.</p>
<p>Let&rsquo;s see how..</p>
<ul>
<li><code>Privacy.cshtml</code> is a file in the <code>Pages</code> folder</li>
<li><code>baseurl.com/privacy</code> will request the page named &lsquo;privacy.cshtml&rsquo; in the folder. ASP.net serves the HTML generated from the razor page.</li>
<li>Any sub-folder will also get included in the path. For e.g. a <code>blog/Hello.cshtml</code> is rendered on <code>baseurl.com/blog/Hello</code></li>
<li>If the requested page does not exist, a &lsquo;page cannot be found&rsquo; error is displayed by default. You can configure the application to redirect requests to any other page (e.g. <code>index</code>) if the page cannot be located</li>
</ul>
<p>You can override the default routing using the <code>@Page</code> tag.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cs" data-lang="cs"><span class="line"><span class="cl"><span class="n">@page</span> <span class="s">&#34;/privacy1&#34;</span>
</span></span></code></pre></div><p>.. will enable the link to <code>baseurl.com/privacy1</code> and the previously used <code>/privacy</code> page disappears into oblivion.</p>
<h2 id="start-tinkering">Start Tinkering</h2>
<p>Run your app by hitting <code>Ctrl + F5</code>. Visual Studio opens the browser (or allows you to configure browser) and serves the application. You can see the starter page and navigate through the links provided in the scaffolded application.</p>
<p>You will see that any changes will require you to build/restart app. We can avoid that by executing our app in watch mode..</p>
<pre tabindex="0"><code>cd &lt;project-folder&gt;
dotnet run watch
</code></pre>]]></content:encoded>
    </item>
    
    <item>
      <title>Reusable debounce function for Vue</title>
      <link>https://techformist.com/reusable-debounce-function-vue/</link>
      <pubDate>Sun, 20 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/reusable-debounce-function-vue/</guid>
      <description>&lt;p&gt;Debounce operations in Vue using this 10 line script. Avoid loadash and friends.&lt;/p&gt;
&lt;h3 id=&#34;what-is-debounce&#34;&gt;What is debounce?&lt;/h3&gt;
&lt;p&gt;Delay and throttle operations to wait and collect user input before doing something with the input. The &amp;ldquo;something&amp;rdquo; can be updating another field, doing an API call, or starting a timer to self-destruct.&lt;/p&gt;
&lt;h3 id=&#34;did-you-not-debounce-earlier&#34;&gt;Did you not debounce earlier?&lt;/h3&gt;
&lt;p&gt;Yes, I did.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://techformist.com/reusable-debounce-function-javascript/&#34;&gt;reusable debounce function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://techformist.com/allow-function-call-once-javascript/&#34;&gt;strange throttling effect to allow function call only once&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://techformist.com/generators-javascript/&#34;&gt;awkward debounce using generators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But, not in Vue.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Debounce operations in Vue using this 10 line script. Avoid loadash and friends.</p>
<h3 id="what-is-debounce">What is debounce?</h3>
<p>Delay and throttle operations to wait and collect user input before doing something with the input. The &ldquo;something&rdquo; can be updating another field, doing an API call, or starting a timer to self-destruct.</p>
<h3 id="did-you-not-debounce-earlier">Did you not debounce earlier?</h3>
<p>Yes, I did.</p>
<ul>
<li><a href="/reusable-debounce-function-javascript/">reusable debounce function</a></li>
<li><a href="/allow-function-call-once-javascript/">strange throttling effect to allow function call only once</a></li>
<li><a href="/generators-javascript/">awkward debounce using generators</a></li>
</ul>
<p>But, not in Vue.</p>
<p>I may have 365 articles on the blog, but I never forget. [don&rsquo;t look back, and don&rsquo;t make faces at the computer].</p>
<p>Let&rsquo;s reuse the reusable debounce function to make something in Vue.</p>
<h3 id="use-case">Use case</h3>
<p>We have a registration screen that has a user id, which is unique to the application. User should be able to see if an id is taken at the time of typing the id. Nothing fancy - standard web application.</p>
<h3 id="get-going-with-global-debounce-function-in-vue">Get going with global debounce function in Vue</h3>
<p>The mixin is globally accessible, but not &ldquo;truly&rdquo; global. We will try to not occupy the global space - we don&rsquo;t expect every other field to be debounced.</p>
<h4 id="create-a-mixin">Create a mixin</h4>
<p>A Vue mixin allows us to incorporate parts that can be reused across components. Mixins allow us to selectively use methods, directives etc. in our components. If needed we could go full-steam and register a mixin globally as well, but we will not do that today.</p>
<p>We will use our debounce function in a mixin so that we can just call the darn thing from wherever.</p>
<p>PS: We can also create a Vue plugin to promote reusability. But, as Plato once said - &ldquo;why a plugin when there&rsquo;s a mixin&rdquo;.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// ./mixins/PgtUtilMix.js
</span></span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">methods</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">pgtDebounce</span><span class="p">(</span><span class="nx">func</span><span class="p">,</span> <span class="nx">delay</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="kd">let</span> <span class="nx">debounceTimer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;debouncing call..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">context</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">args</span> <span class="o">=</span> <span class="nx">arguments</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">clearTimeout</span><span class="p">(</span><span class="nx">debounceTimer</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nx">debounceTimer</span> <span class="o">=</span> <span class="nx">setTimeout</span><span class="p">(()</span> <span class="p">=&gt;</span> <span class="nx">func</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">context</span><span class="p">,</span> <span class="nx">args</span><span class="p">),</span> <span class="nx">delay</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;..done&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>You are now free to use the method from your components.</p>
<h4 id="mix-the-mixin">Mix the mixin</h4>
<p>Create a registration form in a view aptly called <code>Register.vue</code>. The below example uses Vuetify, but style libraries do not matter.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- ./Views/Register.vue --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-container</span> <span class="na">grid-list-md</span> <span class="na">text-xs-center</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pt-5&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-form</span> <span class="na">ref</span><span class="o">=</span><span class="s">&#34;form&#34;</span> <span class="na">v-model</span><span class="o">=</span><span class="s">&#34;validInput&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-row</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;12&#34;</span> <span class="na">md</span><span class="o">=</span><span class="s">&#34;6&#34;</span> <span class="na">offset-md</span><span class="o">=</span><span class="s">&#34;3&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pt-3&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">v-text-field</span>
</span></span><span class="line"><span class="cl">            <span class="na">:value</span><span class="o">=</span><span class="s">&#34;registerUserId&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">autocomplete</span><span class="o">=</span><span class="s">&#34;userid&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">label</span><span class="o">=</span><span class="s">&#34;Enter your desired user id&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">hint</span><span class="o">=</span><span class="s">&#34;Used to logging into application and has to be unique.&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">:rules</span><span class="o">=</span><span class="s">&#34;[rules.required]&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="err">@</span><span class="na">input</span><span class="o">=</span><span class="s">&#34;setRegisterUserId&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">template</span> <span class="na">slot</span><span class="o">=</span><span class="s">&#34;append&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;success&#34;</span> <span class="na">v-if</span><span class="o">=</span><span class="s">&#34;validUserIdStatus==true&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&gt;</span>mdi-check<span class="p">&lt;/</span><span class="nt">v-icon</span>
</span></span><span class="line"><span class="cl">              <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;error&#34;</span> <span class="na">v-else-if</span><span class="o">=</span><span class="s">&#34;validUserIdStatus==false&#34;</span>
</span></span><span class="line"><span class="cl">                <span class="p">&gt;</span>mdi-check<span class="p">&lt;/</span><span class="nt">v-icon</span>
</span></span><span class="line"><span class="cl">              <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">              <span class="p">&lt;</span><span class="nt">v-icon</span><span class="p">&gt;</span>mdi-account<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;/</span><span class="nt">v-text-field</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;12&#34;</span> <span class="na">md</span><span class="o">=</span><span class="s">&#34;6&#34;</span> <span class="na">offset-md</span><span class="o">=</span><span class="s">&#34;3&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pt-3&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">v-text-field</span>
</span></span><span class="line"><span class="cl">            <span class="na">name</span><span class="o">=</span><span class="s">&#34;password&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">autocomplete</span><span class="o">=</span><span class="s">&#34;password&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">:value</span><span class="o">=</span><span class="s">&#34;registerPass&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">label</span><span class="o">=</span><span class="s">&#34;Password&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">:append-icon</span><span class="o">=</span><span class="s">&#34;value ? &#39;mdi-eye&#39; : &#39;mdi-eye-off&#39;&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="err">@</span><span class="na">click:append</span><span class="o">=</span><span class="s">&#34;() =&gt; (value = !value)&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">:type</span><span class="o">=</span><span class="s">&#34;value ? &#39;password&#39; : &#39;text&#39;&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="na">:rules</span><span class="o">=</span><span class="s">&#34;[rules.required]&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="err">@</span><span class="na">input</span><span class="o">=</span><span class="s">&#34;setRegisterPass&#34;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&gt;&lt;/</span><span class="nt">v-text-field</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;12&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">offset-lg</span><span class="o">=</span><span class="s">&#34;6&#34;</span> <span class="na">lg</span><span class="o">=</span><span class="s">&#34;3&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pt-3 text-right&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">v-btn</span> <span class="na">outlined</span> <span class="na">to</span><span class="o">=</span><span class="s">&#34;/&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;mr-3&#34;</span><span class="p">&gt;</span>Cancel<span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">          <span class="p">&lt;</span><span class="nt">v-btn</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span> <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;validateAndRegister&#34;</span><span class="p">&gt;</span>Sign up<span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-row</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-form</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">v-container</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="nx">Panel</span> <span class="nx">from</span> <span class="s2">&#34;../components/Panel&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="p">{</span> <span class="nx">mapState</span><span class="p">,</span> <span class="nx">mapMutations</span><span class="p">,</span> <span class="nx">mapActions</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;vuex&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="nx">PgtUtilMix</span> <span class="nx">from</span> <span class="s2">&#34;../mixins/PgtUtilMix&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">components</span><span class="o">:</span> <span class="p">{</span> <span class="nx">Panel</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">data</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">value</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">validInput</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">rules</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">required</span><span class="o">:</span> <span class="nx">value</span> <span class="p">=&gt;</span> <span class="o">!!</span><span class="nx">value</span> <span class="o">||</span> <span class="s2">&#34;Required.&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mixins</span><span class="o">:</span> <span class="p">[</span><span class="nx">PgtUtilMix</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="nx">computed</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">mapState</span><span class="p">(</span><span class="s2">&#34;authentication&#34;</span><span class="p">,</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;registerPass&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;registerUserId&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;registerError&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;validUserIdStatus&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">methods</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">mapMutations</span><span class="p">(</span><span class="s2">&#34;authentication&#34;</span><span class="p">,</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;setRegisterUserId&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;setRegisterPass&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">]),</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">mapActions</span><span class="p">(</span><span class="s2">&#34;authentication&#34;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&#34;register&#34;</span><span class="p">,</span> <span class="s2">&#34;checkUserIdValid&#34;</span><span class="p">]),</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nx">validateAndRegister</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">$refs</span><span class="p">.</span><span class="nx">form</span><span class="p">.</span><span class="nx">validate</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="k">this</span><span class="p">.</span><span class="nx">register</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">watch</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">registerUserId</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">checkUserIdValid</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">mounted</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">this</span><span class="p">.</span><span class="nx">setRegisterPass</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="k">this</span><span class="p">.</span><span class="nx">checkUserIdValid</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">pgtDebounce</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">checkUserIdValid</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Our Vuex module will be standard enough - will not bother you with all details..</p>
<p>..except the function that calls an API on server to check whether the user id already exists -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// ./store/authentication.js
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// .. lot of other code
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">actions</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// .. even more  code
</span></span></span><span class="line"><span class="cl">    <span class="nx">checkUserIdValid</span><span class="p">({</span> <span class="nx">commit</span><span class="p">,</span> <span class="nx">state</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="nx">HTTP</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s2">&#34;v0/auth/checkUserIdValid&#34;</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">userid</span><span class="o">:</span> <span class="nx">state</span><span class="p">.</span><span class="nx">registerDetails</span><span class="p">[</span><span class="s2">&#34;registerUserId&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="p">})</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="nx">then</span><span class="p">(({</span> <span class="nx">data</span> <span class="p">})</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">commit</span><span class="p">(</span><span class="s2">&#34;setValidUserIdStatus&#34;</span><span class="p">,</span> <span class="nx">data</span><span class="p">.</span><span class="nx">valid</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">          <span class="c1">// true if id not present
</span></span></span><span class="line"><span class="cl">        <span class="p">})</span>
</span></span><span class="line"><span class="cl">        <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">e</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;error&#34;</span><span class="p">,</span> <span class="nx">e</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>And, ta da..</p>
<p><img loading="lazy" src="/misc/vue-form-debounce.gif" type="" alt="vue-form-debounce"  /></p>
<h4 id="dissecting-our-reusable-debounce">Dissecting our reusable debounce</h4>
<p>We have used a standard Vue mixin to begin with ..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="nx">PgtUtilMix</span> <span class="nx">from</span> <span class="s2">&#34;../mixins/PgtUtilMix&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="c">&lt;!--</span> <span class="p">...</span> <span class="o">--&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">mixins</span><span class="o">:</span> <span class="p">[</span><span class="nx">PgtUtilMix</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c">&lt;!--</span> <span class="p">...</span> <span class="o">--&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>We could have used debounce as-is, but you may have observed one complication - our function uses context to set <code>this</code>. We need to retain the component context for the reusable function to work.</p>
<p>So, we just override the original function with our debounce function.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl">    <span class="nx">mounted</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="c1">//  ...
</span></span></span><span class="line"><span class="cl">      <span class="k">this</span><span class="p">.</span><span class="nx">checkUserIdValid</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">pgtDebounce</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">checkUserIdValid</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span></code></pre></div><p>Now, whenever we call <code>checkUserIdValid</code> we are referring to our streamlined super-function that simply calls the underlying function after introducing a delay of 1000ms.</p>
<p>We can use this debounce anywhere in our application as long as we import and refer to the mixin.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Centralized alert for Vuetify</title>
      <link>https://techformist.com/centralize-alert-vuetify/</link>
      <pubDate>Fri, 18 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/centralize-alert-vuetify/</guid>
      <description>&lt;p&gt;Centralize all error, warning and info alerts in one place.&lt;/p&gt;
&lt;p&gt;I like &lt;code&gt;v-alert&lt;/code&gt; and tend to over-use it. It enables us to show detailed notifications (error or otherwise) - without significantly causing user inconvenience. I find &lt;code&gt;v-alert&lt;/code&gt; more suitable in my apps than using, say, popup alerts that interrupt users, or &amp;ldquo;toast&amp;rdquo; notifications which I find unsuitable for detailed messages.&lt;/p&gt;
&lt;p&gt;I use &lt;code&gt;v-alerts&lt;/code&gt; to -&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;display error or informational messages post an API call&lt;/li&gt;
&lt;li&gt;show form validation errors that cannot be shown against individual controls&lt;/li&gt;
&lt;li&gt;guide user action&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-do-i-alert&#34;&gt;How do I alert?&lt;/h2&gt;
&lt;p&gt;Using alert in Vuetify is simple enough. Introduce this one line in your components that needs alerts.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Centralize all error, warning and info alerts in one place.</p>
<p>I like <code>v-alert</code> and tend to over-use it. It enables us to show detailed notifications (error or otherwise) - without significantly causing user inconvenience. I find <code>v-alert</code> more suitable in my apps than using, say, popup alerts that interrupt users, or &ldquo;toast&rdquo; notifications which I find unsuitable for detailed messages.</p>
<p>I use <code>v-alerts</code> to -</p>
<ul>
<li>display error or informational messages post an API call</li>
<li>show form validation errors that cannot be shown against individual controls</li>
<li>guide user action</li>
</ul>
<h2 id="how-do-i-alert">How do I alert?</h2>
<p>Using alert in Vuetify is simple enough. Introduce this one line in your components that needs alerts.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">v-alert</span> <span class="na">:type</span><span class="o">=</span><span class="s">&#34;dispType&#34;</span> <span class="na">:value</span><span class="o">=</span><span class="s">&#34;dispMsg&#34;</span> <span class="na">dismissible</span><span class="p">&gt;</span>{{dispMessage}}<span class="p">&lt;/</span><span class="nt">v-alert</span><span class="p">&gt;</span>
</span></span></code></pre></div><h2 id="where-should-i-place-v-alert">Where should I place <code>v-alert</code>?</h2>
<p>Initially I used to introduce <code>v-alert</code> in views or components on a need basis. This resulted in non-standard positions and confuse users in any application with more than 2 screens.</p>
<p>Almost immediately after my initial learning (/failing) phase, I switched to using <code>v-alert</code> in views and used different messages in distinct views.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- Contact.vue --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">v-alert</span> <span class="na">:type</span><span class="o">=</span><span class="s">&#34;error&#34;</span> <span class="na">:value</span><span class="o">=</span><span class="s">&#34;contactError&#34;</span> <span class="na">dismissible</span>
</span></span><span class="line"><span class="cl">  <span class="p">&gt;</span>{{contactError}}<span class="p">&lt;/</span><span class="nt">v-alert</span>
</span></span><span class="line"><span class="cl"><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">&lt;!-- Task.vue --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">v-alert</span> <span class="na">:type</span><span class="o">=</span><span class="s">&#34;error&#34;</span> <span class="na">:value</span><span class="o">=</span><span class="s">&#34;taskError&#34;</span> <span class="na">dismissible</span><span class="p">&gt;</span>{{taskError}}<span class="p">&lt;/</span><span class="nt">v-alert</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>This works really well especially if your users are changing screens frequently and tend to pick up work where they left off moments ago. Users can maintain context to the previous errors since the error messages are different from each other.</p>
<p>However, I find this rather boring to maintain. Any changes to alert will need changes in multiple places.</p>
<p>The next step and the natural evolution - put the alert in a different component (<code>Alert.vue</code>) and use that component everywhere.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- Alert.vue --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-alert</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;text-center&#34;</span> <span class="na">:value</span><span class="o">=</span><span class="s">&#34;!!message&#34;</span> <span class="na">:type</span><span class="o">=</span><span class="s">&#34;type&#34;</span> <span class="na">dismissible</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;</span>{{ alert[&#39;message&#39;] }}<span class="p">&lt;/</span><span class="nt">v-alert</span>
</span></span><span class="line"><span class="cl">    <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Include this component using a simple statement in any component that needs to call alert -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">Alert</span> <span class="na">:message</span><span class="o">=</span><span class="s">&#34;dispMessage&#34;</span> <span class="na">:type</span><span class="o">=</span><span class="s">&#34;dispType&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">Alert</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>We can either use prop as demonstrated above or use Vuex.</p>
<p>You know where I am going with this - it gets tedious as well. Include a one-liner in every view - give me a break.</p>
<p>Ergo, my current favourite design.</p>
<h2 id="the-centralized-alert-management-system">The centralized alert management system</h2>
<p>Don&rsquo;t get scared by the name, it&rsquo;s rather simple and silly.</p>
<p>First, we create a alert component as before. Here&rsquo;s a spicy version that works well with Vuetify 2 and has alert managed through Vuex modules-</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- Alert.vue --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-alert</span>
</span></span><span class="line"><span class="cl">      <span class="na">class</span><span class="o">=</span><span class="s">&#34;text-center&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">:value</span><span class="o">=</span><span class="s">&#34;!!alert[&#39;message&#39;]&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">:type</span><span class="o">=</span><span class="s">&#34;type&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="na">dismissible</span>
</span></span><span class="line"><span class="cl">      <span class="na">outlined</span>
</span></span><span class="line"><span class="cl">      <span class="na">border</span><span class="o">=</span><span class="s">&#34;left&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="err">@</span><span class="na">input</span><span class="o">=</span><span class="s">&#34;closeAlert&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;</span>{{ alert[&#39;message&#39;] }}<span class="p">&lt;/</span><span class="nt">v-alert</span>
</span></span><span class="line"><span class="cl">    <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="p">{</span> <span class="nx">mapState</span><span class="p">,</span> <span class="nx">mapMutations</span><span class="p">,</span> <span class="nx">mapActions</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;vuex&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">computed</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">mapState</span><span class="p">(</span><span class="s2">&#34;pgtalert&#34;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&#34;alert&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">methods</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">mapMutations</span><span class="p">(</span><span class="s2">&#34;pgtalert&#34;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&#34;setAlert&#34;</span><span class="p">]),</span>
</span></span><span class="line"><span class="cl">      <span class="nx">closeAlert</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">setAlert</span><span class="p">({});</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p><code>pgtalert</code> is a Vuex module and <code>alert</code> is an object that stores alert messages in the module - as you can very well deduce from the code.</p>
<p>We will include this <code>Alert</code> component in a frame (call it <code>Panel.vue</code>). This frame will form the basis for any view in our application.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- Panel.vue --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-toolbar</span> <span class="na">flat</span> <span class="na">dense</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-toolbar-title</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;title primary--text &#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">v-if</span><span class="o">=</span><span class="s">&#34;icon&#34;</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;mr-2&#34;</span><span class="p">&gt;</span>{{ icon }}<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">span</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span><span class="p">&gt;</span>{{ title }}<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-toolbar-title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-spacer</span><span class="p">&gt;&lt;/</span><span class="nt">v-spacer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">slot</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;toolbar-items&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">slot</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-toolbar</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">Alert</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-row</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-col</span> <span class="na">cols</span><span class="o">=</span><span class="s">&#34;12&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">slot</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;content&#34;</span><span class="p">&gt;</span>No content<span class="p">&lt;/</span><span class="nt">slot</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-col</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-row</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">import</span> <span class="p">{</span> <span class="nx">mapState</span> <span class="p">}</span> <span class="nx">from</span> <span class="s2">&#34;vuex&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;panel&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">components</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nx">Alert</span><span class="o">:</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="kr">import</span><span class="p">(</span><span class="s2">&#34;./layouts/Alert&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>We use <code>Panel</code> in our views.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- Task.vue --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">Panel</span> <span class="na">title</span><span class="o">=</span><span class="s">&#34;Tasks&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">template</span> <span class="na">slot</span><span class="o">=</span><span class="s">&#34;content&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">TaskList</span><span class="p">&gt;&lt;/</span><span class="nt">TaskList</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">Panel</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Now, all we have to do is to update <code>pgtalert/alert</code> whenever we want to display an alert.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// ./store/task.js
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// lot of code
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//some async op - e.g. API call
</span></span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nx">then</span><span class="p">(({</span><span class="nx">data</span><span class="p">})</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">doSomething</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">e</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">commit</span><span class="p">(</span> <span class="s2">&#34;pgtalert/setAlert&#34;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">message</span><span class="o">:</span> <span class="s2">&#34;Error.&#34;</span> <span class="o">+</span> <span class="nx">e</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">type</span><span class="o">:</span> <span class="s2">&#34;warning&#34;</span> <span class="p">},</span> <span class="p">{</span> <span class="nx">root</span><span class="o">:</span> <span class="kc">true</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="c1">// more code
</span></span></span></code></pre></div><p>And, ta da..</p>
<p><img loading="lazy" src="/misc/centrally-manage-v-alert-vuetify.jpg" type="" alt="centrally-manage-v-alert-vuetify"  /></p>
<p>You could also reset alerts when a subsequent transaction takes place. I find it easier to set it in a central helper function that calls <code>Axios</code> / <code>fetch</code>.</p>
<h2 id="final-note">Final note</h2>
<p>The approach described above is nothing fancy, but does a couple of good things -</p>
<ul>
<li>Centralized alert management - you can change any formatting in one place and you are done</li>
<li>You don&rsquo;t need to explicitly introduce this component in all views</li>
</ul>
<p>It also has some limitations -</p>
<ul>
<li>Messages get reset when other transactions trigger alerts</li>
<li>No ability to customize where messages appear (beyond where the <code>alert</code> component is placed in parent layout/component)</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Asserts are not just for testing</title>
      <link>https://techformist.com/assert-validation-javascript/</link>
      <pubDate>Tue, 15 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/assert-validation-javascript/</guid>
      <description>&lt;p&gt;Assert is a general-purpose validator and should not be used in the context of testing alone.&lt;/p&gt;
&lt;p&gt;An assert in Javascript simply checks for truthy values and produces an error otherwise. We use it quite a bit in automated testing when checking for correctness of output for pre-defined inputs.&lt;/p&gt;
&lt;p&gt;We use asserts like so -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;assert&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;assert&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The above code block will go through fine since there are no errors, but I am well capable of producing a few errors.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Assert is a general-purpose validator and should not be used in the context of testing alone.</p>
<p>An assert in Javascript simply checks for truthy values and produces an error otherwise. We use it quite a bit in automated testing when checking for correctness of output for pre-defined inputs.</p>
<p>We use asserts like so -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">assert</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&#34;assert&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">assert</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">===</span> <span class="mi">3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">assert</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="o">==</span> <span class="mi">9</span><span class="p">);</span>
</span></span></code></pre></div><p>The above code block will go through fine since there are no errors, but I am well capable of producing a few errors.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">assert</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="mi">4</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
</span></span></span></code></pre></div><p>Assert statements are great for unit tests, but can be equally useful for validations and checks in our normal programs.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">assert</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&#34;assert&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">assert</span><span class="p">(</span><span class="o">!!</span><span class="nb">Number</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="o">==</span> <span class="kc">true</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nx">assert</span><span class="p">(</span><span class="o">!!</span><span class="nb">Number</span><span class="p">(</span><span class="nx">y</span><span class="p">)</span> <span class="o">==</span> <span class="kc">true</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="p">,</span> <span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
</span></span></span><span class="line"><span class="cl"><span class="c1">//   assert(!!Number(x) == true)
</span></span></span></code></pre></div><p>This is especially useful in places where you need to check for warnings and start throwing errors for pre-defined warnings.</p>
<p>Instead of an explicit <code>if</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// code
</span></span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">warning</span><span class="p">)</span> <span class="k">throw</span> <span class="s2">&#34;Warning, warning&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// code
</span></span></span></code></pre></div><p>.. we can now do -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// code
</span></span></span><span class="line"><span class="cl"><span class="nx">assert</span><span class="p">(</span><span class="nx">warning</span> <span class="o">==</span> <span class="s2">&#34;whatever condition&#34;</span><span class="p">,</span> <span class="s2">&#34;Warning, warning&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// code
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/* output
</span></span></span><span class="line"><span class="cl"><span class="cm">Error:
</span></span></span><span class="line"><span class="cl"><span class="cm">AssertionError [ERR_ASSERTION]: Warning, warning
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
    <item>
      <title>Three quick ways to convert objects to arrays</title>
      <link>https://techformist.com/convert-objects-iterable-arrays-javascript/</link>
      <pubDate>Wed, 02 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/convert-objects-iterable-arrays-javascript/</guid>
      <description>&lt;p&gt;Easily convert objects to arrays and iterate to your heart&amp;rsquo;s content.&lt;/p&gt;
&lt;p&gt;There are multiple ways of converting an object to an array (which, also is an object but a different one at that.)&lt;/p&gt;
&lt;h3 id=&#34;method-1-a-simple-objectvalues-method&#34;&gt;Method 1: A simple Object.values() method&lt;/h3&gt;
&lt;p&gt;The first idea that comes to mind is to just use &lt;code&gt;Object.keys()&lt;/code&gt;, &lt;code&gt;Object.values()&lt;/code&gt; or &lt;code&gt;Object.entries()&lt;/code&gt; to generate an array.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;numO&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;numO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// [ 1, 2, 3, 4, 5 ]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;method-2-apply-transformation-logic-during-object-to-array-conversion&#34;&gt;Method 2: Apply transformation logic during object to array conversion&lt;/h3&gt;
&lt;p&gt;If you are going fancy about the conversion and want to include some logic therein -&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Easily convert objects to arrays and iterate to your heart&rsquo;s content.</p>
<p>There are multiple ways of converting an object to an array (which, also is an object but a different one at that.)</p>
<h3 id="method-1-a-simple-objectvalues-method">Method 1: A simple Object.values() method</h3>
<p>The first idea that comes to mind is to just use <code>Object.keys()</code>, <code>Object.values()</code> or <code>Object.entries()</code> to generate an array.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numO</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">a</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">b</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">c</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span> <span class="nx">d</span><span class="o">:</span> <span class="mi">4</span><span class="p">,</span> <span class="nx">e</span><span class="o">:</span> <span class="mi">5</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nx">values</span><span class="p">(</span><span class="nx">numO</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// [ 1, 2, 3, 4, 5 ]
</span></span></span></code></pre></div><h3 id="method-2-apply-transformation-logic-during-object-to-array-conversion">Method 2: Apply transformation logic during object to array conversion</h3>
<p>If you are going fancy about the conversion and want to include some logic therein -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numO</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">a</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">b</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">c</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span> <span class="nx">d</span><span class="o">:</span> <span class="mi">4</span><span class="p">,</span> <span class="nx">e</span><span class="o">:</span> <span class="mi">5</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">arr</span> <span class="o">=</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">Object</span><span class="p">.</span><span class="nx">values</span><span class="p">(</span><span class="nx">numO</span><span class="p">).</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">val</span> <span class="p">=&gt;</span> <span class="nx">arr</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">&#34;a&#34;</span> <span class="o">+</span> <span class="nx">val</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;arr: &#34;</span><span class="p">,</span> <span class="nx">arr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// [ &#39;a1&#39;, &#39;a2&#39;, &#39;a3&#39;, &#39;a4&#39;, &#39;a5&#39; ]
</span></span></span></code></pre></div><h3 id="method-3-use-slice-and-call">Method 3: Use slice and call</h3>
<p>Remember that <code>call</code> of <a href="/similar-methods-across-objects-javascript">one object can be used against another object</a>? We can use this principle to call an array function against the array-like object.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">arr</span> <span class="o">=</span> <span class="nb">Array</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">slice</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">arguments</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">arguments</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// { &#39;0&#39;: 1, &#39;1&#39;: 2, &#39;2&#39;: 3, &#39;3&#39;: 4, &#39;4&#39;: 5 }
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;arr: &#34;</span><span class="p">,</span> <span class="nx">arr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// arr:  [ 1, 2, 3, 4, 5 ]
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="method-31-use-arrayfrom">Method 3.1: Use Array.from()</h3>
<p>Array.from() works for array-like iterables including objects. So, we could use them for objects that are arrays in their hearts. This works similar to the previous method in principle and therefore does not deserve a &ldquo;method&rdquo; by its own.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getSum</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kr">const</span> <span class="nx">arr</span> <span class="o">=</span> <span class="nb">Array</span><span class="p">.</span><span class="nx">from</span><span class="p">(</span><span class="nx">arguments</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">arguments</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// { &#39;0&#39;: 1, &#39;1&#39;: 2, &#39;2&#39;: 3, &#39;3&#39;: 4, &#39;4&#39;: 5 }
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;arr: &#34;</span><span class="p">,</span> <span class="nx">arr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// arr:  [ 1, 2, 3, 4, 5 ]
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="conclusion">Conclusion</h3>
<p>I prefer <code>Object.values()</code> (or <code>keys</code>/<code>entries</code> ) to subject an object to array-like operations (yes, I get the subject/object philosophical implications).</p>
<p><code>Array.prototype.slice()</code> may be the best performer of the lot.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A Different IIFE Syntax</title>
      <link>https://techformist.com/different-iife-syntax/</link>
      <pubDate>Tue, 01 Oct 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/different-iife-syntax/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a different syntax for our favourite IIFE&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;Immediately invoked function expressions enable us to write functions without using &amp;ldquo;functions&amp;rdquo;. Well - just kidding. They are functions but with a different syntax.&lt;/p&gt;
&lt;p&gt;A typical IIFE looks like this -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sum&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;sum&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sum: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/* output
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;sum:  10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There is another interesting syntax that is lesser known. At least it was not known at all to me-self until I came across the syntax in some library.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Here&rsquo;s a different syntax for our favourite IIFE&rsquo;s.</p>
<p>Immediately invoked function expressions enable us to write functions without using &ldquo;functions&rdquo;. Well - just kidding. They are functions but with a different syntax.</p>
<p>A typical IIFE looks like this -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">y</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">sum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">sum</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;sum: &#34;</span><span class="p">,</span> <span class="nx">sum</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/* output
</span></span></span><span class="line"><span class="cl"><span class="cm">sum:  10
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><p>There is another interesting syntax that is lesser known. At least it was not known at all to me-self until I came across the syntax in some library.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">y</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">sum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// prettier-ignore
</span></span></span><span class="line"><span class="cl"><span class="o">!</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">sum</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;sum: &#34;</span><span class="p">,</span> <span class="nx">sum</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// prettier-ignore
</span></span></span><span class="line"><span class="cl"><span class="p">}();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/* output
</span></span></span><span class="line"><span class="cl"><span class="cm">sum:  10
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><p>This syntax just makes use of the fact that the function is an object and so on and so forth.</p>
<p>As you might have second-guessed by the &lsquo;prettier-ignore&rsquo; statements, this is not liked by Prettier. And, what is not liked by Prettier seems so unnatural.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Conditionally copy props to new object in Javascript</title>
      <link>https://techformist.com/conditional-copy-objects-javascript/</link>
      <pubDate>Fri, 27 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/conditional-copy-objects-javascript/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a shorter, readable way to copy props from one object to another subject to defined conditions.&lt;/p&gt;
&lt;p&gt;The shortest way to copy object (when you don&amp;rsquo;t quite care about copying sub objects by reference) -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;planet&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;earth&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;position&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newPlanet&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;planet&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newPlanet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// { name: &amp;#39;earth&amp;#39;, position: 3 }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But, what do you do if you want to copy only &lt;code&gt;name&lt;/code&gt; but not &lt;code&gt;position&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;A common way to do that will be -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;planet&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;earth&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;position&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newPlanet&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;planet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newPlanet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newPlanet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// { name: &amp;#39;name&amp;#39; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not bad - the code is readable and we have accomplished the task in two lines.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Here&rsquo;s a shorter, readable way to copy props from one object to another subject to defined conditions.</p>
<p>The shortest way to copy object (when you don&rsquo;t quite care about copying sub objects by reference) -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;earth&#34;</span><span class="p">,</span> <span class="nx">position</span><span class="o">:</span> <span class="mi">3</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">newPlanet</span> <span class="o">=</span> <span class="p">{</span> <span class="p">...</span><span class="nx">planet</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">newPlanet</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { name: &#39;earth&#39;, position: 3 }
</span></span></span></code></pre></div><p>But, what do you do if you want to copy only <code>name</code> but not <code>position</code>?</p>
<p>A common way to do that will be -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;earth&#34;</span><span class="p">,</span> <span class="nx">position</span><span class="o">:</span> <span class="mi">3</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">newPlanet</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">planet</span><span class="p">).</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">key</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">key</span> <span class="o">==</span> <span class="s2">&#34;position&#34;</span> <span class="o">?</span> <span class="s2">&#34;&#34;</span> <span class="o">:</span> <span class="p">(</span><span class="nx">newPlanet</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">key</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">newPlanet</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// { name: &#39;name&#39; }
</span></span></span></code></pre></div><p>Not bad - the code is readable and we have accomplished the task in two lines.</p>
<p>But, why stop there - there is always an easier way.</p>
<p>And, that easy way in this case happens to be using the spread operator. We will just build on the spread operator example provided at the beginning of this post to do conditional copying of object&rsquo;s props.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">planet</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;earth&#34;</span><span class="p">,</span> <span class="nx">position</span><span class="o">:</span> <span class="mi">3</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">{</span> <span class="nx">position</span><span class="p">,</span> <span class="p">...</span><span class="nx">newPlanet</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">planet</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">newPlanet</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { name: &#39;earth&#39;}
</span></span></span></code></pre></div><p>In hindsight, this is no magic at all. We just used the familiar spread syntax to assign props from an object.</p>
<ul>
<li>We included <code>position</code> as the first prop so that the variable gets <code>position</code> variable/value from <code>planet</code></li>
<li>while the rest of <code>planet</code> goes to <code>newPlanet</code> object</li>
</ul>
<p>I still prefer the <code>.forEach</code> in my code - that makes the tasks more explicit and keep everyone else in the team happy.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A simpler curry for Javascript</title>
      <link>https://techformist.com/simpler-curry-notation-javascript/</link>
      <pubDate>Wed, 25 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/simpler-curry-notation-javascript/</guid>
      <description>&lt;p&gt;A simpler way to do curry functions in Javascript.&lt;/p&gt;
&lt;p&gt;We have previously seen &lt;a href=&#34;https://techformist.com/currying-in-javascript/&#34;&gt;currying in Javascript&lt;/a&gt;. A simple form and application of that concept is demonstrated below -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addThem&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;curry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addTotal&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addThem&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;addTotal: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addTotal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or, we could avoid a external function or library and &lt;a href=&#34;https://techformist.com/curry-using-bind-javascript/&#34;&gt;curry using bindings&lt;/a&gt; ..&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addEm&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addEm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But, there is a simpler way to get the same result.&lt;/p&gt;
&lt;p&gt;We just use arrow functions to collect arguments at different times.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A simpler way to do curry functions in Javascript.</p>
<p>We have previously seen <a href="/currying-in-javascript/">currying in Javascript</a>. A simple form and application of that concept is demonstrated below -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">addThem</span> <span class="o">=</span> <span class="nx">add</span><span class="p">.</span><span class="nx">curry</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">addTotal</span> <span class="o">=</span> <span class="nx">addThem</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;addTotal: &#34;</span><span class="p">,</span> <span class="nx">addTotal</span><span class="p">);</span> <span class="c1">// 3
</span></span></span></code></pre></div><p>Or, we could avoid a external function or library and <a href="/curry-using-bind-javascript/">curry using bindings</a> ..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">add</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">y</span> <span class="o">+</span> <span class="nx">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">addEm</span> <span class="o">=</span> <span class="nx">add</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">addEm</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span> <span class="c1">// 3
</span></span></span></code></pre></div><p>But, there is a simpler way to get the same result.</p>
<p>We just use arrow functions to collect arguments at different times.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">add</span> <span class="o">=</span> <span class="nx">x</span> <span class="p">=&gt;</span> <span class="nx">y</span> <span class="p">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">addEm</span> <span class="o">=</span> <span class="nx">add</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">addEm</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span> <span class="c1">// 3
</span></span></span></code></pre></div><p>We can make it more readable with a different notation to do the actual curry -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">add</span> <span class="o">=</span> <span class="nx">x</span> <span class="p">=&gt;</span> <span class="nx">y</span> <span class="p">=&gt;</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">add</span><span class="p">(</span><span class="mi">1</span><span class="p">)(</span><span class="mi">2</span><span class="p">));</span> <span class="c1">// 3
</span></span></span></code></pre></div><p>Of course, you have to rely back on the previously provided example if you don&rsquo;t have all arguments in one go.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Implicit return gotcha for arrow functions</title>
      <link>https://techformist.com/implicit-return-gotcha-arrow-functions/</link>
      <pubDate>Wed, 18 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/implicit-return-gotcha-arrow-functions/</guid>
      <description>&lt;p&gt;Beware of using implicit returns in arrow functions.&lt;/p&gt;
&lt;p&gt;Consider the below example of a simple arrow function. It returns a simple variable. In the absence of any other statement in the function body, a simple mention of &lt;code&gt;x&lt;/code&gt; will return the value of &lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getStuff&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getStuff&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s modify the block. We now want to return an object with the input value within it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getMoreStuff&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getStuff&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oops.. We expected &lt;code&gt;{x: 1}&lt;/code&gt; but got &lt;code&gt;1&lt;/code&gt; because the flower brackets were treated as enclosing a function body and not an object.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Beware of using implicit returns in arrow functions.</p>
<p>Consider the below example of a simple arrow function. It returns a simple variable. In the absence of any other statement in the function body, a simple mention of <code>x</code> will return the value of <code>x</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">getStuff</span> <span class="o">=</span> <span class="nx">x</span> <span class="p">=&gt;</span> <span class="nx">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getStuff</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><p>Let&rsquo;s modify the block. We now want to return an object with the input value within it.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">getMoreStuff</span> <span class="o">=</span> <span class="nx">x</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">x</span><span class="o">:</span> <span class="nx">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getStuff</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><p>Oops.. We expected <code>{x: 1}</code> but got <code>1</code> because the flower brackets were treated as enclosing a function body and not an object.</p>
<p>To get an object, we have to do a simple change -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">getBetterStuff</span> <span class="o">=</span> <span class="nx">x</span> <span class="p">=&gt;</span> <span class="p">({</span> <span class="nx">x</span><span class="o">:</span> <span class="nx">x</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getBetterStuff</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { x: 1 }
</span></span></span></code></pre></div><p>We have used double brackets to signify that the return variable is an object (and to indicate that the flower bracket is not meant to start a function body).</p>
<p>Or, we could simply follow a consistent pattern of always using an enclosed function for any and all arrow functions.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">getSuperStuff</span> <span class="o">=</span> <span class="nx">x</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="p">{</span> <span class="nx">x</span><span class="o">:</span> <span class="nx">x</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSuperStuff</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { x: 1 }
</span></span></span></code></pre></div><p>The last option is the safest, but is not popular with lazy folk (of which I am an active member).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Use onclick event instead of &#39;submit&#39; in Javascript</title>
      <link>https://techformist.com/onclick-instead-submit/</link>
      <pubDate>Sun, 15 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/onclick-instead-submit/</guid>
      <description>&lt;p&gt;Use &lt;code&gt;onclick&lt;/code&gt; rather than &lt;code&gt;submit&lt;/code&gt; in HTML forms.&lt;/p&gt;
&lt;p&gt;A typical HTML form has a few fields and a button to submit the data to some back-end server. And, the typical way to do the form submission is through the &lt;code&gt;submit&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/helloMessage.php&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On clicking the button, the page will submit data to &lt;code&gt;helloMessage.php&lt;/code&gt;, receives any response from PHP page, and (can be configured to) displays the response. [Or, the page could redirect somewhere else based on the submission status, but we will not discuss that here]&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Use <code>onclick</code> rather than <code>submit</code> in HTML forms.</p>
<p>A typical HTML form has a few fields and a button to submit the data to some back-end server. And, the typical way to do the form submission is through the <code>submit</code> method.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">form</span> <span class="na">action</span><span class="o">=</span><span class="s">&#34;/helloMessage.php&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;text&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;name&#34;</span> <span class="p">/&gt;</span>  
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;submit&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">form</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>On clicking the button, the page will submit data to <code>helloMessage.php</code>, receives any response from PHP page, and (can be configured to) displays the response. [Or, the page could redirect somewhere else based on the submission status, but we will not discuss that here]</p>
<p>Each form submission therefore is followed by a page refresh, which is not a good user experience.</p>
<p>We can avoid the refresh by using a custom function to supply data to server and show response. We will use an event raised on button click to eliminate <code>submit</code> altogether.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- ... --&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;button&#34;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">&#34;submitSomething()&#34;</span><span class="p">&gt;</span>Submit<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">&lt;!-- ... --&gt;</span>
</span></span></code></pre></div><p>Consider the below example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">html</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">form</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;padding-top: 3em;padding-left: 5em&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">label</span> <span class="na">for</span><span class="o">=</span><span class="s">&#34;name&#34;</span><span class="p">&gt;</span>Name: <span class="p">&lt;/</span><span class="nt">label</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;text&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;name&#34;</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;button&#34;</span> <span class="na">onclick</span><span class="o">=</span><span class="s">&#34;sayHello()&#34;</span><span class="p">&gt;</span>Submit<span class="p">&lt;/</span><span class="nt">button</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">form</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">p</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;padding-top: 2em; padding-left: 5em&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;helloMsg&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      Enter name and hit button to say &#39;hello&#39;.
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="kd">function</span> <span class="nx">sayHello</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// send `submit` request to server
</span></span></span><span class="line"><span class="cl">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;helloMsg&#34;</span><span class="p">).</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="sb">`Hello, </span><span class="si">${</span>
</span></span><span class="line"><span class="cl">          <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;name&#34;</span><span class="p">).</span><span class="nx">value</span>
</span></span><span class="line"><span class="cl">        <span class="si">}</span><span class="sb">!`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&#34;name&#34;</span><span class="p">).</span><span class="nx">value</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>A &lsquo;hello&rsquo; message gets displayed on button click without a page refresh.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Print a page section on button-click in Vue</title>
      <link>https://techformist.com/print-section-page-button-vue/</link>
      <pubDate>Fri, 06 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/print-section-page-button-vue/</guid>
      <description>&lt;p&gt;Use a button on a Vue component to start a print dialog and print a specific section.&lt;/p&gt;
&lt;h3 id=&#34;setup&#34;&gt;Setup&lt;/h3&gt;
&lt;p&gt;We will use a small library called &lt;a href=&#34;https://www.npmjs.com/package/vue-html-to-paper&#34;&gt;&amp;lsquo;html2paper&amp;rsquo;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First install the said library in your Vue project -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install vue-html-to-paper
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add library to your code in &lt;code&gt;main.js&lt;/code&gt; -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// main.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Vue&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;VueHtmlToPaper&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vue-html-to-paper&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;options&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;_blank&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;specs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;fullscreen=yes&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;titlebar=yes&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;scrollbars=yes&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;styles&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://unpkg.com/kidlat-css/css/kidlat.css&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Vue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;VueHtmlToPaper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We will use a Vuetify example to demonstrate how this is used in Vue code, because - why not?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Use a button on a Vue component to start a print dialog and print a specific section.</p>
<h3 id="setup">Setup</h3>
<p>We will use a small library called <a href="https://www.npmjs.com/package/vue-html-to-paper">&lsquo;html2paper&rsquo;</a>.</p>
<p>First install the said library in your Vue project -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">npm install vue-html-to-paper
</span></span></code></pre></div><p>Add library to your code in <code>main.js</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// main.js
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">Vue</span> <span class="nx">from</span> <span class="s2">&#34;vue&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="nx">VueHtmlToPaper</span> <span class="nx">from</span> <span class="s2">&#34;vue-html-to-paper&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">name</span><span class="o">:</span> <span class="s2">&#34;_blank&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nx">specs</span><span class="o">:</span> <span class="p">[</span><span class="s2">&#34;fullscreen=yes&#34;</span><span class="p">,</span> <span class="s2">&#34;titlebar=yes&#34;</span><span class="p">,</span> <span class="s2">&#34;scrollbars=yes&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nx">styles</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;https://unpkg.com/kidlat-css/css/kidlat.css&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">Vue</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">VueHtmlToPaper</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ...
</span></span></span></code></pre></div><p>We will use a Vuetify example to demonstrate how this is used in Vue code, because - why not?</p>
<h3 id="create-ui-elements">Create UI elements</h3>
<p>Create a new component or modify the existing component that will house the content to be printed. Create a button and identify the section that needs printing.</p>
<p>You can have the section hard-coded or fetch the content from elsewhere. We have used <code>v-html</code> below to render the content fetched from an external system.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- PrintStuff.vue --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;</span><span class="nt">v-card</span> <span class="na">flat</span> <span class="na">height</span><span class="o">=</span><span class="s">&#34;100%&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-toolbar</span> <span class="na">dense</span>
</span></span><span class="line"><span class="cl">      <span class="p">&gt;&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;body-2&#34;</span><span class="p">&gt;</span>Print Stuff<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-spacer</span><span class="p">&gt;&lt;/</span><span class="nt">v-spacer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">v-btn</span> <span class="na">small</span> <span class="na">color</span><span class="o">=</span><span class="s">&#34;primary&#34;</span> <span class="err">@</span><span class="na">click</span><span class="o">=</span><span class="s">&#34;printSection&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">v-icon</span> <span class="na">small</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;mr-1&#34;</span><span class="p">&gt;</span>print<span class="p">&lt;/</span><span class="nt">v-icon</span><span class="p">&gt;</span>Print
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">v-btn</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-toolbar</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">v-flex</span> <span class="na">xs12</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;printSection&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">span</span> <span class="na">v-html</span><span class="o">=</span><span class="s">&#34;printStuff&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">v-flex</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="p">&lt;/</span><span class="nt">v-card</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">template</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="kr">export</span> <span class="k">default</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">methods</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="p">...</span><span class="nx">mapActions</span><span class="p">(</span><span class="s2">&#34;myModule&#34;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&#34;fetchPrintStuff&#34;</span><span class="p">]),</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="nx">printSection</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">this</span><span class="p">.</span><span class="nx">$htmlToPaper</span><span class="p">(</span><span class="s2">&#34;printSection&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">mounted</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">this</span><span class="p">.</span><span class="nx">fetchPrintStuff</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">      <span class="c1">// a Vuex action to get stuff to print from server
</span></span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Now, click the button to open a beautiful print dialog with only the relevant content.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Use await without async function in Javascript</title>
      <link>https://techformist.com/await-without-async-javascript/</link>
      <pubDate>Thu, 05 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/await-without-async-javascript/</guid>
      <description>&lt;p&gt;How can you use &lt;code&gt;await&lt;/code&gt; without an &lt;code&gt;async&lt;/code&gt; function? Don&amp;rsquo;t click or proceed further if you are not into practical jokes.&lt;/p&gt;
&lt;p&gt;Say, you try using &lt;code&gt;await&lt;/code&gt; in a &amp;ldquo;normal&amp;rdquo; function or directly within a module..&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getWeather&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;loc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;weather&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fetchWeather&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;loc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;weather&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// SyntaxError: await is only valid in async function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You receive a compilation error that &lt;code&gt;await&lt;/code&gt; can be used only in &lt;code&gt;async&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;But, if I have to use &lt;code&gt;await&lt;/code&gt; but do not want to create a separate function with its own memory space, what should I do?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>How can you use <code>await</code> without an <code>async</code> function? Don&rsquo;t click or proceed further if you are not into practical jokes.</p>
<p>Say, you try using <code>await</code> in a &ldquo;normal&rdquo; function or directly within a module..</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getWeather</span><span class="p">(</span><span class="nx">loc</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">weather</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetchWeather</span><span class="p">(</span><span class="nx">loc</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">weather</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// SyntaxError: await is only valid in async function
</span></span></span></code></pre></div><p>You receive a compilation error that <code>await</code> can be used only in <code>async</code> function.</p>
<p>But, if I have to use <code>await</code> but do not want to create a separate function with its own memory space, what should I do?</p>
<p>This question actually finds its place in the pre-defined set of interview questions from a particularly bad interviewer. So, the answer can be equally bad.</p>
<p>Use an &lsquo;immediately invoked function expression&rsquo; (IIFE).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getWeather</span><span class="p">(</span><span class="nx">loc</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="p">(</span><span class="kr">async</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">weather</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetchWeather</span><span class="p">(</span><span class="nx">loc</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">})();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// on and on - code with no dependency on weather
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>If you are thinking by now that the whole &lsquo;await w/o async&rsquo; thing is not really a joke, but a joke of a post - you may be absolutely right!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Generate Fibonacci series using generators</title>
      <link>https://techformist.com/fibonacci-series-using-generator-javascript/</link>
      <pubDate>Wed, 04 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/fibonacci-series-using-generator-javascript/</guid>
      <description>&lt;p&gt;Generate Fibonacci series with generators and feel good about yourself.&lt;/p&gt;
&lt;p&gt;Previously you have seen how the totally practical example of generating Fibonacci series was breathing fire with &lt;a href=&#34;https://techformist.com/memoization-javascript&#34;&gt;memoization&lt;/a&gt;, and may have also come across using loops or recursion to solve the same problem. But, there is no fun in all that - this is real-life and we have to &amp;ldquo;generate&amp;rdquo; fun (yep, there we go again).&lt;/p&gt;
&lt;p&gt;If you have forgotten your schooling, here&amp;rsquo;s the series - any number is the sum of previous two numbers (except the first two, of course).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Generate Fibonacci series with generators and feel good about yourself.</p>
<p>Previously you have seen how the totally practical example of generating Fibonacci series was breathing fire with <a href="/memoization-javascript">memoization</a>, and may have also come across using loops or recursion to solve the same problem. But, there is no fun in all that - this is real-life and we have to &ldquo;generate&rdquo; fun (yep, there we go again).</p>
<p>If you have forgotten your schooling, here&rsquo;s the series - any number is the sum of previous two numbers (except the first two, of course).</p>
<pre tabindex="0"><code>fibo(5) = [1, 1, 2, 3, 5]
</code></pre><p>The question on everyone&rsquo;s mind is - can we really do <em>that</em> using <a href="/generators-javascript/">generators</a>?</p>
<p>Of course, you can! I would not be wasting your bandwidth, burdening the environment with electricity to power all the servers, and wasting even more electricity for you to read this post if we could not do that.</p>
<p>All the fluff so far just leads to this simple algo -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span><span class="o">*</span> <span class="nx">fiboGen</span><span class="p">(</span><span class="nx">fibo</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nx">j</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="p">(;;)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">[</span><span class="nx">i</span><span class="p">,</span> <span class="nx">j</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">j</span><span class="p">,</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="k">yield</span> <span class="nx">j</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">fibo</span> <span class="o">=</span> <span class="nx">fiboGen</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">fibo</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">fibo</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">fibo</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">fibo</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">fibo</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 1 1 2 3 5 8
</span></span></span></code></pre></div><p>The best part - you can go on and on with this logic to establish a world record for longest Fibonacci series. (I was joking - don&rsquo;t try that at home).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Function object and Function in an object</title>
      <link>https://techformist.com/function-object-constructor-javascript/</link>
      <pubDate>Tue, 03 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/function-object-constructor-javascript/</guid>
      <description>&lt;p&gt;Previously, we have talked about all things being an object in Javascript. But to what extent can we apply this to our beloved functions.&lt;/p&gt;
&lt;p&gt;You can see this almost everywhere with the below syntax -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getSum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We have also touched upon how function is an object and how that helps in &lt;a href=&#34;https://techformist.com/function-of-functions-javascript/&#34;&gt;using closures&lt;/a&gt; and &lt;a href=&#34;https://techformist.com/currying-in-javascript/&#34;&gt;currying&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For now, let&amp;rsquo;s leave all those complex things behind. Function being an object implies that we can do this -&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Previously, we have talked about all things being an object in Javascript. But to what extent can we apply this to our beloved functions.</p>
<p>You can see this almost everywhere with the below syntax -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">getSum</span> <span class="o">=</span> <span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><p>We have also touched upon how function is an object and how that helps in <a href="/function-of-functions-javascript/">using closures</a> and <a href="/currying-in-javascript/">currying</a>.</p>
<p>For now, let&rsquo;s leave all those complex things behind. Function being an object implies that we can do this -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">getSum</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Function</span><span class="p">(</span><span class="s2">&#34;x&#34;</span><span class="p">,</span> <span class="s2">&#34;y&#34;</span><span class="p">,</span> <span class="s2">&#34;{return x + y}&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getSum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3
</span></span></span></code></pre></div><p>We just define a function like we define an object, and pass variables and function body as parameters to the constructor.</p>
<p>You get the <code>function</code> object as output from a <code>type of</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">getSum</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// function
</span></span></span></code></pre></div><p>However, you would also know that every object functions with a <code>function</code> in the form of a constructor.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">earth</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">position</span><span class="o">:</span> <span class="mi">3</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">earth</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// object
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">earth</span><span class="p">.</span><span class="nx">constructor</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// function
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nb">Date</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// function
</span></span></span></code></pre></div><p>Therefore, anything without a function is just so primitive (a silly joke and a fact(?)).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Generators in Javascript</title>
      <link>https://techformist.com/generators-javascript/</link>
      <pubDate>Sun, 01 Sep 2019 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/generators-javascript/</guid>
      <description>&lt;p&gt;What are generators and how can I use them?&lt;/p&gt;
&lt;p&gt;How do you write loops in Javascript - Simple for/while? Recursion? In other less exciting ways?&lt;/p&gt;
&lt;p&gt;How do you throttle and control function execution? &lt;a href=&#34;https://techformist.com/allow-function-call-once-javascript/&#34;&gt;Debounce function&lt;/a&gt;? &lt;a href=&#34;https://techformist.com/allow-function-call-once-javascript/&#34;&gt;Build your own&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;What if you could produce the right mix of reusable functions, looping and throttling in one go? Enter generators.&lt;/p&gt;
&lt;h3 id=&#34;what-are-generators&#34;&gt;What are Generators?&lt;/h3&gt;
&lt;p&gt;Generators are functions that lets you can control iteration. You can use generators to suspend execution of a function while saving the context for continuing the execution at a later time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>What are generators and how can I use them?</p>
<p>How do you write loops in Javascript - Simple for/while? Recursion? In other less exciting ways?</p>
<p>How do you throttle and control function execution? <a href="/allow-function-call-once-javascript/">Debounce function</a>? <a href="/allow-function-call-once-javascript/">Build your own</a>?</p>
<p>What if you could produce the right mix of reusable functions, looping and throttling in one go? Enter generators.</p>
<h3 id="what-are-generators">What are Generators?</h3>
<p>Generators are functions that lets you can control iteration. You can use generators to suspend execution of a function while saving the context for continuing the execution at a later time.</p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*">MDN defines generators</a> as functions which can be exited and later re-entered.</p>
<p>Let&rsquo;s understand more with an example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span><span class="o">*</span> <span class="nx">getNums</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="nx">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="nx">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="nx">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="nx">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">nums</span> <span class="o">=</span> <span class="nx">getNums</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 0 1 2 3
</span></span></span></code></pre></div><p>In the code block -</p>
<ol>
<li>We have defined the generator function using <code>function*</code> prefix</li>
<li>We used a keyword <code>yield</code> indicates to Javascript that the function needs to go into sleep and return the said value</li>
<li>Initiated the function</li>
<li>Called the generator function multiple times - with each time stopping at the next <code>yield</code> to return a value</li>
</ol>
<p>Simple enough?</p>
<p>What&rsquo;s mondo interesting about this function is the ability to store a state without impacting the program flow. And each time we invoke the function with a <code>next()</code>, the state is back with a bang and execution continues as if nothing happened.</p>
<h3 id="defining-generators">Defining generators</h3>
<p>We can use any of the following ways to define generator functions-</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span><span class="o">*</span> <span class="nx">func1</span><span class="p">()</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="o">*</span> <span class="nx">func2</span><span class="p">()</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="o">*</span><span class="nx">func3</span><span class="p">()</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">func4</span> <span class="o">=</span> <span class="kd">function</span><span class="o">*</span><span class="p">()</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">func5</span> <span class="o">=</span> <span class="kd">function</span><span class="o">*</span> <span class="p">()</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">func6</span> <span class="o">=</span> <span class="kd">function</span> <span class="o">*</span><span class="p">()</span> <span class="p">{};</span>
</span></span></code></pre></div><p>I just stick to what Prettier tells me to do.</p>
<p>Also, we cannot use arrow functions for generators yet.</p>
<h3 id="initializing-generators">Initializing generators</h3>
<p>Once defined you don&rsquo;t use generator functions like normal functions, instead you should initiate the generator.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">nums</span> <span class="o">=</span> <span class="nx">getNums</span><span class="p">();</span>
</span></span></code></pre></div><p>This returns an iterator, which you use like so -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span></code></pre></div><p>The above statement returns an object at the <code>yield</code> statement within generator. So <code>yield</code> is like a <code>return</code> which is not a <code>return</code> :)</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { value: 0, done: false }
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">().</span><span class="nx">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1
</span></span></span></code></pre></div><p>The <code>done</code> prop within the object indicates whether the generator has anything pending to do after the current <code>yield</code>. Consider the below example -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span><span class="o">*</span> <span class="nx">getNums</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="nx">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">nums</span> <span class="o">=</span> <span class="nx">getNums</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { value: 0, done: false }
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { value: undefined, done: true }
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { value: undefined, done: true }
</span></span></span></code></pre></div><p><code>yield</code> always returns the same object with same props.</p>
<p>You could technically do a <code>return</code> within a generator function, but any <code>yield</code> (or any other statement) will not execute after <code>return</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span><span class="o">*</span> <span class="nx">getNums</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="nx">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span><span class="p">;</span> <span class="c1">// all done with second next() call
</span></span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="nx">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">nums</span> <span class="o">=</span> <span class="nx">getNums</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { value: 0, done: false }
</span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="c1">// { value: undefined, done: true }
</span></span></span></code></pre></div><h5 id="loops-in-a-generator">Loops in a generator</h5>
<p>No one ever said, &ldquo;let&rsquo;s make life complicated&rdquo;. But here we are.</p>
<p><code>yield</code> within a loop functions exactly as you would expect it to-</p>
<ul>
<li>function execution starts</li>
<li>control goes into loop</li>
<li>encounters <code>yield</code></li>
<li>returns the object and goes into coma</li>
<li>with the next <code>next()</code> control revives itself, finds itself in a loop, returns object and so on</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span><span class="o">*</span> <span class="nx">getNums</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">yield</span> <span class="nx">i</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">nums</span> <span class="o">=</span> <span class="nx">getNums</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/* output
</span></span></span><span class="line"><span class="cl"><span class="cm">{ value: 0, done: false }
</span></span></span><span class="line"><span class="cl"><span class="cm">{ value: 1, done: false }
</span></span></span><span class="line"><span class="cl"><span class="cm">{ value: 2, done: false }
</span></span></span><span class="line"><span class="cl"><span class="cm">{ value: undefined, done: true }
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><h5 id="generator-chains">Generator chains</h5>
<p><code>yield</code> can call another generator. (And that&rsquo;s really perfect since you can chain them to mess up one&rsquo;s mind.)</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span><span class="o">*</span> <span class="nx">getNums</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">yield</span><span class="o">*</span> <span class="nx">getNumsNums</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="nx">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span><span class="o">*</span> <span class="nx">getNumsNums</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="s2">&#34;what is life?&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">yield</span> <span class="s2">&#34;what is I?&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">nums</span> <span class="o">=</span> <span class="nx">getNums</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">next</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/* output
</span></span></span><span class="line"><span class="cl"><span class="cm">{ value: &#39;what is life?&#39;, done: false }
</span></span></span><span class="line"><span class="cl"><span class="cm">{ value: &#39;what is I?&#39;, done: false }
</span></span></span><span class="line"><span class="cl"><span class="cm">{ value: 0, done: false }
</span></span></span><span class="line"><span class="cl"><span class="cm">{ value: undefined, done: true }
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span></code></pre></div><h3 id="where-could-generators-be-useful">Where could generators be useful?</h3>
<p>All we described about generators is well and dandy, but there&rsquo;s no hope for them until we find a use case (or two).</p>
<p>Here&rsquo;s what smarter people are using generators for -</p>
<ol>
<li>Generate an (almost) infinite loop that increments once every call. This is useful for use cases like sliders that keep going round and round</li>
<li>Use generators in place of recursion. We will get back to our favourite algorithms to generate Fibonacci series and such in a bit</li>
<li>Throttle function calls. For example, call external API for one request at a time (and that&rsquo;s a totally practical scenario. Stop smirking.)</li>
<li>Use promises within generators to have async functions with throttling! See the previous point</li>
<li>Store states during different instances of the program life cycle, suspend and carry on with the task later. For example, generating unique ids in our algorithm</li>
</ol>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
