{"componentChunkName":"component---src-templates-blog-post-js","path":"/conditional-rendering-in-react/","webpackCompilationHash":"da658d138a5c02dfedf3","result":{"data":{"site":{"siteMetadata":{"title":"八王子わんにゃんクラブ","author":"technology unit of JOHAQ.COM.","siteUrl":"https://svc-802-wannyan-club.johaq.com","keywords":["八王子わんにゃんクラブ"],"disqusShortname":"johaq-com"}},"markdownRemark":{"id":"9c03c337-340c-5f92-8c63-f48fa1a02847","excerpt":"The declarative approach of React makes writing user interfaces easier than ever. In this post, I will explain how to conditionally render things by using the…","timeToRead":4,"html":"<p>The declarative approach of <a href=\"https://reactjs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React</a> makes writing user interfaces easier than ever. In this post, I will explain how to conditionally render things by using the component composition pattern.</p>\n<h2 id=\"conditional-rendering--the-classic-way\"><a href=\"#conditional-rendering--the-classic-way\" aria-label=\"conditional rendering  the classic way permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conditional Rendering – The Classic Way</h2>\n<p>A common way to conditionally render something in React is by using inline <code>if</code> with logical <code>&#x26;&#x26;</code> operator:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-jsx line-numbers\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">UserNotifications</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">props</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h2</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Hi </span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>userName<span class=\"token punctuation\">}</span><span class=\"token plain-text\">!</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h2</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>unreadNotifications <span class=\"token operator\">></span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">You have </span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>unreadNotifications<span class=\"token punctuation\">}</span><span class=\"token plain-text\"> notifications.</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>If you have to render either <code>A</code> or <code>B</code> depending on a conditional statement, the <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ternary conditional operator</a> is often used:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-jsx line-numbers\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">UserLogStatus</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">props</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h2</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Welcome to morello.dev</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h2</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>loggedIn <span class=\"token operator\">?</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>onLogOutClicked<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Log Out</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">:</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>onLogInClicked<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Log In</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>The techniques seen above are perfectly legal in React, but we can use component composition to make conditional rendering more elegant and easier to read.</p>\n<h2 id=\"conditional-rendering-using-component-composition\"><a href=\"#conditional-rendering-using-component-composition\" aria-label=\"conditional rendering using component composition permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conditional Rendering Using Component Composition</h2>\n<p>We can use the component composition pattern to conditionally render parts of UI. Let’s see how!</p>\n<blockquote>\n<p>For a refresh on component composition pattern in React, see <a href=\"https://www.robinwieruch.de/react-component-composition\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this post</a> by Robin Wieruch.</p>\n</blockquote>\n<h3 id=\"conditional-components\"><a href=\"#conditional-components\" aria-label=\"conditional components permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conditional Components</h3>\n<p>Every if-then-else code block consists of two parts: the logical condition that has to be evaluated and the components to be conditionally rendered.</p>\n<p>We can go further with this consideration by turning the if-then-else block into <code>If</code>, <code>Then</code> and <code>Else</code> components. We pass the condition as props to <code>If</code>, and we put <code>Then</code> and <code>Else</code> inside it. The <code>Then</code> component contains the stuff to render when the condition evaluates to <code>true</code>, and the <code>Else</code> component contains the stuff to render when the condition evaluates to <code>false</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-jsx line-numbers\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">UserLogStatus</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">props</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">If</span></span> <span class=\"token attr-name\">condition</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>loggedIn<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Then</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>onLogOutClicked<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Log Out</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Then</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Else</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>onLogInClicked<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Log In</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Else</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">If</span></span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Everything sounds cool, but how could we implement the <code>If</code>, <code>Then</code> and <code>Else</code> components? Here is my solution, but feel free to submit yours in the comment area <span role=\"img\" aria-labelledby=\"light bulb\">💡</span></p>\n<h2 id=\"if-then-else\"><a href=\"#if-then-else\" aria-label=\"if then else permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>If, Then, Else</h2>\n<p>We start by considering the <code>If</code> component, as it is the parent. The idea is to take the condition passed as props, evaluate it and render the children of <code>Then</code> if the result is truthy, otherwise render the children of <code>Else</code>.</p>\n<blockquote>\n<p>Note that, in order for this to work, <code>If</code> <strong>must</strong> be the parent of <code>Then</code> and <code>Else</code>. Violation of this constraint would make the code not working as expected.</p>\n</blockquote>\n<h3 id=\"if\"><a href=\"#if\" aria-label=\"if permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>If</h3>\n<p>Let’s see the code of the <code>If</code> component:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-jsx line-numbers\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">If</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">props</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> thenComponent <span class=\"token operator\">=</span>\n    <span class=\"token string\">'length'</span> <span class=\"token keyword\">in</span> props<span class=\"token punctuation\">.</span>children\n      <span class=\"token operator\">?</span> props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">child</span> <span class=\"token operator\">=></span> child<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">.</span>name <span class=\"token operator\">===</span> <span class=\"token string\">'Then'</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">:</span> props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">.</span>name <span class=\"token operator\">===</span> <span class=\"token string\">'Then'</span>\n      <span class=\"token operator\">?</span> props<span class=\"token punctuation\">.</span>children\n      <span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> elseComponent <span class=\"token operator\">=</span>\n    <span class=\"token string\">'length'</span> <span class=\"token keyword\">in</span> props<span class=\"token punctuation\">.</span>children\n      <span class=\"token operator\">?</span> props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">child</span> <span class=\"token operator\">=></span> child<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">.</span>name <span class=\"token operator\">===</span> <span class=\"token string\">'Else'</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">:</span> props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">.</span>name <span class=\"token operator\">===</span> <span class=\"token string\">'Else'</span>\n      <span class=\"token operator\">?</span> props<span class=\"token punctuation\">.</span>children\n      <span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> props<span class=\"token punctuation\">.</span>condition <span class=\"token operator\">?</span> thenComponent <span class=\"token punctuation\">:</span> elseComponent<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>The component logic is quite simple: we evaluate <code>props.condition</code> and return <code>Then</code> or <code>Else</code> depending on the result of the evaluation (see the <code>return</code> statement).</p>\n<p>Let’s focus on the assignment of <code>thenComponent</code> (the same considerations hold for <code>elseComponent</code>):</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-jsx line-numbers\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> thenComponent <span class=\"token operator\">=</span>\n  <span class=\"token string\">'length'</span> <span class=\"token keyword\">in</span> props<span class=\"token punctuation\">.</span>children\n    <span class=\"token operator\">?</span> props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">child</span> <span class=\"token operator\">=></span> child<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">.</span>name <span class=\"token operator\">===</span> <span class=\"token string\">'Then'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">:</span> props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">.</span>name <span class=\"token operator\">===</span> <span class=\"token string\">'Then'</span>\n    <span class=\"token operator\">?</span> props<span class=\"token punctuation\">.</span>children\n    <span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>We first check if <code>props.children</code> is an array or an object by testing the presence of <code>length</code> property:</p>\n<ul>\n<li>if <code>props.children</code> is an array, we look for the child whose name is <code>\"Then\"</code>, and we assign it to <code>thenComponent</code></li>\n<li>if <code>props.children</code> is not an array, we check if it is an instance of <code>Then</code>, and we assign it to <code>thenComponent</code></li>\n</ul>\n<p>If both tests fail, we assign <code>null</code> to <code>thenComponent</code> (so nothing will be rendered).</p>\n<h3 id=\"thenelse\"><a href=\"#thenelse\" aria-label=\"thenelse permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Then/Else</h3>\n<p>Implementation of <code>Then</code> and <code>Else</code> component is the same. Let’s see the code for the <code>Then</code> component as a representative example:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-jsx line-numbers\"><code class=\"language-jsx\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Then</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">props</span> <span class=\"token operator\">=></span> props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>This super-tricky function returns its children. Easy enough.</p>\n<h2 id=\"final-considerations\"><a href=\"#final-considerations\" aria-label=\"final considerations permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Final Considerations</h2>\n<p>We can pass just <code>Then</code> to <code>If</code> when we want to render something only if the condition is truthy:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-jsx line-numbers\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">If</span></span> <span class=\"token attr-name\">condition</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">1</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span> <span class=\"token operator\">===</span> <span class=\"token number\">2</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Then</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">1 plus 1 equals 2</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Then</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">If</span></span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>This is equivalent to inline <code>if</code> with logical <code>&#x26;&#x26;</code> operator, which is quicker to write but produces less readable code.</p>\n<p>The same is valid for <code>Else</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-jsx line-numbers\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">If</span></span> <span class=\"token attr-name\">condition</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>myCondition<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Else</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">myCondition is false</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Else</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">If</span></span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>In this case, we could just negate the condition and change <code>Else</code> with <code>Then</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-jsx line-numbers\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">If</span></span> <span class=\"token attr-name\">condition</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token operator\">!</span>myCondition<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Then</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">myCondition is false</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Then</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">If</span></span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<h2 id=\"live-demo\"><a href=\"#live-demo\" aria-label=\"live demo permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Live Demo</h2>\n<p>See the live demo on <a href=\"https://codesandbox.io/s/4wrn34q7pw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CodeSandbox</a>.</p>","fields":{"slug":"/conditional-rendering-in-react/"},"frontmatter":{"title":"Conditional Rendering In React","date":"March 11, 2019","published_time":"2019-03-11","description":"A component composition-based approach to conditional rendering.","tags":["react","jsx","hooks","conditional rendering","component composition"],"cover":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAgAD/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAL/2gAMAwEAAhADEAAAAcwkjKcf/8QAGhAAAwADAQAAAAAAAAAAAAAAAAECERITIv/aAAgBAQABBQJ1OfLnMGiNEc5P/8QAFhEAAwAAAAAAAAAAAAAAAAAAAAES/9oACAEDAQE/AbRaP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAEFAAAAAAAAAAAAAAAAABARICEycf/aAAgBAQAGPwKRZMZ//8QAGhAAAwEBAQEAAAAAAAAAAAAAAAERITFBUf/aAAgBAQABPyHK4HZXEt3wxTqgvmXbbWvpbw//2gAMAwEAAgADAAAAEIv/AP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QA//EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPxCMjP/EAB0QAAIDAAIDAAAAAAAAAAAAAAERACExQVFhobH/2gAIAQEAAT8QOoEbJ3mj7EeD0R19QEoM1jpnzUHaKwthYoBEeYVm6q5//9k=","aspectRatio":2.3333333333333335,"src":"/static/8fa3a966c07e3f331073b7a1a5833c15/acf46/cover.jpg","srcSet":"/static/8fa3a966c07e3f331073b7a1a5833c15/74a6a/cover.jpg 350w,\n/static/8fa3a966c07e3f331073b7a1a5833c15/047db/cover.jpg 700w,\n/static/8fa3a966c07e3f331073b7a1a5833c15/acf46/cover.jpg 1400w,\n/static/8fa3a966c07e3f331073b7a1a5833c15/dcb90/cover.jpg 1600w","srcWebp":"/static/8fa3a966c07e3f331073b7a1a5833c15/e6b98/cover.webp","srcSetWebp":"/static/8fa3a966c07e3f331073b7a1a5833c15/e5785/cover.webp 350w,\n/static/8fa3a966c07e3f331073b7a1a5833c15/1b440/cover.webp 700w,\n/static/8fa3a966c07e3f331073b7a1a5833c15/e6b98/cover.webp 1400w,\n/static/8fa3a966c07e3f331073b7a1a5833c15/702cd/cover.webp 1600w","sizes":"(max-width: 1400px) 100vw, 1400px","presentationWidth":1400,"originalImg":"/static/8fa3a966c07e3f331073b7a1a5833c15/dcb90/cover.jpg"}}}}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/conditional-rendering-in-react/","previous":{"fields":{"slug":"/work-in-progress/"},"frontmatter":{"title":"Work In Progress"}},"next":{"fields":{"slug":"/you-will-stop-using-localstorage/"},"frontmatter":{"title":"You Will Stop Using LocalStorage"}}}}}