31 August 2024

Functional Components

Functional components in Vue.js offer several advantages in specific scenarios. Understanding when to use them can lead to more efficient and optimised applications. Here are the key situations where functional components are particularly useful:

Stateless Components: Functional components are perfect for stateless components, which do not manage or track any internal state. Instead, they render purely based on the props passed to them. Examples of such components include presentational components that only render HTML based on props, often referred to as UI bling, and UI elements like buttons, icons, or labels. These components focus solely on displaying data, making them simple, efficient, and easy to test.

Performance Optimisation: Functional components are faster and lighter because they do not maintain an internal state, lack lifecycle hooks, and are essentially simple functions that return the Virtual DOM. This makes them particularly useful when you need to efficiently render a large number of simple components, as their streamlined nature enhances performance and reduces overhead.

Purely Presentational Logic: When a component's sole purpose is to render its props, using a functional component ensures simplicity and avoids unnecessary overhead. Functional components are straightforward and easier to understand, as they focus solely on rendering without the need for additional Vue instance properties. This streamlined approach makes the component more efficient and easier to maintain.

Reusable Components: Functional components are excellent for creating small, reusable components that don't need to maintain their own state. These can be used across different parts of your Vue or Nuxt application with ease.

Custom Render Functions: Functional components are ideal when you need to create custom render functions, as they are useful for implementing advanced rendering logic and optimising component rendering. In other words, functional components can be written as Render Function Component as well. This approach allows you to manage how components are rendered without the overhead associated with reactive data and lifecycle methods, resulting in more efficient and performant applications.

Reducing Component Overhead: By using functional components, you reduce the overhead associated with full Vue components, making your application leaner and potentially faster.

Functional components in Vue.js are highly useful for certain scenarios, particularly when dealing with stateless, presentational, or reusable components, and when performance is a critical concern. By leveraging functional components, you can create more efficient and streamlined applications.

Functional Component Example

Stateless and pure presentational approach allows the underlying logic to remain consistent, while the HTML markup can be adjusted as needed. Below is an example of the Numeric Input component implemented as a functional component.

... Renderless Component as an SFC (parent)
quantity: ref(0)
Functional Input as an SFC (child)

Functional components can be implemented as either Single File Components or Render Function components. In both versions, they receive properties and methods via props to render the necessary HTML or UI. Their primary responsibility is the presentational aspect of the component.

For our Numeric Input component, the functional implementation is quite markup-heavy. You can view the complete example of the Numeric Input component as a Functional component (written as an SFC) here.

Additionally, you can see the full example of the Numeric Input component as a Functional Component (written as a Render Function) here. This version features a slightly different presentation, demonstrating how the underlying logic can remain the same but the component's appearance can vary.

In case you have missed earlier articles, you can learn about Render Function components in Vue.js here.