<?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: Dmitrii Zakharov</title>
    <description>The latest articles on DEV Community by Dmitrii Zakharov (@senior-debugger).</description>
    <link>https://dev.to/senior-debugger</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%2F3217332%2F78dbc13c-e789-4ab2-8df8-59d5b8a9ed27.jpg</url>
      <title>DEV Community: Dmitrii Zakharov</title>
      <link>https://dev.to/senior-debugger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/senior-debugger"/>
    <language>en</language>
    <item>
      <title>Asynchronous Loops in JavaScript</title>
      <dc:creator>Dmitrii Zakharov</dc:creator>
      <pubDate>Sat, 01 Nov 2025 11:27:29 +0000</pubDate>
      <link>https://dev.to/senior-debugger/asynchronous-loops-in-javascript-27cb</link>
      <guid>https://dev.to/senior-debugger/asynchronous-loops-in-javascript-27cb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Asynchronous Loops in JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How can we iterate over an array asynchronously in JavaScript? Is it even possible?&lt;/p&gt;

&lt;p&gt;Let's begin with the simplest method: using a &lt;code&gt;for&lt;/code&gt; loop while calling &lt;code&gt;await&lt;/code&gt; for asynchronous operations. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Async operation&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method is straightforward to implement. However, what are the drawbacks of this approach? The main concern is usability; we are all accustomed to using &lt;code&gt;.map()&lt;/code&gt;, &lt;code&gt;.forEach()&lt;/code&gt;, and other methods built into &lt;code&gt;Array.prototype&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, are there other ways to iterate through a loop? Yes, we can use recursion. In this method, each iteration is processed through a separate callback. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iterate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Await an operation&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;iterate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This recursive method offers no advantages over a &lt;code&gt;for&lt;/code&gt; loop, but it is a valid implementation.&lt;/p&gt;

&lt;p&gt;For years, I have relied on the first method across various projects. To simplify my work, I decided to create a small, publicly accessible library that can be utilized with any framework. Thus, I developed the library available at: 🔗 &lt;a href="https://www.npmjs.com/package/waiteach" rel="noopener noreferrer"&gt;waitEach&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This library is easy to include and offers two methods: &lt;code&gt;install&lt;/code&gt; and &lt;code&gt;waitEach&lt;/code&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first method extends &lt;code&gt;Array.prototype&lt;/code&gt; by adding a new method, &lt;code&gt;.waitEach&lt;/code&gt;, which functions similarly to &lt;code&gt;.map()&lt;/code&gt;, &lt;code&gt;.forEach()&lt;/code&gt;, and other native methods, providing a more convenient API.&lt;/li&gt;
&lt;li&gt;The second method allows you to execute &lt;code&gt;waitEach&lt;/code&gt; without extending &lt;code&gt;Array.prototype&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I encourage you to try it out!&lt;/p&gt;

&lt;p&gt;If you found this useful,  leave a ❤️ or 🦄 so others can discover it too! &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>web</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Using atomic design in Vue: The best approach for scalable component architecture</title>
      <dc:creator>Dmitrii Zakharov</dc:creator>
      <pubDate>Fri, 11 Jul 2025 15:11:45 +0000</pubDate>
      <link>https://dev.to/senior-debugger/using-atomic-design-in-vue-the-best-approach-for-scalable-component-architecture-5cna</link>
      <guid>https://dev.to/senior-debugger/using-atomic-design-in-vue-the-best-approach-for-scalable-component-architecture-5cna</guid>
      <description>&lt;p&gt;Selecting the appropriate architecture is crucial in any frontend project. A poorly chosen structure can transform even a small application into a confusing mess that is difficult to scale, test, or maintain.&lt;/p&gt;

&lt;p&gt;Does every &lt;strong&gt;existing architecture scale well by default&lt;/strong&gt;? &lt;br&gt;
&lt;strong&gt;No, not all&lt;/strong&gt; of them do.&lt;/p&gt;

&lt;p&gt;When choosing a component architecture, I focus on three key aspects: &lt;br&gt;
 -  Clarity  -  Is the structure easy to navigate and understand? &lt;br&gt;
 -  Scalability  -  Can it grow alongside the application?&lt;br&gt;
 -  Ease of Use  -  Does it enhance or hinder the developer experience?&lt;/p&gt;

&lt;p&gt;One of the best frontend architectures I have encountered in my career is Atomic Design. If you're not familiar with the concept, I highly recommend starting with the &lt;a href="https://atomicdesign.bradfrost.com/chapter-2/" rel="noopener noreferrer"&gt;original explanation by Brad Frost&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Atomic Design?
&lt;/h2&gt;

&lt;p&gt;Atomic Design offers a clear mental framework for building user interface (UI) systems by breaking down components into five hierarchical levels:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Atoms&lt;/strong&gt;  -  The basic building blocks (e.g., buttons, input fields).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Molecules&lt;/strong&gt;  -  Simple combinations of atoms (e.g., an input field combined with a label).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organisms&lt;/strong&gt;  -  More complex components made up of molecules and atoms (e.g., a header, a form).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Templates&lt;/strong&gt;  -  Page-level layouts that contain placeholder content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pages&lt;/strong&gt;  -  Final pages filled with actual content.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In practice, I often skip the &lt;strong&gt;Templates&lt;/strong&gt; stage, as it can seem unnecessary. You can still achieve a clean separation of elements without them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Applying Atomic Design in a Vue Project
&lt;/h2&gt;

&lt;p&gt;Imagine we are creating a straightforward "Contact Us" page. This page may consist of the following elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Headers and subheaders.&lt;/li&gt;
&lt;li&gt;Descriptive text and instructions.&lt;/li&gt;
&lt;li&gt;A feedback form that includes input fields and a submission button.&lt;/li&gt;
&lt;li&gt;A header and footer for navigation and branding purposes.&lt;/li&gt;
&lt;/ul&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%2Fgfmdjyc1emi2rxg2ktuw.jpg" 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%2Fgfmdjyc1emi2rxg2ktuw.jpg" alt="Page" width="800" height="675"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Here's how we would organize that using Atomic Design in a Vue-based project:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Atoms
&lt;/h3&gt;

&lt;p&gt;Atoms are the smallest components and should be reusable across your application. Keep them stateless and focused.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Logo.vue&lt;/em&gt; — logo contains an image or text.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Link.vue&lt;/em&gt; — link component used in the footer.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Input.vue&lt;/em&gt;, &lt;em&gt;Button.vue&lt;/em&gt; — form elements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Molecules
&lt;/h3&gt;

