Every component in Alpine starts with the x-data directive. x-data directive defines the reactive data for that component to reference. x-data can only use a sync function. Otherwise, you may encounter "DOMException: Failed to execute 'querySelectorAll'".
Call fetch in x-init
<div class="p-6"
x-data="{items: [], visibleItems: 3}"
x-init="
fetch('https://invest.bangtech.com/webs/api/Stock/StockQuote?format=json&s=AAPL,AMZN,BA,BAC,CAT,CVS')
.then(response => response.json())
.then(data => items = data.slice(0, 5));
">
<template x-for="(it,id) in items">
<div
class="border p-4 mb-4 flex justify-between items-center"
x-transition
>
<div
class="bg-blue-500 w-12 h-12 rounded-full text-white text-center flex justify-center items-center"
x-text="id + 1"
>
</div>
</div>
</template>
</div>
Call async function in x-init
<script>
function loadData() {
return {
items: [],
visibleItems: 3,
async doLoadData()
{
fetch('https://invest.bangtech.com/webs/api/Stock/StockQuote?format=json&s=AAPL,AMZN,BA,BAC,CAT')
.then(resp => resp.json())
.then(data => { this.items = data; });
}
}
}
</script>
<div class="p-6"
x-data="loadData()"
x-init="items = await doLoadData()">
<template x-for="(it,id) in items">
<div
class="border p-4 mb-4 flex justify-between items-center"
x-transition
>
<div
class="bg-blue-500 w-12 h-12 rounded-full text-white text-center flex justify-center items-center"
x-text="id + 1"
>
</div>
</div>
</template>
</div>