Alpine x-node
directive
Alpine's x-text
and x-html
directives allow you to set an element's text or HTML content, but what if you have a DOM node, either from the current page or one that you've created, and want to add that to an element with Alpine?
You could use innerHTML
and x-html
, but that may not be very efficient. Instead you can implement a custom directive that gives you the ability to add DOM nodes directly:
import Alpine from 'alpinejs'Alpine.directive('node', (el, { modifiers, expression }) => {let evaluate = Alpine.evaluateLater(el, expression)Alpine.effect(() => {evaluate(value => {Alpine.mutateDom(() => {if (value) {const node = modifiers.includes('clone')? value.cloneNode(true): value;el.replaceChildren(node);} else {el.replaceChildren();}})})})});
import Alpine from 'alpinejs'Alpine.directive('node', (el, { modifiers, expression }) => {let evaluate = Alpine.evaluateLater(el, expression)Alpine.effect(() => {evaluate(value => {Alpine.mutateDom(() => {if (value) {const node = modifiers.includes('clone')? value.cloneNode(true): value;el.replaceChildren(node);} else {el.replaceChildren();}})})})});
You can use x-node
in your markup, it works in exactly the same way as x-text
and x-html
. If you want to add a clone of the node rather than the original you can use the clone
modifier:
<div x-node="item"></div><div x-node.clone="item"></div>
<div x-node="item"></div><div x-node.clone="item"></div>