&lt;p&gt;These are simple component compositions. They can receive data via props and render a structure of atoms.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Header.vue&lt;/em&gt; – composed of Logo, maybe some navigation links.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Footer.vue&lt;/em&gt; – combines text blocks and atomized Link components.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Organisms
&lt;/h3&gt;

&lt;p&gt;Organisms are more complex components that combine both UI and internal logic. They often serve as the core building blocks for full-page layouts and can include other components such as atoms, molecules, or even other organisms.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;FeedbackForm.vue&lt;/em&gt; – includes &lt;em&gt;Input&lt;/em&gt;, &lt;em&gt;Textarea&lt;/em&gt;, &lt;em&gt;Button&lt;/em&gt;, and handles internal logic like validation and submission.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Pages
&lt;/h3&gt;

&lt;p&gt;Pages consist of various components.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;ContactUs.vue&lt;/em&gt; - includes &lt;em&gt;FeedbackForm&lt;/em&gt;, &lt;em&gt;Header&lt;/em&gt;, &lt;em&gt;Footer&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Folder Structure Example
&lt;/h2&gt;

&lt;p&gt;Here's a sample directory layout for this contact page:&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%2Ft6t6y8d3b5xoljslzuhx.png" 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%2Ft6t6y8d3b5xoljslzuhx.png" alt="Architecture" width="250" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Atomic Design works incredibly well with Vue (and other frameworks like React). It creates a shared vocabulary and natural hierarchy that reflects how we think about interfaces. More importantly, it makes it easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintain consistency across your UI&lt;/li&gt;
&lt;li&gt;Reuse components with confidence&lt;/li&gt;
&lt;li&gt;Scale your application without losing control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're starting a new Vue project or refactoring an existing one, try adopting Atomic Design. You'll quickly see the benefits.&lt;/p&gt;




&lt;p&gt;If you found this useful,  leave a ❤️ or 🦄 so others can discover it too!&lt;/p&gt;

</description>
      <category>vue</category>
      <category>architecture</category>
      <category>beginners</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Animation vs Transition: Which one will kill your performance first? 🔥</title>
      <dc:creator>Dmitrii Zakharov</dc:creator>
      <pubDate>Wed, 25 Jun 2025 11:15:08 +0000</pubDate>
      <link>https://dev.to/senior-debugger/css-animation-vs-transition-which-one-will-kill-your-performance-first-14am</link>
      <guid>https://dev.to/senior-debugger/css-animation-vs-transition-which-one-will-kill-your-performance-first-14am</guid>
      <description>&lt;h1&gt;
  
  
  🔥 CSS animation vs transition: Which Performs Better?
&lt;/h1&gt;

&lt;p&gt;Every front-end developer has faced this dilemma at least once:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Should you use animation or transition?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The common wisdom says &lt;strong&gt;transition is faster&lt;/strong&gt; — but is that true?
&lt;/li&gt;
&lt;li&gt;And does this hold for &lt;strong&gt;all CSS properties?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s dive deeper.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Performance Testing at Scale
&lt;/h2&gt;

&lt;p&gt;To get to the bottom of this, we built a stress-test environment with &lt;strong&gt;7,500 animated elements&lt;/strong&gt; and tracked a wide range of performance metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Average and lowest FPS
&lt;/li&gt;
&lt;li&gt;⏱️ Frame delay (delta) and maximum spikes
&lt;/li&gt;
&lt;li&gt;💾 JavaScript heap usage
&lt;/li&gt;
&lt;li&gt;📈 Peak memory consumption
&lt;/li&gt;
&lt;li&gt;🧮 Total allocated memory
&lt;/li&gt;
&lt;li&gt;🕐 Total task duration
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Try the live test yourself:&lt;/strong&gt; &lt;a href="https://performance-test-c0478c.gitlab.io/" rel="noopener noreferrer"&gt;click me&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ How We Measured
&lt;/h2&gt;

&lt;p&gt;To ensure objective and reliable results, our setup are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Renders thousands of elements on screen
&lt;/li&gt;
&lt;li&gt;Waits briefly before starting animation or transition
&lt;/li&gt;
&lt;li&gt;Captures performance metrics on every animation frame
&lt;/li&gt;
&lt;li&gt;Repeats each test 50 times to collect median data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We tracked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎯 Average and lowest FPS
&lt;/li&gt;
&lt;li&gt;⏳ Frame delay and max spike
&lt;/li&gt;
&lt;li&gt;🧠 JavaScript memory usage
&lt;/li&gt;
&lt;li&gt;🔥 Peak memory during animation
&lt;/li&gt;
&lt;li&gt;⌛ Total duration of the effect
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This method helps us understand how CSS animations behave under heavy load, not just in theory, but in actual browsers.&lt;/p&gt;




&lt;h2&gt;
  
  
  😱 What We Discovered
&lt;/h2&gt;

&lt;p&gt;It might seem that modern browsers should handle thousands of animations effortlessly.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Spoiler: They don’t.&lt;/strong&gt; Even 7,500 animated blocks cause visible frame drops and lag.&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%2Fly27pn4w139su9ybb248.jpg" 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%2Fly27pn4w139su9ybb248.jpg" alt=" " width="702" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 Test Case: &lt;code&gt;opacity&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Memory usage increased by &lt;strong&gt;14.11%&lt;/strong&gt; during animations compared to transitions, indicating higher resource consumption for animations.&lt;/p&gt;

&lt;p&gt;Average FPS dropped to &lt;strong&gt;12.04&lt;/strong&gt; with animations, which is &lt;strong&gt;16.80% lower&lt;/strong&gt; than with transitions. This shows that animations can cause more performance degradation under heavy load.&lt;/p&gt;

&lt;p&gt;Transitions tend to use memory more efficiently due to simpler rendering and fewer internal calculations. Still, overall memory usage between the two remains comparable for small to moderate numbers of elements.&lt;/p&gt;

&lt;p&gt;However, as the number of animated elements grows, animations increase memory consumption more steeply than transitions — a difference that becomes critical at high loads.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 What About Other CSS Properties?
&lt;/h2&gt;

&lt;p&gt;We also tested:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;transform&lt;/code&gt; (GPU-accelerated property)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;blur&lt;/code&gt; (expensive filter effect)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;background-color&lt;/code&gt; (paint-heavy property)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The results vary significantly depending on the property, browser, and hardware. For example, transform animations often perform better because they leverage GPU acceleration, while animating blur or background-color is more taxing on the CPU and memory.&lt;/p&gt;

