Alpine.js x-template: Recursive template (tree rendering)
by rameel
HTML
<template id="treeitem">
<span x-text="model.name"></span>
<template x-if="model.list">
<ul>
<template x-for="item in model.list">
<!-- Recursively apply the current template to render nested items -->
<li x-template="treeitem" x-data="{ model: item }"></li>
</template>
</ul>
</template>
</template>
<ul x-data="json">
<li x-template="treeitem"></li>
</ul>
<script>
const json = {
model: {
name: 'root',
list: [
{
name: 'Documents',
list: [
{ name: 'Resume.docx' },
{ name: 'CoverLetter.docx' }
]
},
{
name: 'Pictures',
list: [
{
name: 'Nature',
list: [
{ name: 'Mountains.jpg' },
{ name: 'River.jpg' }
]
}
]
}
]
}
};
</script>
<script src="https://cdn.jsdelivr.net/npm/@ramstack/alpinegear-template@1/alpinegear-template.min.js" defer></script>
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3/dist/cdn.min.js" defer></script>