Alpine JS - 创建具有活动状态的菜单
Alpine JS - Creating a menu with active states
我正在尝试使用 Alpine JS 创建侧边栏菜单
我什至不确定这是否可以用 Alpine JS 来实现。
@foreach($kanbans as $kanban)
<div x-data="activeKanban : ????">
<div @click="activeKanban = {{$kanban->id}}">
<div x-show="activeKanban !== {{$kanban->id}}">
// Design for collapsed kanban
</div>
<div>
<div x-show="activeKanban === {{$kanban->id}}">
// Design for active kanban
</div>
</div>
@endforeach
当我切换页面时,$kanban->id
发生了变化,我想知道不是手动设置 activeKanban : 1
是否有办法将此信息传递给 AlpineJS?
所以默认情况下,如果我加载其他页面,打开的默认菜单将基于 ID,而不是全部折叠或仅打开指定的 1 个?
如果您的目标是手风琴式菜单,您可以根据您共享的代码使用 AlpineJs 实现它:
// Set x-data on a div outside the loop and add your active kanban as a property
<div x-data="{
activeKanban: {{ $activeKanbanId ?? null }}
}">
@foreach($kanbans as $kanban)
<div @click="activeKanban = {{ $kanban->id }}">
<div x-show="activeKanban !== {{ $kanban->id }}">
// Collapsed view
</div>
<div x-show="activeKanban === {{ $kanban->id }}">
// Expanded view
</div>
</div>
@endforeach
</div>
这里每个看板菜单项都可以访问 AlpineJs 组件实例中的 activeKanban
属性 并可以对其进行响应式设置。
即如果 activeKanban
设置为新 ID,则当前打开的项目将关闭,新的将打开
增加灵活性
如果你想单独打开和关闭它们怎么办?有不止一种方法可以实现这一点,但在这种情况下,我们可以修改上面的代码以允许它:
// Here we add an array of openItems and two helper functions:
// isOpen() - to check if the id is either the activeKanban or in the openItems array
// toggle() - to add/remove the item from the openItems array
<div x-data="{
activeKanban: {{ $activeKanbanId ?? null }},
openItems: [],
isOpen(id){
return this.activeKanban == id || openItems.includes(id)
},
toggle(id){
if(this.openItems.includes(id)){
this.openItems = this.openItems.filter(item => {
return item !== id
});
}else{
this.openItems.push(id)
}
}
}">
@foreach($kanbans as $kanban)
<div @click="toggle({{ $kanban->id }})">
<div x-show="!isOpen({{$kanban->id}})">
// Collapsed view
</div>
<div x-show="isOpen({{$kanban->id}})">
// Expanded view
</div>
</div>
@endforeach
</div>
这允许我们设置一个活动项,也可以选择 open/close 其他菜单项。
我正在尝试使用 Alpine JS 创建侧边栏菜单
我什至不确定这是否可以用 Alpine JS 来实现。
@foreach($kanbans as $kanban)
<div x-data="activeKanban : ????">
<div @click="activeKanban = {{$kanban->id}}">
<div x-show="activeKanban !== {{$kanban->id}}">
// Design for collapsed kanban
</div>
<div>
<div x-show="activeKanban === {{$kanban->id}}">
// Design for active kanban
</div>
</div>
@endforeach
当我切换页面时,$kanban->id
发生了变化,我想知道不是手动设置 activeKanban : 1
是否有办法将此信息传递给 AlpineJS?
所以默认情况下,如果我加载其他页面,打开的默认菜单将基于 ID,而不是全部折叠或仅打开指定的 1 个?
如果您的目标是手风琴式菜单,您可以根据您共享的代码使用 AlpineJs 实现它:
// Set x-data on a div outside the loop and add your active kanban as a property
<div x-data="{
activeKanban: {{ $activeKanbanId ?? null }}
}">
@foreach($kanbans as $kanban)
<div @click="activeKanban = {{ $kanban->id }}">
<div x-show="activeKanban !== {{ $kanban->id }}">
// Collapsed view
</div>
<div x-show="activeKanban === {{ $kanban->id }}">
// Expanded view
</div>
</div>
@endforeach
</div>
这里每个看板菜单项都可以访问 AlpineJs 组件实例中的 activeKanban
属性 并可以对其进行响应式设置。
即如果 activeKanban
设置为新 ID,则当前打开的项目将关闭,新的将打开
增加灵活性
如果你想单独打开和关闭它们怎么办?有不止一种方法可以实现这一点,但在这种情况下,我们可以修改上面的代码以允许它:
// Here we add an array of openItems and two helper functions:
// isOpen() - to check if the id is either the activeKanban or in the openItems array
// toggle() - to add/remove the item from the openItems array
<div x-data="{
activeKanban: {{ $activeKanbanId ?? null }},
openItems: [],
isOpen(id){
return this.activeKanban == id || openItems.includes(id)
},
toggle(id){
if(this.openItems.includes(id)){
this.openItems = this.openItems.filter(item => {
return item !== id
});
}else{
this.openItems.push(id)
}
}
}">
@foreach($kanbans as $kanban)
<div @click="toggle({{ $kanban->id }})">
<div x-show="!isOpen({{$kanban->id}})">
// Collapsed view
</div>
<div x-show="isOpen({{$kanban->id}})">
// Expanded view
</div>
</div>
@endforeach
</div>
这允许我们设置一个活动项,也可以选择 open/close 其他菜单项。