&lt;p&gt;👉 Try the test yourself and see how your browser handles these properties: &lt;a href="https://performance-test-c0478c.gitlab.io/" rel="noopener noreferrer"&gt;Live test link&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Additional Insights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transitions are often simpler:&lt;/strong&gt; They represent a change from one state to another, which browsers can optimize more easily.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animations offer more control:&lt;/strong&gt; Complex keyframe animations provide granular timing and sequences, but this complexity comes with a performance cost.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware acceleration matters:&lt;/strong&gt; Animating properties like &lt;code&gt;transform&lt;/code&gt; and &lt;code&gt;opacity&lt;/code&gt; usually trigger GPU acceleration, which greatly improves smoothness and reduces CPU load.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid animating expensive properties:&lt;/strong&gt; Properties like &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;box-shadow&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt; (especially &lt;code&gt;blur&lt;/code&gt;) cause layout recalculations and repaints, which hurt performance.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch animations:&lt;/strong&gt; Group your animations and transitions where possible to reduce browser workload.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Don’t assume one approach is always better. Performance depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The CSS property you’re animating
&lt;/li&gt;
&lt;li&gt;The number of elements involved
&lt;/li&gt;
&lt;li&gt;Browser optimizations and GPU usage
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In general, transitions consume less memory and GPU than animations, especially at scale. But animations give you more control and flexibility, so it’s a trade-off.&lt;/p&gt;

&lt;p&gt;We encourage you to experiment, profile, and push your browser to the limits to find the best approach for your specific case.&lt;/p&gt;

&lt;p&gt;If you found this useful, leave a ❤️ or 🦄 so others can discover it too!&lt;/p&gt;

</description>
      <category>css</category>
      <category>performance</category>
      <category>testing</category>
      <category>browser</category>
    </item>
    <item>
      <title>CapacitorJS: One code base  -  many platforms</title>
      <dc:creator>Dmitrii Zakharov</dc:creator>
      <pubDate>Mon, 23 Jun 2025 06:47:45 +0000</pubDate>
      <link>https://dev.to/senior-debugger/capacitorjs-one-code-base-many-platforms-5c20</link>
      <guid>https://dev.to/senior-debugger/capacitorjs-one-code-base-many-platforms-5c20</guid>
      <description>&lt;h2&gt;
  
  
  What is CapacitorJS?
&lt;/h2&gt;

&lt;p&gt;CapacitorJS is an open-source runtime developed by the Ionic team. It wraps your web application in native containers, giving it access to native APIs - effectively turning your web app into a mobile app for Android and iOS, without abandoning the comfort of modern frontend tooling.&lt;/p&gt;

&lt;p&gt;The learning curve is fairly approachable, especially if you already have experience with frontend frameworks like React, Vue, or Angular. But don't be fooled by its simplicity - Capacitor has a lot going on under the hood.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚠️ A Quick Disclaimer
&lt;/h3&gt;

&lt;p&gt;I'm not suggesting you should ditch native development entirely. Capacitor isn't a silver bullet, and for complex applications requiring intensive native features, traditional Android/iOS development still reigns supreme. That said, if you're working on a startup product or MVP, or if you're a solo dev trying to maximize reach with limited resources,  Capacitor is a compelling option.&lt;/p&gt;




&lt;h2&gt;
  
  
  What makes capacitor stand out?
&lt;/h2&gt;

&lt;p&gt;Here are a few things I appreciated most during development:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Unified codebase
&lt;/h3&gt;

&lt;p&gt;Write your app once in your favorite frontend framework and deploy it to web, Android, and iOS. No duplicated effort, no context switching.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Native-like flexibility
&lt;/h3&gt;

&lt;p&gt;Capacitor doesn't lock you out of the native layer. You can drop down to Swift/Kotlin whenever needed, and the configuration options are remarkably close to what you'd expect in native projects.&lt;br&gt;
The tradeoffs: What You should know&lt;/p&gt;

&lt;p&gt;Of course, no tool is perfect. Here are some challenges I ran into:&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Native vs. Web logic conflicts
&lt;/h3&gt;

&lt;p&gt;If you're not careful, native methods and web logic can overlap or conflict, especially when dealing with plugins or custom APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Configuration complexity
&lt;/h3&gt;

&lt;p&gt;Initial setup feels smooth, but once you start integrating push notifications, camera access, or other advanced native features, things can get a bit messy. Debugging across platforms can also be tricky.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Performance
&lt;/h3&gt;

&lt;p&gt;Pure native apps generally perform better, especially when working with animations, large datasets, or heavy computation. In my case, the performance hit was minimal,  but for data-heavy applications, it's something to be aware of.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-world use case
&lt;/h2&gt;

&lt;p&gt;In my most recent product, we used Capacitor to manage everything from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3D rendering on canvas&lt;/li&gt;
&lt;li&gt;Data persistence&lt;/li&gt;
&lt;li&gt;Push notifications&lt;/li&gt;
&lt;li&gt;Google API integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of that came from a single codebase. It wasn't always smooth sailing, but the time and development overhead we saved were massive.&lt;/p&gt;




&lt;p&gt;If your goal is to launch across platforms fast without sacrificing too much on capability, CapacitorJS is well worth exploring. You get native integration, flexible configuration, and one codebase to rule them all.&lt;br&gt;
Capacitor won't replace native development for everyone,  but for many teams, especially lean ones, it offers an ideal middle ground.&lt;/p&gt;




&lt;h3&gt;
  
  
  👉 What do you think?
&lt;/h3&gt;

&lt;p&gt; Have you worked with CapacitorJS or similar tools like React Native, Flutter, or Expo? I'd love to hear about your experiences, tradeoffs, and lessons learned in the comments below.&lt;/p&gt;

</description>
      <category>capacitorjs</category>
      <category>programming</category>
      <category>javascript</category>
      <category>vue</category>
    </item>
    <item>
      <title>How we streamlined frontend development with OpenAPI 🚀</title>
      <dc:creator>Dmitrii Zakharov</dc:creator>
      <pubDate>Thu, 12 Jun 2025 17:10:56 +0000</pubDate>
      <link>https://dev.to/senior-debugger/how-we-streamlined-frontend-development-with-openapi-4dn2</link>
      <guid>https://dev.to/senior-debugger/how-we-streamlined-frontend-development-with-openapi-4dn2</guid>
      <description>&lt;p&gt;Many of you have probably used OpenAPI in your projects, or at least heard of it. But from my regular conversations with developers, I’ve noticed something surprising: &lt;strong&gt;a lot of frontend developers still don’t fully take advantage of it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article is about how using OpenAPI has helped us &lt;strong&gt;speed up development&lt;/strong&gt;, &lt;strong&gt;improve code consistency&lt;/strong&gt;, and &lt;strong&gt;eliminate entire categories of errors&lt;/strong&gt;. I'll also walk you through how to set it up and integrate it into a TypeScript project.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 What Is OpenAPI, really?
