<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: melikdev</title>
    <description>The latest articles on DEV Community by melikdev (@melikdev).</description>
    <link>https://dev.to/melikdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2947909%2Fede50bc6-f276-459b-9bbd-04822ee693d7.jpg</url>
      <title>DEV Community: melikdev</title>
      <link>https://dev.to/melikdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/melikdev"/>
    <language>en</language>
    <item>
      <title>Optimistically updating the UI with the useOptimistic hook</title>
      <dc:creator>melikdev</dc:creator>
      <pubDate>Sun, 16 Mar 2025 20:30:55 +0000</pubDate>
      <link>https://dev.to/melikdev/optimistically-updating-the-ui-with-the-useoptimistic-hook-1nh2</link>
      <guid>https://dev.to/melikdev/optimistically-updating-the-ui-with-the-useoptimistic-hook-1nh2</guid>
      <description>&lt;p&gt;In summary, &lt;strong&gt;useOptimistic&lt;/strong&gt; is a React hook that displays a different state only while some asynchronous action is in progress. Most basic use case is to make asynchronous data visible on UI while it's still on it's way to the database. It's a great tool to build highly reactive UI's and increase the user experience. It's the most underrated React hook in my opinion.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIMPLE USE CASE
&lt;/h2&gt;

&lt;p&gt;In my little example app i implemented useOptimistic and Tanstack Query together to add users' comments on the UI before it reaches the database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9ev74vsot9ve3jrunu4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9ev74vsot9ve3jrunu4.gif" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my simple Invoice app i used useOptimistic hook for updating the status of the invoice.&lt;/p&gt;

&lt;p&gt;First you have to import the hook:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import { useOptimistic } from 'react';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Use the useOptimistic hook with 2 arguments in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [currentStatus, setCurrentStatus] = useOptimistic(
    invoice.status,
    (state, newStatus) =&amp;gt; {
      return String(newStatus);
  }
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, write a simple function to handle a form action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function handleOnUpdateStatus(formData: FormData) {
  const originalStatus = currentStatus;
  setCurrentStatus(formData.get('status'));
  try {
    await updateStatusAction(formData);
  } catch (error) {
    setCurrentStatus(originalStatus);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add that function to your form using "onSubmit" event.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{AVAILABLE_STATUSES.map((status) =&amp;gt; (
  &amp;lt;DropdownMenuItem key={status.id}&amp;gt;
    &amp;lt;form action={handleOnUpdateStatus}&amp;gt;
      &amp;lt;input type="hidden" name="id" value={invoice.id} /&amp;gt;
      &amp;lt;input type="hidden" name="status" value={status.id} /&amp;gt;
      &amp;lt;button&amp;gt;{status.label}&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9ogcp2h7ahqlm7hk6nv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9ogcp2h7ahqlm7hk6nv.gif" alt="Image description" width="400" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading. Have fun.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
