如何将 类 添加到 AlpineJS 元素之外的元素
How to add classes to an element outside of AlpineJS element
我有一个简单的问题,但它让我疯狂地想锻炼。
我正在使用 AlpineJS 来显示和隐藏内容。
通常在 alpine 中,按钮和内容会在同一个元素中,但在这里我把它放在它的外面。这行得通。
但是当内容打开或关闭时,我无法将 类 添加到按钮和内容 div。
谁能指导一下。
<!-- button -->
<div class="mt-4" x-data="{id: 1}">
<button
@click="$dispatch('open-dropdown',{id})"
type="button"
class="bg-white hover:bg-gray-50"
:class="{ 'bg-green-400': open, 'bg-gray-200': !(open) }">
I'm the button
</button>
</div>
<!-- popup 1 -->
<div x-data="{ open: false }"
x-show="open"
@open-dropdown.window="if ($event.detail.id == 1) open = true"
@click.away="open = false">
<div
class="bg-white hover:bg-gray-50"
:class="{ 'bg-green-400': open, 'bg-gray-200': !(open) }">
I'm the content
</div>
</div>
为此,您可以将 open
状态移动到页面上所有组件都可以访问的全局 Alpine.js' $store
对象中。
<!-- button -->
<div class="mt-4" x-data="{id: 1}">
<button @click="$dispatch('open-dropdown',{id})"
type="button"
class="bg-white hover:bg-gray-50"
:class="{ 'bg-green-400': $store.open, 'bg-gray-200': !($store.open) }">
I'm the button
</button>
</div>
<!-- popup 1 -->
<div x-data
x-show="$store.open"
@open-dropdown.window="if ($event.detail.id == 1) $store.open = true"
@click.away="$store.open = false">
<div class="bg-white hover:bg-gray-50"
:class="{ 'bg-green-400': $store.open, 'bg-gray-200': !($store.open) }">
I'm the content
</div>
</div>
<script>
document.addEventListener('alpine:init', () => {
Alpine.store('open', false)
})
</script>
由于我们在商店中的 open
状态是一个简单的值,我们可以将每个 open
替换为 $store.open
。请注意,popup 1
组件仍然需要一个空的 x-data
属性。
我有一个简单的问题,但它让我疯狂地想锻炼。 我正在使用 AlpineJS 来显示和隐藏内容。 通常在 alpine 中,按钮和内容会在同一个元素中,但在这里我把它放在它的外面。这行得通。 但是当内容打开或关闭时,我无法将 类 添加到按钮和内容 div。
谁能指导一下。
<!-- button -->
<div class="mt-4" x-data="{id: 1}">
<button
@click="$dispatch('open-dropdown',{id})"
type="button"
class="bg-white hover:bg-gray-50"
:class="{ 'bg-green-400': open, 'bg-gray-200': !(open) }">
I'm the button
</button>
</div>
<!-- popup 1 -->
<div x-data="{ open: false }"
x-show="open"
@open-dropdown.window="if ($event.detail.id == 1) open = true"
@click.away="open = false">
<div
class="bg-white hover:bg-gray-50"
:class="{ 'bg-green-400': open, 'bg-gray-200': !(open) }">
I'm the content
</div>
</div>
为此,您可以将 open
状态移动到页面上所有组件都可以访问的全局 Alpine.js' $store
对象中。
<!-- button -->
<div class="mt-4" x-data="{id: 1}">
<button @click="$dispatch('open-dropdown',{id})"
type="button"
class="bg-white hover:bg-gray-50"
:class="{ 'bg-green-400': $store.open, 'bg-gray-200': !($store.open) }">
I'm the button
</button>
</div>
<!-- popup 1 -->
<div x-data
x-show="$store.open"
@open-dropdown.window="if ($event.detail.id == 1) $store.open = true"
@click.away="$store.open = false">
<div class="bg-white hover:bg-gray-50"
:class="{ 'bg-green-400': $store.open, 'bg-gray-200': !($store.open) }">
I'm the content
</div>
</div>
<script>
document.addEventListener('alpine:init', () => {
Alpine.store('open', false)
})
</script>
由于我们在商店中的 open
状态是一个简单的值,我们可以将每个 open
替换为 $store.open
。请注意,popup 1
组件仍然需要一个空的 x-data
属性。