&lt;/h2&gt;

&lt;p&gt;At its core, &lt;strong&gt;OpenAPI is a tool that takes your Swagger definitions and generates a full API client&lt;/strong&gt;, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A wrapper for all your endpoints&lt;/li&gt;
&lt;li&gt;Typed models and DTOs (based on Swagger schema)&lt;/li&gt;
&lt;li&gt;Methods that handle requests for you (like &lt;code&gt;axios&lt;/code&gt; or &lt;code&gt;fetch&lt;/code&gt;) with built-in type safety&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: &lt;strong&gt;no more manually writing interfaces and HTTP calls&lt;/strong&gt;. You get a fully typed, ready-to-use client that’s always in sync with the backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Why OpenAPI matters
&lt;/h2&gt;

&lt;p&gt;Here are some of the biggest benefits we’ve seen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type safety out of the box&lt;/strong&gt;: All request and response models are generated from Swagger. You no longer need to manually define interfaces or worry about mismatches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No more manual fetch/axios calls&lt;/strong&gt;: All endpoints come with pre-written request methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency between backend and frontend&lt;/strong&gt;: When something changes on the backend (e.g., a route is renamed or a payload changes), you just re-generate the schema and catch issues during compile time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero maintenance&lt;/strong&gt;: Once configured, it’s basically plug-and-play — just update the schema when needed.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠 Setting up OpenAPI in your project
&lt;/h2&gt;

&lt;p&gt;To get started, install the OpenAPI generator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add @openapitools/openapi-generator-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a config file &lt;code&gt;openapi/apiConfig.json&lt;/code&gt; with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prefixParameterInterfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"supportsES6"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typescriptThreePlus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, add scripts to your &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"openapi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn openapi:download &amp;amp;&amp;amp; yarn openapi:generate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"openapi:download"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"curl https://yourserver.com/api/docs-json &amp;gt; ./openapi/openapi.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"openapi:generate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openapi-generator-cli validate -i ./openapi/openapi.json &amp;amp;&amp;amp; rm -rf src/openapi/api &amp;amp;&amp;amp; openapi-generator-cli generate -i ./openapi/openapi.json -c ./openapi/apiConfig.json -g typescript-fetch -o src/openapi/api"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Note: You may need to install JRE (Java Runtime Environment) for the generator to work.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📦 Building the API Client
&lt;/h2&gt;

&lt;p&gt;After running &lt;code&gt;yarn openapi&lt;/code&gt;, you’ll get a fully generated &lt;code&gt;src/openapi&lt;/code&gt; folder with models, APIs, and types.&lt;/p&gt;

&lt;p&gt;To simplify usage, let’s build a centralized API client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;BonusApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ChatApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ServiceApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;UserAccessApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;UserInfoApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;UsersApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;UserTasksApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;UserUtilsApi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;configuration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nf"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-language&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ApiClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ChatApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ServiceApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserAccessApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserInfoApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserTasksApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserUtilsApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UsersApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now calling an API is as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;accessToken&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ApiClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;access&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;appLoginPayloadDto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 What’s under the hood?
&lt;/h2&gt;

&lt;p&gt;Let’s take a look at the actual implementation of the &lt;code&gt;login&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;loginRaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;requestParameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UserAccessApiLoginRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;initOverrides&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;RequestInit&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;InitOverrideFunction&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AppAccessUserTokenDto&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requestParameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;appLoginPayloadDto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RequiredError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;appLoginPayloadDto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Required parameter is missing.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;headerParameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HTTPHeaders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`/app/user/access/login`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;headerParameters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;AppLoginPayloadDtoToJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requestParameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;appLoginPayloadDto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;initOverrides&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;JSONApiResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;AppAccessUserTokenDtoFromJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonValue&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;requestParameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UserAccessApiLoginRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;initOverrides&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;RequestInit&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;InitOverrideFunction&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AppAccessUserTokenDto&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loginRaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requestParameters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initOverrides&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see that everything is strictly typed — parameters, return values, and even runtime checks are in place.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Limitations (for now)
&lt;/h2&gt;

&lt;p&gt;There are still some things OpenAPI doesn’t support out of the box, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WebSockets&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Some custom middleware logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These require custom solutions for now. But the OpenAPI ecosystem is rapidly evolving, and we expect more features to be supported over time.&lt;/p&gt;

&lt;p&gt;See you in the comments — and thanks for reading! 🚀&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>openapi</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Senior developers cry too: What's next after you're "Senior"?</title>
      <dc:creator>Dmitrii Zakharov</dc:creator>
      <pubDate>Sun, 08 Jun 2025 11:39:20 +0000</pubDate>
      <link>https://dev.to/senior-debugger/senior-developers-cry-too-whats-next-after-youre-senior-4ef1</link>
      <guid>https://dev.to/senior-debugger/senior-developers-cry-too-whats-next-after-youre-senior-4ef1</guid>
      <description>&lt;h2&gt;
  
  
  🎯 Senior - and Stuck?
&lt;/h2&gt;

&lt;p&gt;When you're just starting in tech, your growth path feels clear (*it can include levels on each position): Junior → Mid → Senior. Companies actively support this journey through mentorship, internal promotions, and learning budgets.&lt;/p&gt;

&lt;p&gt;But then one day… you're a Senior Developer. And suddenly, the next step isn't obvious at all.&lt;/p&gt;

&lt;p&gt;You start asking: &lt;strong&gt;What now? Do I specialize? Manage? Stay still? Leave?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Early career growth feels predictable
&lt;/h2&gt;

&lt;p&gt;For juniors and mids, it's a numbers game. Apply enough, learn consistently, and build pet projects, and growth usually comes. Yes, the 2025 market is tighter than five years ago - there are fewer entry-level roles, and employers want experience - but the path still exists.&lt;/p&gt;

&lt;p&gt;The real challenge? &lt;strong&gt;It's not obvious what the path is&lt;/strong&gt; after you become "senior."&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Post-Senior: What are your options?
&lt;/h2&gt;

