跳转至

x-init

x-init 指令允许你在 Alpine 中任何元素的初始化阶段注入代码。

<div x-init="console.log('I\'m being initialized!')"></div>

在上面的示例中,在进行进一步的 DOM 更新之前,控制台将输出 "I\'m being initialized!"。

再看另一个示例,在组件处理之前,使用 x-init 来获取一些 JSON 数据并存储到 x-data 中。

<div
    x-data="{ posts: [] }"
    x-init="posts = await (await fetch('/posts')).json()"
>...</div>

$nextTick

有时,你需要等到 Alpine 完全完成渲染后才执行某些代码。

这类似于 React 中的 useEffect(..., []),或 Vue 中的 mount

使用 Alpine 内部的 $nextTick 魔术属性可以实现这一点。

<div x-init="$nextTick(() => { ... })"></div>

独立的 x-init

你可以将 x-init 添加到 x-data HTML 块内部或外部的任何元素上。例如:

<div x-data>
    <span x-init="console.log('I can initialize')"></span>
</div>

<span x-init="console.log('I can initialize too')"></span>

自动执行 init() 方法

如果组件的 x-data 对象包含一个 init() 方法,它将自动被调用。例如:

<div x-data="{
    init() {
        console.log('I am called automatically')
    }
}">
    ...
</div>

对于使用 Alpine.data() 语法注册的组件也是如此。

Alpine.data('dropdown', () => ({
    init() {
        console.log('I will get evaluated when initializing each "dropdown" component.')
    },
}))

如果你同时拥有包含 init() 方法的 x-data 对象和 x-init 指令,那么 x-data 中的方法将先被调用,然后才是指令。

<div
    x-data="{
        init() {
            console.log('I am called first')
        }
    }"
    x-init="console.log('I am called second')"
    >
    ...
</div>