npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@leanadmin/wire-replace

v0.1.3

Published

wire:replace directive for Livewire

Downloads

696

Readme

wire-replace

This package adds a new directive to Livewire: wire:replace. The directive is useful for solving DOM diffing issues.

For example, if you have the following template:

<div>
    Showing
    <span class="font-medium">{{ $paginator->firstItem() }}</span>
    to
    <span class="font-medium">{{ $paginator->lastItem() }}</span>
    of
    <span class="font-medium">{{ $paginator->total() }}</span>
    results
</div>

The numbers will eventually merge into a single value if you update the component's data a few times.

To solve this, you'd wrap all of those free-floating strings in <span>s. And sure, it would work here.

But:

  • it's ugly
  • it won't work in situations where you display template that you don't have control over (translated templates, rich text added by users, ...)

A better solution is to have a directive that tells Livewire to always replace the element. Sort of like an opposite to wire:ignore.

Usage

This package adds two extremely simple directives: wire:replace and wire:replace.self. Simply use them on elements that you want fully replaced.

To tell Livewire that the element's children should always be replaced:

<div wire:replace>
    Showing
    ...
</div>

To tell Livewire that the element itself plus its children should always be replaced:

<div wire:replace.self>
    Showing
    ...
</div>

Installation

npm dependency

Install the package:

npm install --dev @leanadmin/wire-replace

Register the directive in your app.js file:

import wire_replace from '@leanadmin/wire-replace';

window.Livewire.hook(...wire_replace);

CDN

Simply include the JS file in your layout (after Livewire's scripts) and the directive will automatically register itself.

@livewireScripts

<script src="https://unpkg.com/@leanadmin/[email protected]/dist/wire_replace.js"></script>

Performance

Livewire doesn't expose its internal morphdom class which would allow us to just tell morphdom to stop diffing the current tree if when it encounters an element with a wire:replace attribute.

So instead, we hook into Livewire's element.updating event and we replace the target element fully with the new element, before Livewire/morphdom can attempt more intelligent diffs.

This is likely less performant than hooking into morphdom's events, but in most cases it won't matter. The main use case of this package is small bits of templates where Livewire can't figure things out itself and wire:key doesn't help. And for that, it works completely smoothly.