&lt;p&gt;Once you hit that senior wall, you realize: growth from here isn't linear, and &lt;strong&gt;it's definitely not guaranteed&lt;/strong&gt;.&lt;br&gt;
Let's talk about the two most common paths:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 🧠 The technical track: Becoming a Principal Engineer
&lt;/h3&gt;

&lt;p&gt;This is about going &lt;strong&gt;deep&lt;/strong&gt; - frameworks, systems design, architecture, and tooling. You become the go-to person for critical questions across projects and tech stacks.&lt;/p&gt;

&lt;p&gt;But here's the catch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not every&lt;/strong&gt; company defines this role clearly: Sometimes, companies &lt;strong&gt;expect Principal Engineers to also lead people&lt;/strong&gt;, which muddles the waters. That's not always accurate: ideally, Principals work &lt;strong&gt;across teams&lt;/strong&gt;, helping scale architecture and elevate technical direction, &lt;strong&gt;not directly managing engineers&lt;/strong&gt;..&lt;/li&gt;
&lt;li&gt;Often, &lt;strong&gt;there's only 1 Principal Engineer per 10–50 developers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You'll likely need backend experience (Node.js, Express/Nest), deep frontend knowledge (React/Vue/Angular), and systems understanding (infra, CI/CD, monitoring).&lt;/li&gt;
&lt;li&gt;You'll be expected to bridge tech silos, mentor seniors, and think about architecture, not just features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;It's a hard role to earn - and even harder to find.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. 🤝 The Management Track: Becoming a Team Lead
&lt;/h3&gt;

&lt;p&gt;This is about &lt;strong&gt;communication, adaptability, and people&lt;/strong&gt;.&lt;br&gt;
Yes, tech still matters - but what matters more is your ability to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guide a team's direction&lt;/li&gt;
&lt;li&gt;Advocate for devs to PMs/stakeholders&lt;/li&gt;
&lt;li&gt;Translate business needs into technical roadmaps&lt;/li&gt;
&lt;li&gt;Manage conflict, mentoring, and team health&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And again,  most teams only have &lt;strong&gt;one lead&lt;/strong&gt;. Some companies stretch that even further: one lead for multiple squads.&lt;/p&gt;

&lt;p&gt;You're now measured by what you build and &lt;strong&gt;how well your team builds and ships&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📉 The Scarcity Problem
&lt;/h2&gt;

&lt;p&gt;Here's what's often not discussed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"There are way fewer leadership roles than senior devs."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Statistically, you may be looking at a &lt;strong&gt;1:50&lt;/strong&gt; ratio between senior engineers and leadership/principal-level roles. Which means…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Competing for a Lead/Principal role often feels like being a junior again:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Polish your profile&lt;/li&gt;
&lt;li&gt;Apply broadly&lt;/li&gt;
&lt;li&gt;Get ignored (less often)&lt;/li&gt;
&lt;li&gt;Repeat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Except this time, you've already put years into the field. That stings.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ So… Is it even worth trying?
&lt;/h2&gt;

&lt;p&gt;Absolutely - &lt;strong&gt;yes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yes, the road beyond Senior is messy. Yes, there are fewer roles, more ambiguity, and less structure. But if you care about your craft, if you're curious, if you want to shape products - not just features - then:&lt;/p&gt;

&lt;p&gt;👉 There's always room for those who go deeper.&lt;br&gt;
 👉 There's always demand for devs who can see the bigger picture.&lt;br&gt;
 👉 And there's the real opportunity in combining technical strength with product thinking and communication.&lt;/p&gt;

&lt;p&gt;It might take time. It might not happen in your current company.&lt;br&gt;
But if you're intentional,  &lt;strong&gt;you can grow beyond the title&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So keep building. Keep sharing. Keep leveling up - even when it's not obvious what the next level is.&lt;/p&gt;

&lt;p&gt;And if you're on this path too,  I'd love to hear your story.&lt;/p&gt;




&lt;h2&gt;
  
  
  😌 And sometimes… You don't want to grow
&lt;/h2&gt;

&lt;p&gt;There's also an honest truth: &lt;strong&gt;Not every senior wants to "go up."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some developers love being experts. They love shipping features. They like solving problems,  not managing people or fighting architecture wars.&lt;/p&gt;

&lt;p&gt;That's valid. Growth doesn't always mean a new title.&lt;br&gt;
 Sometimes, it means deepening mastery or mentoring others.&lt;br&gt;
 Sometimes, it means side projects, writing, teaching, or open source.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Post scriptum
&lt;/h2&gt;

&lt;p&gt;In future posts, I'll share more practical tips on:&lt;br&gt;
Finding real growth as a senior&lt;br&gt;
Positioning yourself for Principal/Lead roles&lt;br&gt;
Building a portfolio that signals depth, not just activity&lt;/p&gt;

&lt;p&gt;But for now, follow the blog, and let me know: &lt;strong&gt;Where do &lt;em&gt;you&lt;/em&gt; want to grow from here?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>productivity</category>
      <category>growth</category>
    </item>
    <item>
      <title>🧑‍🍳 Cooking with Vue 3: Nested (Recursive) component rendering</title>
      <dc:creator>Dmitrii Zakharov</dc:creator>
      <pubDate>Fri, 06 Jun 2025 13:33:39 +0000</pubDate>
      <link>https://dev.to/senior-debugger/cooking-with-vue-3-nested-recursive-component-rendering-5flb</link>
      <guid>https://dev.to/senior-debugger/cooking-with-vue-3-nested-recursive-component-rendering-5flb</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/senior-debugger/cooking-with-vue-3-sfc-features-you-might-not-know-about-e1h"&gt;one of my earlier posts&lt;/a&gt;, I briefly mentioned the concept of nested component rendering in Vue. Despite this technique's usefulness, there aren't many clear examples online showing how and when to use it effectively. &lt;/p&gt;

&lt;p&gt;So let's fix that.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Let's say we're building a dynamic table. The table has rows and columns, and each cell needs to render different content intelligently depending on its data type.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the value is a date, it should format it.
&lt;/li&gt;
&lt;li&gt;If it's a number and marked as a "price", it should be formatted as currency.
&lt;/li&gt;
&lt;li&gt;If it's a boolean, it should display "yes" or "no".
&lt;/li&gt;
&lt;li&gt;If it's a nested array of cells, it should recursively render a set of cells inside itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We want a single, reusable &lt;code&gt;TableCell&lt;/code&gt; component that can handle all these cases on its own.&lt;/p&gt;




&lt;h2&gt;
  
  
  The goal
&lt;/h2&gt;

