Create a SPA in Seconds Using wire:navigate in Livewire v3

Published on
Jigar Patel-
4 min read

Overview

livewire-create-spa

Create a SPA in Seconds Using wire:navigate in Livewire v3

Introduction

Have you ever wondered how to make your web application lightning-fast without the complexity of building a Single Page Application (SPA)? In this tutorial, we'll explore how you can achieve the speediness of SPAs in your Laravel apps using Livewire v3 and the new wire:navigate attribute, all without the need to write an API.

Traditional Laravel applications involve multiple pages and require a full page reload whenever a user clicks a link. Single Page Applications (SPAs), on the other hand, take a different approach. Instead of reloading the entire page, only specific parts are refreshed, eliminating the overhead of re-downloading JavaScript and CSS assets with every request. This leads to a significantly enhanced browsing experience.

Let's dive into how the wire:navigate attribute can give your Laravel app the speediness of SPAs.

How to Use wire:navigate

Using wire:navigate is incredibly straightforward. Simply add it as an attribute to your links, like so:

<nav>
  <a href="/" wire:navigate>Dashboard</a>
  <a href="/posts" wire:navigate>Posts</a>
  <a href="/users" wire:navigate>Users</a>
</nav>

When a user clicks on one of these links, instead of the browser visiting the new page, Livewire steps in. Livewire employs its own efficient method to retrieve and render the page, giving your app a noticeable speed boost.

Using wire:navigate for Redirects

Need to smoothly redirect users within your app? With wire:navigate, you can make these transitions seamless. Here's how you can do it in your Livewire component:

return $this->redirect('/posts', navigate: true);

This instructs Livewire to use its wire:navigate function to swiftly take users to the new page.

The key to the speediness of wire:navigate lies in prefetching. As soon as a user hovers their mouse over a link, Livewire springs into action. By the time they click, the new page is already prepared and waiting. For even faster transitions, you can use the .hover modifier, like this:

<a href="/posts" wire:navigate.hover>Posts</a>

Persisting Elements Across Page Visits with wire:navigate

Do you want to keep certain parts of your UI consistent between page loads? Let Livewire assist with the @persist directive. This is particularly useful for elements like audio or video players:

@persist('player')
<audio src="{{ $episode->file }}" controls></audio>
@endpersist

With this, your players will continue playing uninterrupted, regardless of how many pages your users browse.

Updating the Page Before Navigating Away

With wire:navigate, there's no need to risk losing your user's progress. You can use the livewire:navigating event to run JavaScript before the page change and perform any necessary actions:

document.addEventListener('livewire:navigating', () => {
  // Modify your HTML here
});

Script Evaluation in wire:navigate

Since content is replaced with every page view, you might want to use the livewire:navigated event, which is triggered every time the DOM has been fully replaced. This is preferable to DOMContentLoaded, which is only called after the first page load:

document.addEventListener('livewire:navigated', () => {
  // Initialize 3rd-party libraries here...
});

Reloading Pages When Assets Change Using wire:navigate

To ensure your JavaScript stays up-to-date after deployment, you can add data-navigate-track to your <script> tags:

<head>
  <script src="/app.js?id=123" data-navigate-track></script>
</head>

Updating the version hash in this way will force a full page reload, ensuring that everyone gets the latest script.

Quick summary

By now, you've become proficient in enhancing your Laravel application's speed using Livewire's wire:navigate attribute. Remember, it's not about turning your application into a full SPA; it's about reaping the benefits of speed and responsiveness.

Fast, seamless browsing is no longer limited to JavaScript-heavy applications. With Livewire and wire:navigate, you have all the power you need to create a smooth and efficient user experience.

About the Author

Jigar Patel is a React.js enthusiast and a software developer at JBCodeapp Company. Visit our JBCodeapp to learn more about our work in the React.js ecosystem.

We're Hiring

Are you passionate about React.js development? We're always on the lookout for talented developers to join our team. Check out our careers page for current job openings.

  • Laravel vs. CodeIgniter Your Complete Handbook to Selecting the Perfect PHP Framework

  • Choosing Laravel for Web and PHP Development

  • Leading Laravel Development Services Provider

  • Mastering Laravel Artisan: 20 Essential Commands for Effortless Development

  • Laravel Post View Counter: Monitor Your Content's Popularity

  • Laravel Send Email using Queue Example

  • Simplify Laravel Routing Like a Pro with Folio

  • Authentication in Laravel: A Comprehensive Guide