跳到主要内容

Alpine.store

Alpine 通过 Alpine.store() API 提供全局状态管理。

注册存储

你可以在 alpine:init 监听器内定义 Alpine 存储(通过 <script> 标签引入 Alpine 的情况),或者在手动调用 Alpine.start() 之前定义(将 Alpine 导入打包工具的情况):

通过 script 标签:

<script>
document.addEventListener('alpine:init', () => {
Alpine.store('darkMode', {
on: false,

toggle() {
this.on = ! this.on
}
})
})
</script>

从打包工具:

import Alpine from 'alpinejs'

Alpine.store('darkMode', {
on: false,

toggle() {
this.on = ! this.on
}
})

Alpine.start()

访问存储

你可以使用 $store 魔法属性在 Alpine 表达式中访问任何存储中的数据:

<div x-data :class="$store.darkMode.on && 'bg-black'">...</div>

你也可以修改存储中的属性,所有依赖这些属性的内容都会自动响应。例如:

<button x-data @click="$store.darkMode.toggle()">Toggle Dark Mode</button>

此外,你可以省略第二个参数,使用 Alpine.store() 从外部访问存储,如下所示:

<script>
Alpine.store('darkMode').toggle()
</script>

初始化存储

如果你在 Alpine 存储中提供 init() 方法,它将在存储注册后立即执行。这对于使用合理的起始值初始化存储中的任何状态很有用。

<script>
document.addEventListener('alpine:init', () => {
Alpine.store('darkMode', {
init() {
this.on = window.matchMedia('(prefers-color-scheme: dark)').matches
},

on: false,

toggle() {
this.on = ! this.on
}
})
})
</script>

注意上面示例中新增的 init() 方法。有了这个添加,on 存储变量将在 Alpine 在页面上渲染任何内容之前设置为浏览器的颜色方案偏好。

单值存储

如果你不需要为存储提供整个对象,可以将任何类型的数据设置并用作存储。

以下是上面的示例,但更简单地将其用作布尔值:

<button x-data @click="$store.darkMode = ! $store.darkMode">Toggle Dark Mode</button>

...

<div x-data :class="$store.darkMode && 'bg-black'">
...
</div>

<script>
document.addEventListener('alpine:init', () => {
Alpine.store('darkMode', false)
})
</script>