&lt;p&gt;Our goal is to create a flexible &lt;code&gt;&amp;lt;TableCell /&amp;gt;&lt;/code&gt; component that receives a &lt;code&gt;type&lt;/code&gt; and a &lt;code&gt;value&lt;/code&gt; as props and renders the content accordingly — even recursively, if needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The implementation
&lt;/h2&gt;

&lt;p&gt;We'll use Vue 3's &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; syntax and TypeScript for better type safety.&lt;/p&gt;

&lt;p&gt;Here's a simplified version of what our component might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt;
    &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"`_$&lt;/span&gt;{data.type}`"
    class="tableCell"
  &amp;gt;
    ...

    &lt;span class="nt"&gt;&amp;lt;template&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"data.type === TypesEnum.Boolean"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="na"&gt;v-else-if=&lt;/span&gt;&lt;span class="s"&gt;"data.type === TypesEnum.Primitive"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="na"&gt;v-else-if=&lt;/span&gt;&lt;span class="s"&gt;"data.type === TypesEnum.Array"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- Recursive call --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;TableCell&lt;/span&gt;
        &lt;span class="na"&gt;v-for=&lt;/span&gt;&lt;span class="s"&gt;"(item, key) in data.value"&lt;/span&gt;
        &lt;span class="na"&gt;:key=&lt;/span&gt;&lt;span class="s"&gt;"key"&lt;/span&gt;
        &lt;span class="na"&gt;:data=&lt;/span&gt;&lt;span class="s"&gt;"item"&lt;/span&gt;
      &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/** Important to ensure the component knows where to get component from. */&lt;/span&gt;
&lt;span class="nf"&gt;defineOptions&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TableCell&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;TypesEnum&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;Array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;array&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nb"&gt;Boolean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;boolean&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Icon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;icon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Primitive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primitive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;PrimitiveValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TypesEnum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TypesEnum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TypesEnum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TypesEnum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TypesEnum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TypesEnum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Primitive&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ComplexValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TypesEnum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PrimitiveValue&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;defineProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ComplexValue&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;PrimitiveValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Comments
&lt;/h3&gt;

&lt;p&gt;Parts responsible for formatting were intentionally left out of the example to keep it simple. However, some basic ones were included to give a more complete picture.&lt;br&gt;
It’s also important to ensure the component knows where to get its data from.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use it
&lt;/h2&gt;

&lt;p&gt;Recursive components are ideal when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're dealing with tree-like or nested data.&lt;/li&gt;
&lt;li&gt;You want to minimize repeated boilerplate logic for rendering similar structures.&lt;/li&gt;
&lt;li&gt;You need consistent behavior and formatting rules for the same data type, even when nested.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just be mindful of recursion limits, performance, and base case fallbacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Final thought
&lt;/h2&gt;

&lt;p&gt;I hope you found this useful and maybe even a bit fun to explore.&lt;br&gt;
If it sparked your interest — stay tuned and consider subscribing to my blog!&lt;/p&gt;

&lt;p&gt;See you in the comments — and thanks for reading! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>vue</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Speak Up and Get Promoted</title>
      <dc:creator>Dmitrii Zakharov</dc:creator>
      <pubDate>Mon, 02 Jun 2025 06:49:33 +0000</pubDate>
      <link>https://dev.to/senior-debugger/how-to-speak-up-and-get-promoted-in-an-it-company-54k4</link>
      <guid>https://dev.to/senior-debugger/how-to-speak-up-and-get-promoted-in-an-it-company-54k4</guid>
      <description>&lt;h1&gt;
  
  
  How to Speak Up and Get Promoted in an IT Company
&lt;/h1&gt;

&lt;p&gt;While every company operates differently, the overall mechanics of career growth and salary increases in the IT industry tend to follow similar patterns.  &lt;/p&gt;

&lt;p&gt;At some point, almost every professional — from junior developers to seasoned tech leads — faces the same question:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;How do I speak up and get recognized if I want to grow or earn more?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To move forward successfully, it's important to understand not only your personal goals but also the &lt;strong&gt;company's motivations&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 What Drives Companies: Why They Hire and Promote
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 When Hiring Employees
&lt;/h3&gt;

&lt;p&gt;When a company opens a new position, the primary goal is usually the same: &lt;strong&gt;improve business efficiency and profitability&lt;/strong&gt;. Common reasons include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filling a specific team role.&lt;/li&gt;
&lt;li&gt;Increasing team productivity and delivery speed.&lt;/li&gt;
&lt;li&gt;Reducing pressure on key individuals.&lt;/li&gt;
&lt;li&gt;Improving product quality and development processes.&lt;/li&gt;
&lt;li&gt;Ultimately — driving revenue growth.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 When Promoting Existing Employees
&lt;/h3&gt;

&lt;p&gt;Promotions are rarely just a "thank you for staying." More often, they're tied to &lt;strong&gt;increased scope and impact&lt;/strong&gt;, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Broader technical or cross-functional skills.&lt;/li&gt;
&lt;li&gt;Taking on more complex projects and architecture.&lt;/li&gt;
&lt;li&gt;Greater ownership in processes, people, and products.&lt;/li&gt;
&lt;li&gt;Mentorship and raising team performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These steps are often supported by a &lt;strong&gt;growth plan&lt;/strong&gt;, which outlines your progress and the steps needed to reach the next level.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗ Promotion isn’t about working more hours — it’s about &lt;strong&gt;creating more value&lt;/strong&gt; through impact and ownership.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 How to Communicate Your Career Ambitions Effectively
&lt;/h2&gt;

&lt;p&gt;To ensure a productive conversation with your manager, it's worth preparing in advance. Here's a step-by-step approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define your growth direction&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Decide whether you want to go deeper technically, move into team leadership, architecture, product, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Summarize your current contributions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Highlight your results: what projects you completed, your personal impact, and how the team or product benefited.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;State what you want to do next&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Be specific about your goals — e.g., leading architecture, mentoring juniors, taking ownership of a product area.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write a message to your manager&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Keep it clear and professional. Avoid emotional appeals. Politely ask for a conversation about your future and development path.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ⚠️ Common Challenges You Might Face
&lt;/h2&gt;

&lt;p&gt;After interviewing hundreds of IT professionals, one of the most frequent reasons for leaving a job is the &lt;strong&gt;perceived lack of growth opportunities&lt;/strong&gt;. Let’s explore why that happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Your manager ignores your request
&lt;/h3&gt;

