<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>React Archives | DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/tag/react/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Thu, 27 Aug 2026 16:09:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://static.dmcinfo.com/wp-content/uploads/2025/04/site-icon-150x150.png</url>
	<title>React Archives | DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Starting a DBA Dashboard with Next.js 16 and React: Dev Diary #1</title>
		<link>https://static.dmcinfo.com/blog/41208/building-a-dba-dashboard-with-react-and-next-js-part-1/</link>
		
		<dc:creator><![CDATA[Christopher Olsen]]></dc:creator>
		<pubDate>Mon, 04 May 2026 14:00:00 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Next.js]]></category>
		<category><![CDATA[React]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=41208</guid>

					<description><![CDATA[<p>React has been DMC&#8217;s JavaScript framework of choice for over 10 years. In recent years, we&#8217;ve been using it alongside Next.js to build maintainable, scalable, full-stack web applications. In this blog series, I&#8217;m going to demonstrate how to use React and Next.js to build a DBA dashboard that offers a variety of tools to spot [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/41208/building-a-dba-dashboard-with-react-and-next-js-part-1/">Starting a DBA Dashboard with Next.js 16 and React: Dev Diary #1</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">React has been DMC&#8217;s JavaScript framework of choice for over 10 years. In recent years, we&#8217;ve been using it alongside Next.js to build maintainable, scalable, full-stack web applications. In this <a href="https://static.dmcinfo.com/blog/44831/material-ui-nextjs-16-app-router/">blog series</a>, I&#8217;m going to demonstrate how to use React and Next.js to build a DBA dashboard that offers a variety of tools to spot and troubleshoot performance or reliability issues with a SQL Server instance.</p>



<p class="wp-block-paragraph">I plan to use Better-Auth for authentication and Material UI as a UI component library, and of course, I&#8217;ll be using SQL Server (a.k.a. MSSQL). So, if you&#8217;d like to learn how to build a React app with Next.js, Better-Auth, Material UI, and MSSQL using Prisma ORM, I&#8217;m going to show you how to set it all up.</p>



<h2 class="wp-block-heading" id="h-scaffolding-a-next-js-app">Scaffolding <strong>a Next.js App</strong></h2>



<p class="wp-block-paragraph">The first step to building a Next.js app is to run the create-next-app CLI tool. First, make sure you&#8217;ve installed Node.js version 24 or later. Then, run <code>npx create-next-app@latest</code> the CLI tool and create the application. It presents us with the following options:</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="1054" height="955" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image.png" alt="" class="wp-image-41398" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image.png 1054w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-300x272.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1024x928.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-768x696.png 768w" sizes="(max-width: 1054px) 100vw, 1054px" /></figure>



<p class="wp-block-paragraph">I recommend the following options:</p>



<ol class="wp-block-list">
<li><strong>TypeScript</strong> &#8211; at DMC, we&#8217;ve used it for React applications since 2016 and have adopted it as a standard. TypeScript is a superset of JavaScript that adds strong typing so that, for example, you&#8217;ll get a compiler error if you try to assign an integer value to a string variable. Fully explaining TypeScript is outside of the scope of this article, but I strongly recommend using it for all React applications.</li>



<li><strong>ESLint</strong> &#8211; this is the gold standard linter for JavaScript/TypeScript, and you really can&#8217;t go wrong by choosing it.</li>



<li><strong>React Compiler</strong> &#8211; I have been very eager to try this out on a project ever since it was introduced to React. Among other things, this makes it so you don&#8217;t need to explicitly use the useMemo or useCallback hooks &#8211; the compiler will take care of those optimizations for you so that you can focus on building your app.</li>



<li><strong>src directory</strong> &#8211; this is a pretty standard setup for JavaScript/TypeScript applications.</li>



<li><strong>App Router</strong> &#8211; the alternative is Page Router, which is the legacy version of Next.js.</li>
</ol>



<p class="wp-block-paragraph">By default, the CLI tool gets us set up with a package-lock.json file, but I prefer to use Yarn as my package manager, so I like to delete that file and run <code>yarn install</code>. Then I keep the yarn.lock file in source control.</p>



<p class="wp-block-paragraph">The app scaffolded by the CLI tool can be run locally with the command <code>yarn dev</code>. Doing so shows me a placeholder home page that looks like the following:</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="1396" height="1138" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1.png" alt="" class="wp-image-41410" style="width:554px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1.png 1396w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1-300x245.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1-1024x835.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1-768x626.png 768w" sizes="(max-width: 1396px) 100vw, 1396px" /></figure>



<p class="wp-block-paragraph">When I&#8217;m building a new app, the first thing I do is clear out all the scaffolded content, like that placeholder page and the accompanying CSS. Once I&#8217;ve finished that, layout.tsx file and page.tsx file scaffolded by the CLI looks like the following:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TSX</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// layout.tsx
import type { Metadata } from "next";

export const metadata: Metadata = {
  title: "DBA Dashboard",
  description:
    "A dashboard UI for exploring the results from the SQL Server First Responder Kit stored procedures",
};

export default function RootLayout({
  children,
}: Readonly&lt;{
  children: React.ReactNode;
}>) {
  return (
    &lt;html lang="en">
      &lt;body>{children}&lt;/body>
    &lt;/html>
  );
}

// page.tsx
export default function Home() {
  return (
    &lt;div>
      &lt;main>
        &lt;header>
          &lt;h1>DBA Dashboard&lt;/h1>
        &lt;/header>
        &lt;p>
          Welcome to the DBA Dashboard! There's not much here yet, but stay
          tuned for updates as we build out the UI for exploring the results
          from the SQL Server First Responder Kit stored procedures.
        &lt;/p>
      &lt;/main>
    &lt;/div>
  );
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// layout.tsx</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">type</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">Metadata</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;next&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">metadata</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Metadata</span><span style="color: #D4D4D4"> = {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">title:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;DBA Dashboard&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">description:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;A dashboard UI for exploring the results from the SQL Server First Responder Kit stored procedures&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">RootLayout</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">children</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}: </span><span style="color: #4EC9B0">Readonly</span><span style="color: #D4D4D4">&lt;{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">children</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">React</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">ReactNode</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}&gt;) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">html</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lang</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;en&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">body</span><span style="color: #808080">&gt;</span><span style="color: #569CD6">{</span><span style="color: #9CDCFE">children</span><span style="color: #569CD6">}</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">body</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">html</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// page.tsx</span></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Home</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">main</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">header</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">h1</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DBA Dashboard</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">h1</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">header</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Welcome to the DBA Dashboard! There&apos;s not much here yet, but stay</span></span>
<span class="line"><span style="color: #D4D4D4">          tuned for updates as we build out the UI for exploring the results</span></span>
<span class="line"><span style="color: #D4D4D4">          from the SQL Server First Responder Kit stored procedures.</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">main</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">And here&#8217;s the resulting home page of our new Next.js app:</p>



<figure class="wp-block-image size-full is-resized has-custom-border"><img decoding="async" width="1164" height="1282" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2.png" alt="" class="has-border-color has-custom-black-border-color wp-image-41411" style="border-width:1px;width:631px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2.png 1164w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2-272x300.png 272w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2-930x1024.png 930w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2-768x846.png 768w" sizes="(max-width: 1164px) 100vw, 1164px" /></figure>



<p class="wp-block-paragraph">You may notice a little circular &#8220;N&#8221; button at the lower left corner &#8211; that&#8217;s a widget that Next.js gives us when running locally in dev mode. (TODO: Give more details about this, probably a link to documentation. This feature is new to me &#8211; apparently it&#8217;s called a &#8220;devIndicator&#8221;).</p>



<h2 class="wp-block-heading" id="h-configuring-the-next-js-app">Configuring the Next.js App</h2>



<p class="wp-block-paragraph">At the start of a new project, I like to get off on the right foot with regard to linting. Our scaffolded app is set up for ESLint out of the box, so I can run <code>yarn lint</code> to check for violations, and there are quite a few!</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1416" height="628" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3.png" alt="" class="wp-image-41412" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3.png 1416w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3-300x133.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3-1024x454.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3-768x341.png 768w" sizes="(max-width: 1416px) 100vw, 1416px" /></figure>



<p class="wp-block-paragraph">These violations are coming from files that were created by the CLI tool &#8211; I didn&#8217;t write this code. Because of that, I&#8217;d like to ignore these files when doing lint checks &#8211; to do that, I can add the &#8220;types&#8221; folder to the eslint.config.mjs file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">JavaScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";

const eslintConfig = defineConfig([
  ...nextVitals,
  ...nextTs,
  // Override default ignores of eslint-config-next.
  globalIgnores(&#91;
    // Default ignores of eslint-config-next:
    ".next/**",
    "out/**",
    "build/**",
    "next-env.d.ts",
    // Custom ignores:
    "types/**",
  &#93;),
]);

export default eslintConfig;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">defineConfig</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">globalIgnores</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;eslint/config&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nextVitals</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;eslint-config-next/core-web-vitals&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nextTs</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;eslint-config-next/typescript&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">eslintConfig</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">defineConfig</span><span style="color: #D4D4D4">([</span></span>
<span class="line"><span style="color: #D4D4D4">  ...</span><span style="color: #9CDCFE">nextVitals</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  ...</span><span style="color: #9CDCFE">nextTs</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// Override default ignores of eslint-config-next.</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">globalIgnores</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Default ignores of eslint-config-next:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;.next/**&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;out/**&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;build/**&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;next-env.d.ts&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Custom ignores:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;types/**&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  &#93;),</span></span>
<span class="line"><span style="color: #D4D4D4">]);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">eslintConfig</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p class="wp-block-paragraph">Now, if I run <code>yarn lint</code> again, it only raises one violation:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1212" height="394" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4.png" alt="" class="wp-image-41413" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4.png 1212w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4-300x98.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4-1024x333.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4-768x250.png 768w" sizes="(max-width: 1212px) 100vw, 1212px" /></figure>



<p class="wp-block-paragraph">Looks like I forgot to use an HTML entity for that apostrophe in my hard-coded text. So I&#8217;ll just fix that:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TSX</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// page.tsx
export default function Home() {
  return (
    &lt;div>
      &lt;main>
        &lt;header>
          &lt;h1>DBA Dashboard&lt;/h1>
        &lt;/header>
        &lt;p>
          Welcome to the DBA Dashboard! There&apos;s not much here yet, but stay
          tuned for updates as we build out the UI for exploring the results
          from the SQL Server First Responder Kit stored procedures.
        &lt;/p>
      &lt;/main>
    &lt;/div>
  );
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// page.tsx</span></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Home</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">main</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">header</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">h1</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DBA Dashboard</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">h1</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">header</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Welcome to the DBA Dashboard! There&apos;s not much here yet, but stay</span></span>
<span class="line"><span style="color: #D4D4D4">          tuned for updates as we build out the UI for exploring the results</span></span>
<span class="line"><span style="color: #D4D4D4">          from the SQL Server First Responder Kit stored procedures.</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">main</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">After fixing that, ESLint raises no violations, so now we&#8217;re officially starting with a squeaky-clean codebase!</p>



<figure class="wp-block-image size-full"><img decoding="async" width="412" height="181" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-5.png" alt="" class="wp-image-41414" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-5.png 412w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-5-300x132.png 300w" sizes="(max-width: 412px) 100vw, 412px" /></figure>



<p class="wp-block-paragraph" style="margin-bottom:var(--wp--preset--spacing--50)">In the next blog post, we&#8217;ll be adding a component library to our project: Material UI. A high-quality component library like Material UI makes it easy to build a professional-looking user interface for our dashboard.</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step">Have an upcoming project? DMC can help you take the next step.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Take your project to the next level with engineering solutions from DMC. Learn more about our <a href="https://static.dmcinfo.com/services/application-development/" id="https://static.dmcinfo.com/services/application-development/">Application Development</a> solutions or contact us to get started today!</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/41208/building-a-dba-dashboard-with-react-and-next-js-part-1/">Starting a DBA Dashboard with Next.js 16 and React: Dev Diary #1</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sorting Multiple Columns in a Table with React</title>
		<link>https://static.dmcinfo.com/blog/19887/sorting-multiple-columns-in-a-table-with-react/</link>
		
		<dc:creator><![CDATA[Rafael Rejuso]]></dc:creator>
		<pubDate>Tue, 02 Jun 2020 14:08:49 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[PC Application Development]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[React]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/19887/sorting-multiple-columns-in-a-table-with-react/</guid>

					<description><![CDATA[<p>Tables are a fast way to show a lot of valuable data. There are many guides on sorting tables by a column in React, but sorting multiple columns is something that can take some effort. At the end of this guide, you should have a sortable table where you can click multiple columns. For this [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/19887/sorting-multiple-columns-in-a-table-with-react/">Sorting Multiple Columns in a Table with React</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Tables are a fast way to show a lot of valuable data. There are many guides on sorting tables by a column in React, but sorting multiple columns is something that can take some effort. At the end of this guide, you should have a sortable table where you can click multiple columns.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sorting-mulitple-columns-react.gif" alt="Sorting mulitple columns with React"/></figure>



<p class="wp-block-paragraph">For this tutorial, we will be leveraging the use of LINQ&nbsp;to make sorting quite painless, and optionally Material-UI for styling the table. At the very end, I will also briefly describe a way of implementing this table without using LINQ&nbsp;and only using base React.</p>



<h2 class="wp-block-heading" id="h-tools-used-in-this-blog">Tools Used in this Blog:</h2>



<ul class="wp-block-list">
<li>LINQ&nbsp;</li>



<li><a href="https://static.dmcinfo.com/latest-thinking/blog/id/10114/a-simple-guide-to-material-ui-grids">Material-UI </a><em>(Optional)</em></li>



<li>Basic React hooks</li>



<li>Functional React</li>
</ul>



<h2 class="wp-block-heading" id="h-setup">Setup</h2>



<p class="wp-block-paragraph">First, we need some data.&nbsp;For the purposes of this example, I just created some dummy data that we can sort. I also defined an interface for the data type and an enum for departments that a person can belong to.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> const dataList=&#91;
    {name: 'Ryan H.',   hours: 30, startDate: new Date('2019-01-14'), department: Department.Marketing},
    {name: 'Ariel P.',  hours: 22, startDate: new Date('2017-03-12'), department: Department.Sales},
    {name: 'Ryan Y.',   hours: 31, startDate: new Date('2015-09-12'), department: Department.Marketing},
    {name: 'Ed T.',     hours: 22, startDate: new Date('2017-03-12'), department: Department.Engineering},
    {name: 'Matt G.',   hours: 30, startDate: new Date('2017-03-12'), department: Department.Marketing},
    {name: 'Olivia H.', hours: 32, startDate: new Date('2018-05-10'), department: Department.Engineering}&#93; as TableData[];</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">dataList</span><span style="color: #D4D4D4">=&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Ryan H.&apos;</span><span style="color: #D4D4D4">,   </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2019-01-14&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Marketing</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Ariel P.&apos;</span><span style="color: #D4D4D4">,  </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">22</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2017-03-12&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Sales</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Ryan Y.&apos;</span><span style="color: #D4D4D4">,   </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">31</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2015-09-12&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Marketing</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Ed T.&apos;</span><span style="color: #D4D4D4">,     </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">22</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2017-03-12&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Engineering</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Matt G.&apos;</span><span style="color: #D4D4D4">,   </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2017-03-12&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Marketing</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Olivia H.&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2018-05-10&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Engineering</span><span style="color: #D4D4D4">}&#93; </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">[];</span></span></code></pre></div>



<p class="wp-block-paragraph">Our interface is <strong>TableData.</strong>&nbsp;We have an enum called <strong>Departments</strong> which lists the available department&#8217;s people may be in:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>interface TableData{
    name: String,
    hours: number,
    startDate: Date,
    department: Department
}

enum Department{
    Marketing = 'Marketing',
    Sales = 'Sales',
    Engineering = 'Engineering',
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hours</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">startDate</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Date</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">department</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Department</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">enum</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Department</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Marketing</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&apos;Marketing&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Sales</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&apos;Sales&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Engineering</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&apos;Engineering&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">It’s important to note that this interface and enum is solely for structuring our table, and not for sorting. We will eventually add another interface and enum for sorting.</p>



<p class="wp-block-paragraph">For the case of simulation, I’ll be placing the data into another file and returning it from a function call called <strong>fetchData.</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>export const fetchData = () => { return dataList;}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">fetchData</span><span style="color: #D4D4D4"> = () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> { </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">;}</span></span></code></pre></div>



<p class="wp-block-paragraph">For the table, we’ll be using Material-UI, but this method will absolutely work with just a regular table. If you don’t want to use Material-UI tables, just replace the tags with the corresponding ones below. Everything but TableBody has a corresponding tag which just contains a collection of &lt;tr&gt; tags.</p>


<table style="width:100%; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; margin-bottom:40px;">
<tbody>
<tr style="text-align:center;">
<th style="border-collapse:collapse; border-style:solid; border-width:medium; border-spacing: 20px; border:1px solid black; height:100px; font-size:24px; border-right-style:solid; border-right-width:medium; border-left-style:solid; border-left-width:medium;">MaterialUI</th>
<th style="border-collapse:collapse; border-style:solid; border-width:medium; border-spacing: 20px; border:1px solid black; height:100px; font-size:24px; border-right-style:solid; border-right-width:medium; border-left-style:solid; border-left-width:medium;">HTML</th>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">TableHead</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">th</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">TableBody</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">&#8211;</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">TableRow</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">tr</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">TableCell</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">td</td>
</tr>
</tbody>
</table>


<p class="wp-block-paragraph">Now we pull our data from the other file by calling <strong>fetchData</strong>, set up the appropriate table headers, and map our data to the corresponding table cells. For the sake of keeping clean code, I moved the sortable table headers to another component, so our code should look somewhat like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import React from "react";
import {Table, TableRow, TableCell, TableBody } from '@material-ui/core';
import { fetchData, TableData } from "./fetchData";
import { SortableHeader } from "./sortableTableHeader";

export const TableExample = () => {
    const dataList = fetchData();
    return(
        &lt;div>
            &lt;Table>
                &lt;SortableHeader/>
                &lt;TableBody>
                    {dataList.map((data) => { return(
                        &lt;TableRow>
                            &lt;TableCell>
                                {data.name}
                            &lt;/TableCell>
                            &lt;TableCell>
                                {data.hours}
                            &lt;/TableCell>
                            &lt;TableCell>
                                {data.startDate.toDateString()}
                            &lt;/TableCell>
                            &lt;TableCell>
                                {data.department}
                            &lt;/TableCell>
                        &lt;/TableRow>
                        )})}
                &lt;/TableBody>
            &lt;/Table>
        &lt;/div>
    )
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">React</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;react&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> {</span><span style="color: #9CDCFE">Table</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableBody</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;@material-ui/core&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">fetchData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableData</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;./fetchData&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">SortableHeader</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;./sortableTableHeader&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">TableExample</span><span style="color: #D4D4D4"> = () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">dataList</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">fetchData</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #4EC9B0">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">Table</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #9CDCFE">SortableHeader</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableBody</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    {</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">map</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">) =&gt; { </span><span style="color: #DCDCAA">return</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">hours</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">startDate</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">toDateString</span><span style="color: #D4D4D4">()}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">department</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                        )})}</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;/</span><span style="color: #9CDCFE">TableBody</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">Table</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import React from "react";
import { TableHead, TableRow, TableCell } from "@material-ui/core";

export const SortableHeader = () => {
    return (
        &lt;TableHead>
            &lt;TableRow>
                &lt;TableCell>Name&lt;/TableCell>
                &lt;TableCell>Hours&lt;/TableCell>
                &lt;TableCell>Date&lt;/TableCell>
                &lt;TableCell>Department&lt;/TableCell>
            &lt;/TableRow>
        &lt;/TableHead>
    );
};</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">React</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;react&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@material-ui/core&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SortableHeader</span><span style="color: #D4D4D4"> = () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #4EC9B0">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Hours</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Date</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<p class="wp-block-paragraph">Which outputs something like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/1-react-tables-bad.png" alt=""/></figure>



<h2 class="wp-block-heading" id="h-implementation">Implementation</h2>



<p class="wp-block-paragraph">Our overall goal is to create an ordered queue of sorting configurations that will apply each sorting in order through the use of LINQ&nbsp;to our data. We will then update our data list which will be re-rendered and displayed in the desired sorting configuration.</p>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 1: Define a Sorting configuration</strong></p></p>



<p class="wp-block-paragraph">A sorting configuration is essentially an object that has two things. The property/column of the list that we’re trying to sort, and the sorting type such as ascending or descending. Since our rows are all the same object type: TableData, we can use keyof TableData to get all the properties/columns of our table. The only thing we’d have to do is make an enum of the different sorting types that we need, in this case we’ll stick with the standard ascending/descending.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>interface SortingConfiguration{
    propertyName: keyof TableData,
    sortType: SortingType,
}

enum SortingType{
    Ascending,
    Descending,</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">SortingType</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">enum</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortingType</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Ascending</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Descending</span><span style="color: #D4D4D4">,</span></span></code></pre></div>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 2: Utilize useState to Maintain a List of our Sorting Configurations</strong></p></p>



<p class="wp-block-paragraph">If you’ve never used <strong>useState</strong>, it’s a React hook that returns an array of two things: the first being the state of an object that is being maintained. The second is basically a function/dispatch that you can call to change the state. Here we’re initializing our list of sorting configurations to be an empty list since we want to start off with an unsorted table.</p>



<p class="wp-block-paragraph">Note: If you do want a table column to be sorted by default, all you would need to do is add a <strong>SortConfiguration </strong>object in between the square brackets</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>  const &#91;sortConfig, updateSortConfig&#93; = useState&lt;SortingConfiguration[]>([]);
    //Below is an example of sorting columns by name by default.
    const &#91;initializedSortConfig, updateInitSortConfig&#93; = useState&lt;SortingConfiguration[]>(&#91;
        {propertyName: 'name', sortConfig: SortingType.Descending}
    &#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #4FC1FF">sortConfig</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">updateSortConfig</span><span style="color: #D4D4D4">&#93; = </span><span style="color: #DCDCAA">useState</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">[]&gt;([]);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">//Below is an example of sorting columns by name by default.</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #4FC1FF">initializedSortConfig</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">updateInitSortConfig</span><span style="color: #D4D4D4">&#93; = </span><span style="color: #DCDCAA">useState</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">[]&gt;(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortConfig:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;);</span></span></code></pre></div>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 3: Create a Function That Adds, Modifies, and Removes Our Sorting Configurations</strong></p></p>



<p class="wp-block-paragraph">Most sortable headers are clickable headers that switch between a cycle of unsorted -&gt; descending -&gt; ascending -&gt; unsorted -&gt; etc, but there are many different orders or ways in which you may wish to set this up. You should be able to create your own custom function that edits the sorting configuration given three basic criteria:</p>



<ol class="wp-block-list">
<li>Add a sorting configuration to a column when there is not an existing configuration</li>



<li>Modify a sorting configuration when there is an existing configuration
 
 
<ul class="wp-block-list">
<li>For example, going from descending to ascending, or vice versa</li>
</ul>
</li>



<li>Provide a way to remove a sorting configuration
 
 
<ul class="wp-block-list">
<li>This can be a part of criteria #2, but it is important enough to warrant its own criteria</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">We’ll be following a cycle of unsorted -&gt; descending -&gt; ascending -&gt; unsorted -&gt; etc… for the purposes of this guide.</p>



<p class="wp-block-paragraph">We will be making a function called sortBy that will take in a key of TableData. Basically, whenever we call sortBy on a given property/column, it should automatically fulfill our three criteria: add a new configuration when we don’t have one, alter a configuration if we do, and remove a configuration when we need to. We wrap it in a <strong>useCallback </strong>because, in the next step, we will pass this function down to a prop.</p>



<p class="wp-block-paragraph">So our basic structure looks like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> const sortBy = useCallback(
        (propertyName: keyof TableData) => {
            let pendingChange = &#91;...sortConfig&#93;;
            const index = pendingChange.findIndex((config) => 
       						config.propertyName === 	propertyName)
            if(index > -1){
                // Existing configuration
            } else {
                // No existing configuration
            }
            updateSortConfig(&#91;...pendingChange&#93;);
        },
        &#91;sortConfig&#93;
    )</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortBy</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useCallback</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        (</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;...</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">index</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">findIndex</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">       						</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === 	</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4"> &gt; -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">// Existing configuration</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">// No existing configuration</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">updateSortConfig</span><span style="color: #D4D4D4">(&#91;...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span></code></pre></div>



<p class="wp-block-paragraph">We use the spread operator to make a copy of the <strong>sortConfiguration</strong>. Then we use <strong>findIndex </strong>to search our copied list and see if there is an existing configuration that’s in our list. We’ll be using a lot of the spread operator, so if you aren’t experienced with using it, you can see more examples in <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9668/categoryid/95/5-great-uses-of-the-spread-operator-in-a-react-app">this blog by Jacob Bruce</a>. Now that we have the basic structure laid out, let’s address the first criteria. This one is relatively simple since all we’re doing is adding a sorting configuration given the propertyName that was passed in:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>  if(index > -1){
                // Existing configuration
            } else {
                pendingChange = &#91;
                    ...pendingChange,
                    { propertyName: propertyName, sortType: SortingType.Descending },
                &#93;;
            }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4"> &gt; -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">// Existing configuration</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                    ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                    { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">                &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span></code></pre></div>



<p class="wp-block-paragraph">Here we use the spread operator to push a new sorting configuration to the end of the queue.</p>



<p class="wp-block-paragraph">Now we have to handle our second and third criteria which you can only do on an existing configuration. We can remove extra code if instead of modifying we save the existing sort direction, remove the current configuration and lastly, add in a new configuration if it’s necessary to ‘modify’. Technically, our modification is removing a configuration of a property and adding in the same property back, but with a different sortType, but doing it this way makes it so we don’t have to write two similar code branches.</p>



<p class="wp-block-paragraph">In short, we use our index we found to store the existing sort type. We then remove that configuration using splice. Lastly, we use our saved sorting type to determine if we needed to add a new configuration. In this example, we check if it’s Descending, and if that’s the case, we change that sortType to Ascending. Note how, if the sorting type is Ascending, we do not ‘modify’ our sorting configuration list, but rather just let the code remove the configuration.</p>



<p class="wp-block-paragraph">Put together we have:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> const sortBy = useCallback(
        (propertyName: keyof TableData) => {
            let pendingChange = &#91;...sortConfig&#93;;
            const index = pendingChange.findIndex((config) => 
                                    config.propertyName === propertyName)
            if(index > -1){
                //Save the sortType
                var currentSortType = pendingChange&#91;index&#93;.sortType;
                //Remove existing config
                pendingChange.splice(index, 1);
                //check if the sort type we saved is descending
                if (currentSortType === SortingType.Descending) {
                    pendingChange = &#91;
                        ...pendingChange,
                        { propertyName: propertyName, sortType: SortingType.Ascending },
                    &#93;;
                }
            } else {
                pendingChange = &#91;
                    ...pendingChange,
                    { propertyName: propertyName, sortType: SortingType.Descending },
                &#93;;
            }
            updateSortConfig(&#91;...pendingChange&#93;);
        },
        &#91;sortConfig&#93;
    )</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortBy</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useCallback</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        (</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;...</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">index</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">findIndex</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">                                    </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4"> &gt; -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Save the sortType</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">currentSortType</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Remove existing config</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">splice</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//check if the sort type we saved is descending</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">currentSortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                        ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                        { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">                    &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                    ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                    { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">                &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">updateSortConfig</span><span style="color: #D4D4D4">(&#91;...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span></code></pre></div>



<p class="wp-block-paragraph">Now the loop of unsorted -&gt; descending -&gt; ascending -&gt; unsorted -&gt; etc… is complete.</p>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 4: Attach Our Function to the Table Headers</strong></p></p>



<p class="wp-block-paragraph">Now that we created our function, we need to attach it to table headers and make them something we can click. Since we’re passing down our props to our <strong>SortableTableHeader </strong>don’t forget to export our interfaces and enums to avoid errors. We’ll need to pass two things to our SortableTableHeader the first is our newly created sortBy function, and the second is our current <strong>sortConfig </strong>which will be used for arrow indicators to show what direction we’re sorting.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Table>
    &lt;SortableHeader 
          sortBy={sortBy} 
          sortConfig={sortConfig}
          />
      &lt;TableBody>
		………
&lt;/Table>
&lt;/TableBody>
&lt;/pre>

&lt;pre class="brush:js">
interface SortableHeaderProps{
    sortBy: (string: keyof TableData) => void;
    sortConfig: SortingConfiguration[];
}

export const SortableHeader = ({sortBy, sortConfig}:SortableHeaderProps) => {
    return (
        &lt;TableHead>
            &lt;TableRow>
                &lt;TableCell>Name&lt;/TableCell>
                &lt;TableCell>Hours&lt;/TableCell>
                &lt;TableCell>Date&lt;/TableCell>
                &lt;TableCell>Department&lt;/TableCell>
            &lt;/TableRow>
        &lt;/TableHead>
    );
};</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">Table</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;</span><span style="color: #9CDCFE">SortableHeader</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">sortBy</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">sortBy</span><span style="color: #D4D4D4">} </span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">          /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;</span><span style="color: #4EC9B0">TableBody</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">		………</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">Table</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableBody</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">pre</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">&lt;</span><span style="color: #9CDCFE">pre</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;brush:js&quot;</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortableHeaderProps</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">: (</span><span style="color: #9CDCFE">string</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">void</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">[];</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SortableHeader</span><span style="color: #D4D4D4"> = ({</span><span style="color: #9CDCFE">sortBy</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">}:</span><span style="color: #4EC9B0">SortableHeaderProps</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #4EC9B0">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Hours</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Date</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<p class="wp-block-paragraph">To keep code DRY, I’ll be making a list of the columns that we want, and the TableData property they correspond to. This way, we can map over the function without copy/pasting TableCell four times.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const tableColumn = &#91;
        {label:'Name', property:'name'},
        {label:'Hours', property:'hours'},
        {label:'Date', property:'startDate'},
        {label:'Department', property:'department'}
        &#93; as TableColumn[];</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">tableColumn</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Name&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Hours&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;hours&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Date&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;startDate&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Department&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;department&apos;</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93; </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableColumn</span><span style="color: #D4D4D4">[];</span></span></code></pre></div>



<p class="wp-block-paragraph">Now, we can attach our function to the tablecell by adding the onClick prop to the <strong>TableCell</strong>, and pass in the corresponding property for the column being mapped. We can also apply our CSS stylings to the table cells at this point. Here I use Material UI’s styling solution, but the key point when doing this is setting the CSS property <em>cursor: ‘pointer’</em>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> &lt;TableHead>
            &lt;TableRow>
                {tableColumn.map((column, index) => {
                    return(
                        &lt;TableCell key={index} 
                            className={headerCell}
                            onClick={()=>sortBy(column.property)}
                        >
                            {column.label}
                        &lt;/TableCell>
                    )
                })}
            &lt;/TableRow>
        &lt;/TableHead></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> &lt;</span><span style="color: #4EC9B0">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span><span style="color: #9CDCFE">tableColumn</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">map</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">} </span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">headerCell</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #9CDCFE">onClick</span><span style="color: #D4D4D4">={()=&gt;</span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">(column.property)}</span></span>
<span class="line"><span style="color: #D4D4D4">                        &gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            {</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">label</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    )</span></span>
<span class="line"><span style="color: #D4D4D4">                })}</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Lastly, we’ll add an indicator arrow through conditional rendering to show the current sort direction. To do this, we have two conditionals to check what we render. The first is checking if there is an existing sorting configuration, and the second is checking if the sortType is ascending/descending. To make this easier, we can write a simple function that gets us the current sortType from the sorting configuration and returns an appropriate icon.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> const getSortDirection = (property:keyof TableData) => {
        var config = sortConfig.find((sortConfig) => sortConfig.propertyName === property)
        if(config){
            if(config.sortType === SortingType.Descending){
                return &lt;ArrowDownwardIcon/>
            }
            else {
                return &lt;ArrowUpwardIcon/>
            }
        }
        return null;
    }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getSortDirection</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">:</span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">find</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #4EC9B0">ArrowDownwardIcon</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            else {</span></span>
<span class="line"><span style="color: #D4D4D4">                return &lt;</span><span style="color: #4EC9B0">ArrowUpwardIcon</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        return null;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span></code></pre></div>



<p class="wp-block-paragraph">Our <strong>SortableTableHeader </strong>code should now look like this, with the appropriate CSS stylings applied in place of <strong>headerCell </strong>and <strong>sortLabel</strong>, if you aren’t using Material-UI.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>export const SortableHeader = ({sortBy, sortConfig}:SortableHeaderProps) => {

    const {headerCell, sortLabel} = useStyles();

    const tableColumn = &#91;
        {label:'Name', property:'name'},
        {label:'Hours', property:'hours'},
        {label:'Date', property:'startDate'},
        {label:'Department', property:'department'}
        &#93; as TableColumn[];

    const getSortDirection = (property:keyof TableData) => {
        var config = sortConfig.find((sortConfig) => sortConfig.propertyName === property)
        return config ?
            config.sortType === SortingType.Descending ?
                &lt;ArrowDownwardIcon/>
                :&lt;ArrowUpwardIcon/>
            :null
    }

    return (
        &lt;TableHead>
            &lt;TableRow>
                {tableColumn.map((column, index) => {
                    return(
                        &lt;TableCell key={index} 
                            className={headerCell}
                            onClick={()=>sortBy(column.property)}
                        >
                            &lt;span className={sortLabel}>
                                {column.label}
                                {getSortDirection(column.property)}
                            &lt;/span>
                        &lt;/TableCell>
                    )
                })}
            &lt;/TableRow>
        &lt;/TableHead>
    );
};</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SortableHeader</span><span style="color: #D4D4D4"> = ({</span><span style="color: #9CDCFE">sortBy</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">}:</span><span style="color: #4EC9B0">SortableHeaderProps</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> {</span><span style="color: #4FC1FF">headerCell</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">sortLabel</span><span style="color: #D4D4D4">} = </span><span style="color: #DCDCAA">useStyles</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">tableColumn</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Name&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Hours&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;hours&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Date&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;startDate&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Department&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;department&apos;</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93; </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableColumn</span><span style="color: #D4D4D4">[];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getSortDirection</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">:</span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">find</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4"> ?</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4"> ?</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #9CDCFE">ArrowDownwardIcon</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                :&lt;</span><span style="color: #4EC9B0">ArrowUpwardIcon</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            :</span><span style="color: #569CD6">null</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #4EC9B0">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span><span style="color: #9CDCFE">tableColumn</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">map</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">) =&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #DCDCAA">return</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">} </span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">headerCell</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #9CDCFE">onClick</span><span style="color: #D4D4D4">={()=&gt;</span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">(column.property)}</span></span>
<span class="line"><span style="color: #D4D4D4">                        &gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">span</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">sortLabel</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">label</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">getSortDirection</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">)}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">span</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    )</span></span>
<span class="line"><span style="color: #D4D4D4">                })}</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<p class="wp-block-paragraph">If everything went correctly, you should now see table headers with arrows showing the corresponding sort directions on them.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/2-react-tables-good.png" alt=""/></figure>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 5: Applying the Sort Configuration with LINQ</strong></p></p>



<p class="wp-block-paragraph">The last step is to finally apply the sorting in order.</p>



<p class="wp-block-paragraph">We’ll be defining our variable, ‘sortedRows’ by a useMemo function, with a dependency on sortConfig and dataList, so that we re-render our sortedRows whenever our sort configuration changes, or whenever our data list changes.</p>



<p class="wp-block-paragraph">Next, we can turn our standard list of items into a LINQ list by putting it in a LINQ.from call. Now, in order to leverage LINQ&#8217;s sorting functionality, our list of values has to be an <strong>IOrderedEnumerable</strong> object. We can get this by applying a basic orderBy function to our LINQ and passing it a lambda that just returns one, which basically says sort this by the key ‘nothing’, and return ‘1’ in all cases to avoid doing any comparison. This returns us our list in an unmodified order, but as an IOrderedEnumerable type.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> //Set up default ordering
        let sorted = linq.from(dataList).orderBy(() => 1);
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #6A9955">//Set up default ordering</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">linq</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">from</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">orderBy</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">The reason why we want to do this is so we can apply multiple sorts on top of this which is possible by using the thenBy and <strong>thenyByDescending </strong>functions from LINQ and using those requires an IOrderedEnumerable. Now that that’s established, we can loop through each of the sorting configurations in order and check which sort type we’re applying.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>let sorted = linq.from(dataList).orderBy(() => 1);
        //Loop through the queue
        sortConfig.forEach((sortConfig) => {
            if (sortConfig.sortType === SortingType.Ascending) {
                //Ascending sorting
            } else {
                //Descending sorting
            }
        });</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">linq</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">from</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">orderBy</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">//Loop through the queue</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">forEach</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Ascending sorting</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Descending sorting</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        });</span></span></code></pre></div>



<p class="wp-block-paragraph">Our last step in sorting is to apply the thenBy conditional on the corresponding property, and LINQ will handle the complicated sorting for us, including comparing integers, strings, and dates. You can read more on LINQ functions, and even pass in your own comparable which is useful for handling sorting between more complex types, but in the case of this guide, we’ll just stick to basic sorting since we’re handling primitive types. If it’s descending, we can use <strong>thenByDescending</strong> which makes things easier.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> if (sortConfig.sortType === SortingType.Ascending) {
                sorted = sorted
                    .thenBy((dataRow) => dataRow&#91;sortConfig.propertyName&#93;);
            } else {
                sorted = sorted
                    .thenByDescending((dataRow) => dataRow&#91;sortConfig.propertyName&#93;);
            }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sorted</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenBy</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sorted</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenByDescending</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span></code></pre></div>



<p class="wp-block-paragraph">In the code above, you see that the arguments for the lambda are an element of the <strong>sortedList. </strong>In this case, I named it <strong>dataRow</strong> because each item in the sorted is a LINQ&nbsp;from our dataList so we can think of it as one row. It then selects a corresponding key via the propertyName of our sortConfig, which as you recall is either “name”, “hours”, “startDate’, and “department”. In short, this is us targeting that specific column.</p>



<p class="wp-block-paragraph">Now, if you have null data, Javascript will run into the null comparison issue, which will mess up the sorting. A quick workaround I do is to sort all the data that is null on the bottom, but prefacing this <strong>thenBy</strong> with another thenBy that basically checks if the property is null.</p>



<p class="wp-block-paragraph">Here we return -1 when the data is null which means the object is ‘less than’ an object which does have data, and is sorted lower on the list.</p>



<p class="wp-block-paragraph">The last thing we need to do is to turn our LINQ into an array by calling <strong>.toArray()</strong>, and returning that value so that our <strong>sortedRows</strong> has an array of a sorted <strong>dataList</strong>. Putting it all together, we have this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const sortedRows = useMemo(() => {
        //Set up default ordering
        let sorted = linq.from(dataList).orderBy(() => 1);
        //Loop through the queue
        sortConfig.forEach((sortConfig) => {
            if (sortConfig.sortType === SortingType.Ascending) {
                sorted = sorted
                    .thenBy((dataRow) => (dataRow&#91;sortConfig.propertyName&#93; === null ? -1 : 1))
                    .thenBy((dataRow) => dataRow&#91;sortConfig.propertyName&#93;);
            } else {
                sorted = sorted
                    .thenByDescending((dataRow) =>
                    dataRow&#91;sortConfig.propertyName&#93; === null ? -1 : 1
                    )
                    .thenByDescending((dataRow) => dataRow&#91;sortConfig.propertyName&#93;);
            }
        });
        return sorted.toArray();
    }, &#91;sortConfig, dataList&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortedRows</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useMemo</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">//Set up default ordering</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">linq</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">from</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">orderBy</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">//Loop through the queue</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">forEach</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sorted</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenBy</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93; === </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4"> ? -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> : </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenBy</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sorted</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenByDescending</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93; === </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4"> ? -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> : </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">                    )</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenByDescending</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        });</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toArray</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    }, &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<p class="wp-block-paragraph">You should now have a functioning table with multiple sortable headers! A key thing to note is that you can pass a comparable to the thenBy function instead of just selecting by key. If for some reason things are not sorting as they should, that should be the first point of debugging.</p>



<h2 class="wp-block-heading" id="h-bonus-sorting-without-linq">Bonus: Sorting without LINQ</h2>



<p class="wp-block-paragraph">If you’ve made it this far, or just skipped ahead to this section, we’ll be going over the basics of sorting rows based on multiple headers by just using basic comparators.</p>



<p class="wp-block-paragraph">Comparators are just functions that take in two objects and return a number depending on how they relate to one another. A zero means they’re equal, positive numbers are greater, and negative numbers are less. Now let’s work on converting our sorting function to one that doesn’t use LINQ at all.</p>



<p class="wp-block-paragraph">Sorting multiple columns may seem complex, but in practice, it’s not really that difficult. Given a list of sorting configurations in the desired order, all you have to check is if the <strong>first comparator</strong> results in an equality, use the <strong>next comparator</strong> in order. If we have a list of {a ,1 }, {a , 2}, and {b, 1}. Sorting by the first column results in the equality of a’s. All we’d need to do is check our second column’s comparator to determine what order they should go in.</p>



<p class="wp-block-paragraph">In this guide, we’ve already implemented a function that can order our sort configurations for us. All we need to do is add a comparators to our SortConfiguration so we can keep track of which compare function we need to use.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>export interface SortingConfiguration{
    propertyName: keyof TableData,
    sortType: SortingType,
    compareFunction: TableDataComparable
}

export type TableDataComparable = ((a: TableData, b:TableData) => number);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">SortingType</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableDataComparable</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">type</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableDataComparable</span><span style="color: #D4D4D4"> = ((</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">:</span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p class="wp-block-paragraph">Next, we add that field to our sortBy function:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const sortBy = useCallback(
        (propertyName: keyof TableData, compareFunction: TableDataComparable) => {
            let pendingChange = &#91;...sortConfig&#93;;
            const index = pendingChange.findIndex((config) => config.propertyName === propertyName)
            if(index > -1){
                //Save the sortType
                var currentSortType = pendingChange&#91;index&#93;.sortType;
                //Remove existing config
                pendingChange.splice(index, 1);
                //check if the sort type we saved is descending
                if (currentSortType === SortingType.Descending) {
                    pendingChange = &#91;
                        ...pendingChange,
                        { propertyName: propertyName, sortType: SortingType.Ascending , compareFunction: compareFunction},
                    &#93;;
                }
            } else {
                pendingChange = &#91;
                    ...pendingChange,
                    { propertyName: propertyName, sortType: SortingType.Descending, compareFunction: compareFunction },
                &#93;;
            }
            updateSortConfig(&#91;...pendingChange&#93;);
        },
        &#91;sortConfig&#93;
    )</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortBy</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useCallback</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        (</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableDataComparable</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;...</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">index</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">findIndex</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4"> &gt; -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Save the sortType</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">currentSortType</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Remove existing config</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">splice</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//check if the sort type we saved is descending</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">currentSortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                        ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                        { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4"> , </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">                    &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                    ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                    { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">                &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">updateSortConfig</span><span style="color: #D4D4D4">(&#91;...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span></code></pre></div>



<p class="wp-block-paragraph">Next, we update our interfaces and define comparators for each of our table columns.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>interface SortableHeaderProps {
    sortBy: (string: keyof TableData, compareFunction: TableDataComparable) => void;
    sortConfig: SortingConfiguration[];
}
...
const CompareByEquality = (column: keyof TableData) => (a: TableData, b: TableData) => {
        if(a&#91;column&#93; === b&#91;column&#93;){
            return 0
        } else{
            if (a&#91;column&#93; > b&#91;column&#93;){
                return 1;
            }
            return -1;
        }
    }

    const tableColumn = [
        {   label: 'Name', 
            property: 'name', 
            compareFunction: 
            (a: TableData, b: TableData) => {
                 return a&#91;'name'&#93;.localeCompare(b&#91;'name'&#93; as string) 
            } 
        },
        {
            label: 'Hours', 
            property: 'hours',
            compareFunction: CompareByEquality('hours')
        },
        {   label: 'Date', 
            property: 'startDate', 
            compareFunction: CompareByEquality('startDate') 
        },
        {   label: 'Department',
            property: 'department', 
            compareFunction: CompareByEquality('department') }
    ] as TableColumn[];</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortableHeaderProps</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">: (</span><span style="color: #9CDCFE">string</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableDataComparable</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">void</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">[];</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">...</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CompareByEquality</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">&#93; === </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">&#93;){</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">        } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">&#93; &gt; </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">&#93;){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">tableColumn</span><span style="color: #D4D4D4"> = [</span></span>
<span class="line"><span style="color: #D4D4D4">        {   </span><span style="color: #9CDCFE">label:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Name&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">property:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">            (</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                 </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">&#91;</span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #DCDCAA">localeCompare</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">&#91;</span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">&#93; </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">) </span></span>
<span class="line"><span style="color: #D4D4D4">            } </span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">label:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Hours&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">property:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;hours&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CompareByEquality</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;hours&apos;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        {   </span><span style="color: #9CDCFE">label:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Date&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">property:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;startDate&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CompareByEquality</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;startDate&apos;</span><span style="color: #D4D4D4">) </span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        {   </span><span style="color: #9CDCFE">label:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Department&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">property:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;department&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CompareByEquality</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;department&apos;</span><span style="color: #D4D4D4">) }</span></span>
<span class="line"><span style="color: #D4D4D4">    ] </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableColumn</span><span style="color: #D4D4D4">[];</span></span></code></pre></div>



<p class="wp-block-paragraph">Here, I just use equality for returning the values, but for more complex objects, you can define your own comparator function. As for the name, I used string’s localCompare as an example of an in-line lambda comparator.</p>



<p class="wp-block-paragraph">After that, we just add the compareFunction into our onClick, so that our sortBy function has all the correct parameters.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;TableCell key={index}
    		className={headerCell}
   	 	onClick={() => sortBy(column.property, column.compareFunction)}
>
&lt;TableCell key={index}
    		className={headerCell}
   	 	onClick={() => sortBy(column.property, column.compareFunction)}
></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">    		</span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">headerCell</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">   	 	</span><span style="color: #9CDCFE">onClick</span><span style="color: #D4D4D4">={() =&gt; </span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">(column.property, column.compareFunction)}</span></span>
<span class="line"><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">    		</span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">headerCell</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">   	 	</span><span style="color: #9CDCFE">onClick</span><span style="color: #D4D4D4">={() =&gt; </span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">(column.property, column.compareFunction)}</span></span>
<span class="line"><span style="color: #D4D4D4">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Lastly, we need to change our definition for sortedRows:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const sortedRows = useMemo(() => {
        if(sortConfig.length === 0){
            return &#91;...dataList&#93;;
        }
        let sorted = &#91;...dataList&#93;.sort(
            (a: TableData, b:TableData) =>{
                 for(const config of sortConfig){
                    const result = (config.compareFunction(a,b))
                    if(result !== 0){
                        if(config.sortType === SortingType.Ascending){
                            return result;
                        }
                        else{
                            return -result;
                        }
                    }
                }
                return 0;
            }
        )
        return(sorted)
    }, &#91;sortConfig, dataList&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortedRows</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useMemo</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4"> === </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &#91;...</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = &#91;...</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #DCDCAA">sort</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            (</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">:</span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">                 </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">config</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">of</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">result</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">compareFunction</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4"> !== </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                        }</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> -</span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                        }</span></span>
<span class="line"><span style="color: #D4D4D4">                    }</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        )</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    }, &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<p class="wp-block-paragraph">First, we check if there’s a sort configuration and if there isn’t we want to go back to our unsorted state by returning a copy of the data list.</p>



<p class="wp-block-paragraph">If there is a sort configuration, we make a copy of dataList using the spread operator and sort with a lambda function that goes over our loop of sortConfigs. It then tests each a, and b, TableData against the compareFunction in the sortConfig. If we have an equal match, we try to and apply the subsequent sort config until we have a result that isn’t 0. Next, we check if it’s ascending or descending, and so we flip the result to its opposite value with a negative sign. Lastly, we finish going through our sort configuration and find that all matches, then we know both rows are equal.</p>



<p class="wp-block-paragraph">That about does it for sorting multiple columns in React.</p>



<p class="wp-block-paragraph"><strong>Learn more about DMC&#8217;s <a href="https://static.dmcinfo.com/services/application-development">Application Development expertise</a>.</strong></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/19887/sorting-multiple-columns-in-a-table-with-react/">Sorting Multiple Columns in a Table with React</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A Simple Guide to Material UI Grids</title>
		<link>https://static.dmcinfo.com/blog/20000/a-simple-guide-to-material-ui-grids/</link>
		
		<dc:creator><![CDATA[Rafael Rejuso]]></dc:creator>
		<pubDate>Wed, 22 Apr 2020 11:16:47 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[React]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/20000/a-simple-guide-to-material-ui-grids/</guid>

					<description><![CDATA[<p>If you’ve ever had to work with UI frameworks, you know that they can save lots of time on&#160;a project. I&#160;recently set up a layout for a complicated system using Material UI Grids for the first time. Since I didn&#8217;t find any&#160;simple tutorials to follow, I created this one. You will need these dependencies to [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/20000/a-simple-guide-to-material-ui-grids/">A Simple Guide to Material UI Grids</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">If you’ve ever had to work with UI frameworks, you know that they can save lots of time on&nbsp;a project. I&nbsp;recently set up a layout for a complicated system using Material UI Grids for the first time. Since I didn&#8217;t find any&nbsp;simple tutorials to follow, I created this one.</p>



<p class="wp-block-paragraph">You will need these dependencies to follow along:</p>



<ul class="wp-block-list">
<li>React</li>



<li>Material-UI</li>



<li>React Developer Tools (optional)</li>



<li>randomcolor (optional)</li>
</ul>



<h2 class="wp-block-heading" id="h-what-are-grids">What are Grids?</h2>



<p class="wp-block-paragraph">A <strong>grid </strong>is a container or item that automatically handles different screen sizes and orientations. The grids can change their size depending on the window’s current size and adjust shape accordingly. This ensures that we give the users exactly the best interface and it allows the content to appear consistent across different platforms.</p>



<h2 class="wp-block-heading" id="h-how-to-get-grids">How to <em>Get</em> Grids</h2>



<p class="wp-block-paragraph">If you already know how to add Material-UI to your current project, you can skip this section. Otherwise, you can add the dependency by running:</p>



<ul class="wp-block-list">
<li>npm install @material-ui/core or</li>



<li>yarn add @material-ui/core</li>
</ul>



<p class="wp-block-paragraph">To make this tutorial easier to follow, we’ll also be adding <em>randomcolor</em> so that we can visually see our grids easier.</p>



<p class="wp-block-paragraph">After that’s done, simply import all the elements we installed, and we can start working on learning the basics of Material-UI Grids.</p>



<p class="wp-block-paragraph">Let&#8217;s start with:&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import React from 'react';
import './App.css';
import {Grid} from '@material-ui/core';
import randomColor from 'randomcolor';

function App() {
  return (
    &lt;div className="App" style={{background:randomColor()}}>
     Hooray nothing is here!
    &lt;/div>
  );
}

export default App;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">React</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;react&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;./App.css&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> {</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">} </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;@material-ui/core&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">randomColor</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;randomcolor&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">     Hooray nothing is here!</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">App</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p class="wp-block-paragraph">It shows you something like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/1-nothingishere.png" alt=""/></figure>



<h2 class="wp-block-heading" id="h-getting-started-is-easy">Getting Started is Easy</h2>



<p class="wp-block-paragraph">To use Material UI Grids, we can&nbsp;start with wrapping our <strong>‘Hooray nothing is here!&#8217;</strong> with a Grid, and notice that nothing changes.</p>



<p class="wp-block-paragraph">You can think of <strong>Grids </strong>like a ‘replacement’ for a div, but they’re much more special.</p>



<h2 class="wp-block-heading" id="h-grid-item-vs-grid-container">Grid Item vs. Grid Container?</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import React from 'react';
import './App.css';
import {Grid} from '@material-ui/core';
import randomColor from 'randomcolor';

function App() {
  return (
    &lt;div  className="App">
        &lt;Grid style={{background:randomColor()}}>
          Hooray something is here!
        &lt;/Grid>
    &lt;/div>
  );
}

export default App;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">React</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;react&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;./App.css&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> {</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">} </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;@material-ui/core&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">randomColor</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;randomcolor&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Hooray something is here!</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">App</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p class="wp-block-paragraph">A Grid can have two types of layouts: <strong>containers</strong> and <strong>items</strong>. It’s a pretty easy concept, a <em>container </em>contains grid items, and a grid <em>item </em>is in a grid container. A container has special properties that can be set but we’ll touch on that later. The two properties are not mutually exclusive, so you can have a grid that’s both an item and a container.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>function App() {
  return (
    &lt;div  className="App">
      &lt;Grid container>
        &lt;Grid item style={{background:randomColor()}}>
          Hooray something is here!
        &lt;/Grid>
      &lt;/Grid>
    &lt;/div>
  );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Hooray something is here!</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-grid-items-columns-and-break-points">Grid Items, Columns, and Break Points</h2>



<p class="wp-block-paragraph">This section contains the most important information for&nbsp;understanding Material UI Grids.&nbsp;Feel free to re-read it a few times if it doesn’t make sense at first.&nbsp;</p>



<p class="wp-block-paragraph">By default, Material UI Grids will try to space your items perfectly evenly, so if you have something simple, like 4 grids items, each item will take up 25% of the window.</p>



<p class="wp-block-paragraph">But, Material UI Grids work&nbsp;on a 12 column grid-layout, and each grid width is a certain percentage of that. So, if we have a Grid of 6, that width should be about 50%.</p>



<p class="wp-block-paragraph">So we can have something like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>function App() {
  return (
    &lt;div  className="App">
      &lt;Grid container>
        &lt;Grid item xs={6} style={{background:randomColor()}}>
          Hooray something is here!
        &lt;/Grid>
        &lt;Grid item xs={6} style={{background:randomColor()}}>
          Hooray something is too!
        &lt;/Grid>
      &lt;/Grid>
    &lt;/div>
  );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">6</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Hooray something is here!</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">6</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Hooray something is too!</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">There are a couple of key things to note here like containers and items, but we’ll cover that later. What we’re more interested in is the property that says xs={6}.</p>



<p class="wp-block-paragraph">Like I stated before, Material UI divides the numbers we give it to 12 columns and spaces our content appropriately. Now, we have a layout that looks something like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/2-somethingthere_1.png" alt=""/></figure>



<p class="wp-block-paragraph">Material-UI defines how the Grid acts according to specific breakpoints. Below is a table that shows when a specific breakpoint is reached.</p>


<table style="width:100%; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; margin-bottom:40px;">
<tbody>
<tr style="text-align:center;">
<th style="border-collapse:collapse; border-style:solid; border-width:medium; border-spacing: 20px; border:1px solid black; height:100px; font-size:24px; border-right-style:solid; border-right-width:medium; border-left-style:solid; border-left-width:medium;"><strong>Breakpoint Key</strong></th>
<th style="border-collapse:collapse; border-style:solid; border-width:medium; border-spacing: 20px; border:1px solid black; height:100px; font-size:24px; border-right-style:solid; border-right-width:medium; border-left-style:solid; border-left-width:medium;"><strong>Window Size</strong></th>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">xs</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">0-599 px</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">sm</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">600px &ndash; 959px</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">md</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">960px &ndash; 1279px</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">lg</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">1280 &ndash; 1919px</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">xl</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">1920px+</td>
</tr>
</tbody>
</table>


<p class="wp-block-paragraph">Breakpoints are defined starting from the bottom up, meaning if we have <em>xs </em>defined, but not <em>sm </em>or <em>md</em>, it will apply that breakpoint style of the lowest possible key.</p>



<p class="wp-block-paragraph">If we were to define an <em>md </em>key, then our <em>xs </em>breakpoint would apply, up until we hit that <em>md</em> window size. Our defined <em>xs </em>key only affects screen widths between 0-959px. At 960+ px, our <em>md</em> key would apply.</p>



<p class="wp-block-paragraph">That was a lot of information, so let’s see it in practice.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Resizing-windows.gif" alt="resizing mindows."/></figure>



<p class="wp-block-paragraph">In the gif above, each of the four different lines on the bottom of the screen represent different breakpoints. As you can see, when the window screen crosses across the different boundaries, we apply the properties that were specified to Material UI.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Grid container>
  &lt;Grid item xs={6} sm={2} md={8} lg={12} xl={3} style={{background:randomColor()}}>
     Hooray something is here!
  &lt;/Grid>
  &lt;Grid item xs={6} sm={10} md={4} lg={12} xl={9} style={{background:randomColor()}}>
     Hooray something is too!
  &lt;/Grid>
&lt;/Grid></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">6</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sm</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">2</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">md</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">8</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lg</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">12</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xl</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">3</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">     Hooray something is here!</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">6</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sm</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">10</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">md</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">4</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lg</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">12</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xl</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">9</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">     Hooray something is too!</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">One thing to note is that, if we look at xs={6} for both of our Grid items, it splits the space evenly. When we get to the breakpoint of <em>lg</em> and specify the {12} size, we basically ‘fill’ that 12 column limit and move our content on to a new row.</p>



<p class="wp-block-paragraph">By placing our breakpoints to equal 12, we say that we want this Grid item to occupy its own row.</p>



<p class="wp-block-paragraph">This might be enough for the given use case, but with Grid containers, we can go even further.</p>



<h2 class="wp-block-heading" id="h-container-magic">Container Magic</h2>



<p class="wp-block-paragraph">With Grid Containers, we can arrange all of our grid items the way that we want to. The first thing we want to do is add spaces around the grid items so that the content isn&#8217;t directly touching one another. We can add the prop <strong>‘spacing’</strong> and which takes in a value between 0 and 10.</p>



<p class="wp-block-paragraph">The space between each grid is the number you chose, times 8pixel. For example, spacing={2} is 16 pixels.</p>



<p class="wp-block-paragraph">For this example, we’ll refactor it slightly so that the background color only applies to the content inside the grid, and not the actual grid itself, so we can see the spacing.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>function App() {
  return (
    &lt;div  className="App">
      &lt;Grid container spacing={3}>
        &lt;Grid item xs={6}>
          &lt;div style={{background:randomColor()}}>Hooray something is here!&lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={6}>
          &lt;div style={{background:randomColor()}}> Hooray something is too! &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={4}>
          &lt;div style={{background:randomColor()}}> Another item! &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={4}>
          &lt;div style={{background:randomColor()}}> Showing off rows! &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={4}>
          &lt;div style={{background:randomColor()}}> Last item! &lt;/div>
        &lt;/Grid>
      &lt;/Grid>
    &lt;/div>
  );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">spacing</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt;</span><span style="color: #9CDCFE">Hooray</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">something</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">is</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">here</span><span style="color: #D4D4D4">!&lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt; </span><span style="color: #9CDCFE">Hooray</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">something</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">is</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">too</span><span style="color: #D4D4D4">! &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt; </span><span style="color: #9CDCFE">Another</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4">! &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt; </span><span style="color: #9CDCFE">Showing</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">off</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">rows</span><span style="color: #D4D4D4">! &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt; </span><span style="color: #9CDCFE">Last</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4">! &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">And now, we have our grids spaced apart!</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/3-finalgrids.png" alt=""/></figure>



<p class="wp-block-paragraph">We can also add the prop <strong>direction</strong> to our <strong>container</strong> to pick if we want the grids to be in row or column form. When the direction is in a <strong>column</strong>, instead of the default row configuration, each grid gets its own row.</p>



<p class="wp-block-paragraph">We can still define breakpoints to size our component, however, the breakpoint values will only effect width, so an xs={6} will continue to occupy about 50% of the page.</p>



<h2 class="wp-block-heading" id="h-lazy-layouts-auto-layout">Lazy Layouts (Auto-layout)</h2>



<p class="wp-block-paragraph">There’s been a lot of talk about breakpoints which may be off-putting, however, Grids has an answer with its auto-layout functionality. In a given row, we only need to define at least one actual numeric value of the items in a given breakpoint for the system to figure itself out. We still have to specify that the Grid items are the same breakpoints, but with this, we only have to write one number:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>function App() {
  return (
    &lt;div  className="App">
      &lt;Grid container spacing={3}>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> A&lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={7}>
          &lt;div style={{background:randomColor()}}> B &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> C &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> D &lt;/div>
        &lt;/Grid>
      &lt;/Grid>
      &lt;Grid container spacing={3}>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> 1&lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> 2 &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> 3 &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> 4 &lt;/div>
        &lt;/Grid>
      &lt;/Grid>
    &lt;/div>
  );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">spacing</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">3</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> A</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">7</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> B </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> C </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> D </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">spacing</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">3</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> 1</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> 2 </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> 3 </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> 4 </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/4-final-final-grids_1.png" alt=""/></figure>



<p class="wp-block-paragraph">That about does it for Material-UI Grids.</p>



<p class="wp-block-paragraph"><strong>Learn more about DMC&#8217;s <a href="/services/application-development">Application Development Expertise</a> and <a href="/contact">contact us</a> with project inquiries!</strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/20000/a-simple-guide-to-material-ui-grids/">A Simple Guide to Material UI Grids</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