&lt;p&gt;One of the most frustrating situations:&lt;br&gt;&lt;br&gt;
you hear "not now," "maybe later," or get no response at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Politely follow up again.&lt;/li&gt;
&lt;li&gt;Avoid threats or ultimatums — they rarely help.&lt;/li&gt;
&lt;li&gt;Even a clear "not in the next few months" is better than vague promises.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Your manager doesn’t know how to help you grow
&lt;/h3&gt;

&lt;p&gt;This is more common than you'd expect, especially at mid to senior levels. Often the company simply &lt;strong&gt;lacks a clear development structure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Try initiating a conversation about your growth.&lt;/li&gt;
&lt;li&gt;If there’s no support system in place, it’s unlikely to appear soon.&lt;/li&gt;
&lt;li&gt;You may need to consider other companies that invest more in employee development.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⏳ If Nothing Changes
&lt;/h2&gt;

&lt;p&gt;If you've taken initiative — had conversations, sent emails, made proposals — and &lt;strong&gt;still see no progress&lt;/strong&gt;, this is a &lt;strong&gt;clear signal&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You might have already outgrown your current role.&lt;/li&gt;
&lt;li&gt;The company may not be ready or willing to help you grow.&lt;/li&gt;
&lt;li&gt;Don’t get stuck waiting endlessly for change that may never come.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Remember:&lt;/strong&gt; your career growth is your responsibility. Sometimes the right move is to move on.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Performance Reviews: What to Expect and How to Prepare
&lt;/h2&gt;

&lt;p&gt;Many companies hold &lt;strong&gt;biannual or annual performance reviews&lt;/strong&gt;. These formal check-ins are meant to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reevaluate your salary;&lt;/li&gt;
&lt;li&gt;Confirm or revise your title;&lt;/li&gt;
&lt;li&gt;Discuss accomplishments and areas for growth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But don’t rely on these moments alone. &lt;strong&gt;Don’t wait for the "magic date" to speak up.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're serious about growing — &lt;strong&gt;initiate the conversation early&lt;/strong&gt;, ideally 1–2 months before a review cycle begins.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 If you want to grow — &lt;strong&gt;say it clearly&lt;/strong&gt;. You might not be noticed, but you can definitely be heard.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ In Closing
&lt;/h2&gt;

&lt;p&gt;Career advancement isn't just about being "a good employee." It's about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Having clarity about your goals;&lt;/li&gt;
&lt;li&gt;Communicating your value and achievements;&lt;/li&gt;
&lt;li&gt;Taking initiative and leading your own development.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📣 &lt;strong&gt;Speak up about your goals. Express what you want. Ask for feedback.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
That’s professional. That’s mature. That’s an investment in yourself.&lt;/p&gt;




&lt;p&gt;💬 Share your own stories or experiences in the comments — we’d love to hear them.&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>promotion</category>
      <category>growth</category>
    </item>
    <item>
      <title>🧑‍🍳 Cooking with Vue 3: SFC — Features you might not know about</title>
      <dc:creator>Dmitrii Zakharov</dc:creator>
      <pubDate>Thu, 29 May 2025 17:22:45 +0000</pubDate>
      <link>https://dev.to/senior-debugger/cooking-with-vue-3-sfc-features-you-might-not-know-about-e1h</link>
      <guid>https://dev.to/senior-debugger/cooking-with-vue-3-sfc-features-you-might-not-know-about-e1h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is not a "getting started" guide — this is &lt;strong&gt;an advanced look at what makes Vue 3's Single File Components (SFCs) truly powerful&lt;/strong&gt;, especially the underused capabilities that even experienced developers often overlook.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 Why SFCs deserve your attention
&lt;/h2&gt;

&lt;p&gt;Single File Components (&lt;code&gt;.vue&lt;/code&gt;) are not just a structural convenience — they're a &lt;strong&gt;fundamental paradigm&lt;/strong&gt; in Vue 3. With the addition of the Composition API and &lt;code&gt;script setup&lt;/code&gt;, SFCs evolve into a highly expressive, maintainable, and scalable tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vue 3 SFCs are:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compile-time optimized&lt;/strong&gt; with &lt;code&gt;script setup&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type-safe&lt;/strong&gt; and TS-friendly by design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular and reactive&lt;/strong&gt;, from template to style&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composable at scale&lt;/strong&gt;, ideal for large codebases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s just scratching the surface.&lt;/p&gt;




&lt;h2&gt;
  
  
  💎 Underused Vue 3 SFC superpowers
&lt;/h2&gt;

&lt;p&gt;Here's a curated list of &lt;strong&gt;advanced and underutilized features&lt;/strong&gt; that can greatly improve your Vue 3 experience:&lt;/p&gt;




&lt;h3&gt;
  
  
  🔁 &lt;code&gt;watchEffect&lt;/code&gt; — Auto-reactive side effects
&lt;/h3&gt;

&lt;p&gt;Unlike &lt;code&gt;watch&lt;/code&gt;, this runs &lt;strong&gt;immediately and reactively&lt;/strong&gt; whenever any reactive variable used inside the callback function changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="cm"&gt;/** Reactive variables. */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userCountry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userRegion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userCity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cm"&gt;/** Validate and save data automatically on change. */&lt;/span&gt;
&lt;span class="nf"&gt;watchEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/** Assume that the functions `validateLocation`, `showError`,
        and `saveLocation` have been defined earlier.
  */&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;validateLocation&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userCountry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userRegion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userCity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;showError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Location is not valid!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;saveLocation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Perfect for logging, data processing, syncing with external systems, or immediate derived state.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧼 &lt;code&gt;defineExpose&lt;/code&gt; — expose internals to parent
&lt;/h3&gt;

&lt;p&gt;By default, &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; hides everything. Use &lt;code&gt;defineExpose()&lt;/code&gt; to selectively expose internal functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nf"&gt;defineExpose&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;innerContainerRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;setUserAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;innerContainerRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;HTMLDivElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;setUserAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;userAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Provides a way to access and interact with a component's internal logic from the outside through its API. For example: custom wrapper components built on top of UI libraries.&lt;br&gt;
⚠️ Use with caution as it is a highly specialized approach that can usually be avoided&lt;/p&gt;


&lt;h3&gt;
  
  
  🔍 &lt;code&gt;shallowReactive&lt;/code&gt; and &lt;code&gt;shallowRef&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Use these for performance when you &lt;strong&gt;don’t need deep reactivity&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;shallowReactive&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;nonReactiveProperty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;reactiveProperty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reactiveProperty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Will work, as `reactiveProperty` is reactive at the shallow level&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nonReactiveProperty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Will NOT work, as `nonReactiveProperty` is nested and not reactive in shallowReactive&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Improves performance when rendering large data trees at the first object level&lt;br&gt;
⚠️ Use with caution, as it may cause unexpected bugs in the application due to limiting reactivity&lt;/p&gt;


&lt;h3&gt;
  
  
  🔄 &lt;code&gt;customRef&lt;/code&gt; — Custom reactive logic
&lt;/h3&gt;

&lt;p&gt;You can intercept &lt;code&gt;.value&lt;/code&gt; behavior — great for debouncing, throttling, validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;customRef&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;track&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;track&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newVal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="cm"&gt;/** Assume that the function `validateAddress` is defined elsewhere **/&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;validateAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newVal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="cm"&gt;/** Validate against specific rules **/&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newVal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="cm"&gt;/** Notify reactivity system **/&lt;/span&gt;
      &lt;span class="nf"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1600 Pennsylvania Avenue NW, Washington, DC 20500&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;invalidAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Will be set because it passes validation&lt;/span&gt;
&lt;span class="nx"&gt;userAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;validAddress&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;validAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Should be `true`&lt;/span&gt;

&lt;span class="c1"&gt;// ❌ Will not be set because it fails validation rules&lt;/span&gt;
&lt;span class="nx"&gt;userAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;invalidAddress&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userAddress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;invalidAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Should be `false`&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔄 &lt;code&gt;v-model&lt;/code&gt; in &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Vue 3 offers powerful enhancements to how &lt;code&gt;v-model&lt;/code&gt; is used within the &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt; context — including support for multiple models and modifiers.&lt;/p&gt;

&lt;h4&gt;
  
  
  ⤷ Multiple &lt;code&gt;v-model&lt;/code&gt; bindings
&lt;/h4&gt;

&lt;p&gt;You can define multiple &lt;code&gt;v-model&lt;/code&gt;s by naming each model explicitly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineModel&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isPublished&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineModel&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;published&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Eliminates the need to manually declare &lt;code&gt;props&lt;/code&gt; and emit events for model binding.&lt;/p&gt;

&lt;h4&gt;
  
  
  ⤷ &lt;code&gt;v-model&lt;/code&gt; modifiers (built-in &amp;amp; custom)
&lt;/h4&gt;

&lt;p&gt;Modifiers let you transform input data automatically — great for building reusable, format-aware input components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in modifiers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.trim&lt;/code&gt; — trims whitespace&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.number&lt;/code&gt; — converts value to a number&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.lazy&lt;/code&gt; — updates on &lt;code&gt;change&lt;/code&gt; instead of &lt;code&gt;input&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model.number.lazy=&lt;/span&gt;&lt;span class="s"&gt;"filterId"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The input is converted to a number&lt;/li&gt;
&lt;li&gt;The update happens on &lt;code&gt;change&lt;/code&gt;, not on every keystroke&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ⤷ Custom modifiers with &lt;code&gt;defineModel&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;You can also define your own modifiers using the &lt;code&gt;[model, modifiers]&lt;/code&gt; destructuring pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model.date=&lt;/span&gt;&lt;span class="s"&gt;"filterAge"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"date"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;modifiers&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defineModel&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;modifiers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;convertDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Custom conversion logic&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Pushes formatting logic into the component layer&lt;br&gt;&lt;br&gt;
✅ Keeps templates clean and declarative&lt;br&gt;&lt;br&gt;
✅ Makes base components more reusable and flexible&lt;/p&gt;


&lt;h3&gt;
  
  
  🧩 &lt;code&gt;defineOptions&lt;/code&gt; — Compile-time component metadata
&lt;/h3&gt;

&lt;p&gt;Set name, inheritAttrs, and more at compile time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="cm"&gt;/**
 * Equivalent to `export default`.
*/&lt;/span&gt;
&lt;span class="nf"&gt;defineOptions&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CustomButton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;inheritAttrs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Especially useful when creating wrapper components or building reusable libraries&lt;br&gt;
💡 Can be helpful for components located at &lt;code&gt;CustomButton/index.vue&lt;/code&gt;, where the file name doesn’t match the desired component name&lt;br&gt;
ℹ️ Reminder: In SFCs, the component name is automatically inferred from the file name if no explicit &lt;code&gt;name&lt;/code&gt; option is set. This can be important when you need to make recursive component calls.&lt;/p&gt;


&lt;h3&gt;
  
  
  Suspense
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Suspense&lt;/code&gt; is a built-in Vue 3 component that helps you handle asynchronous operations in your templates gracefully. It allows you to display fallback content (like a loading spinner or message) while waiting for async components or data to load.&lt;/p&gt;
&lt;h4&gt;
  
  
  Key features
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Delays rendering&lt;/strong&gt; of child components until async operations (e.g., &lt;code&gt;async setup()&lt;/code&gt;, async components) complete.&lt;/li&gt;
&lt;li&gt;Displays &lt;strong&gt;fallback UI&lt;/strong&gt; during the loading phase.&lt;/li&gt;
&lt;li&gt;Supports managing multiple asynchronous dependencies simultaneously.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Usage example
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Suspense&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;template&lt;/span&gt; &lt;span class="na"&gt;#default&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;AsyncComponent&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="na"&gt;#fallback&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;Loading...&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Suspense&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AsyncComponent&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./AsyncComponent.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  When to use
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;To optimize interface loading by lazy-loading heavy or complex components.&lt;/li&gt;
&lt;li&gt;For canvas or WebGL components that asynchronously load models or resources.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🎭 Script Logic and template binding in &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;v-bind&lt;/code&gt; in styles for fully reactive CSS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Button
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nx"&gt;defineProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;scoped&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"scss"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#212121&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;v-bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Use with caution, as it only supports primitives. The following example will not work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Button
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nx"&gt;defineProps&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt; &lt;span class="na"&gt;scoped&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"scss"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#212121&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/* ❌ This will not work */&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;v-bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;styles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/* or styles['color'] */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;style&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Final thought
&lt;/h2&gt;

&lt;p&gt;I hope you found this useful and maybe even a bit fun to explore.&lt;br&gt;
If it sparked your interest — stay tuned and consider subscribing to my blog!&lt;/p&gt;

&lt;p&gt;I've got a long list of upcoming articles, not only on development and Vue, but also on topics like team leadership, engineering management, and the bigger picture of building great products.&lt;/p&gt;

&lt;p&gt;See you in the comments — and thanks for reading! 🚀&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
