Alpine.js入门教程

Alpine.js入门教程

Alpine.js。它是类似于Vue或者React这样的 响应式和声明式特性组件化开发框架,但是它更加轻量。可以理解为 JavaScript 版本的 Tailwind。

Alpine.js入门教程

备注:Alpine.js 的语法几乎完全借用自 Vue (并用 Angular 的语法做了些扩展)。下面我们来一步一步讲解安装使用及注意事项

一、安装 Alpine

有以下两种安装方式

1、使用 CDN: 

把以下脚本加入到你的 <head> 尾部.

<script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine.min.js" defer></script>

就是这样,Alpine.js 会自行初始化。

生产环境中,建议在链接中锁定特定版本号,以此避免新版本中的变更造成问题。 例如,锁定版本为 2.8.2 (最新版本):

<script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.8.2/dist/alpine.min.js" defer></script>


2、使用 npm:

 从 npm 安装依赖包。

npm i alpinejs

并在你的脚本中引入它。

import 'alpinejs'

需要 IE11 支持的场景 改用这段脚本。

<script type="module" src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine.min.js"></script>
<script nomodule src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine-ie11.min.js" defer></script>

这一写法使用了 module/nomodule 模式(英文) ,这样的写法可以让现代浏览器自动加载模块版本依赖,而在 IE11 或其他早期浏览器中自动加载专属兼容版本

二、使用

以下几行代码实现了一个下拉菜单,无需在编写单独的js,直接在html中定义就好了,代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>alpine</title>
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/alpine.min.js"></script>

</head>
<body>

    <div x-data="{ open: false }">
        <button @click="open = true">Open Dropdown</button>

        <ul
            x-show="open"
            @click.away="open = false"
            >
            Dropdown Body
        </ul>
    </div>

</body>
</html>

我们再来实现一个标签页 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>alpine</title>
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/alpine.min.js"></script>

</head>
<body>
    <div x-data="{ tab: 'foo' }">
        <button :class="{ 'active': tab === 'foo' }" @click="tab = 'foo'">Foo</button>
        <button :class="{ 'active': tab === 'bar' }" @click="tab = 'bar'">Bar</button>

        <div x-show="tab === 'foo'">
            Tab Foo
        </div>
        <div x-show="tab === 'bar'">
            Tab Bar
        </div>
    </div>
</body>
</html>

我们再来一个ajax请求接口数据生成下拉菜单的

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>alpine</title>
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/alpine.min.js"></script>

</head>
<body>

    <div x-data="{ open: false }">
        <button
            @mouseenter.once="
            fetch('/dropdown-partial.html')
            .then(response => response.text())
            .then(html => { $refs.dropdown.innerHTML = html })
            "
            @click="open = true"
            >Show Dropdown</button>

        <div x-ref="dropdown" x-show="open" @click.away="open = false">
            Loading Spinner...
        </div>
    </div>
</body>
</html>

ajax的接口没有数据,所以显示404

一、指令及属性


当前共有 14 个指令可用,如下所示:

指令 描述
x-data 定义一个新的组件作用域。
x-init 组件初始化时运行其中的表达式。
x-show 根据表达式结果(true 或 false)控制元素的 display: none;(译者注:控制模块显示/隐藏)
x-bind 将当前属性的值设定为指令中表达式的结果。
x-on 向元素上挂载事件监听器。当事件触发时执行其中的表达式。
x-model 向当前元素新增「双向数据绑定」。保持输入元素与组件数据同步。
x-text 和 x-bind 类似,但更新的是元素的 innerText。
x-html 和 x-bind 类似,但更新的是元素的 innerHTML。
x-ref 在组件外获取原始 DOM 元素的简便方法。
x-if 值为 false 时将从 DOM 中完全移除元素。需要在 <template> 标签中使用。
x-for 为数组中的每一项创建一个新的 DOM 节点。需要在 <template> 标签中使用。
x-transition 用于在过渡(CSS Translation)的各个阶段中为元素添加 class 的指令。
x-spread 为了更好的复用,可以绑定一个带有 Alpine 指令(作为 key)的对象到元素上。
x-cloak 这一属性会在 Alpine 初始化完成后被移除,可以用来隐藏未初始化的 DOM。
以及 6 个魔法属性:

魔法属性 描述
$el 获取根元素的 DOM 节点。
$refs 获取组件中标记有 x-ref 的 DOM 元素。
$event 在事件监听器中获取浏览器原生的「Event」对象。
$dispatch 创建一个「CustomEvent」并使用其内部的 .dispatchEvent() 方法进行分发。
$nextTick 在 Alpine 做出响应式 DOM 更新后,执行一个给出的表达式。
$watch 当监听的组件属性发生变化时,触发给定的回调函数。

指令 Directives

x-data

x-data 将定义一个新的组件作用域。它将通知框架初始化带有传入数据的一个新组件。

类似 Vue 组件中的 data 属性。

例如: <div x-data="{ foo: 'bar' }">...</div>

结构: <div x-data="[可迭代对象]">...</div>

抽离组件逻辑

你可以把数据(以及行为)通过一个可复用的函数抽离出来:

<div x-data="dropdown()">
<button x-on:click="open">Open</button>

<div x-show="isOpen()" x-on:click.away="close">
// Dropdown
</div>
</div>

<script>
function dropdown() {
return {
show: false,
open() { this.show = true },
close() { this.show = false },
isOpen() { return this.show === true },
}
}
</script>


注意 Alpine.js 操作的函数都在全局作用域(window),你需要把 x-data 使用的函数声明到 window 上,例如 window.dropdown = function () {} (因为在 Webpack, Rollup, Parcel 等工具中,function 默认会被挂载模块作用域,而非 window).

你也可以通过对象解构语法,把多个数据对象混合起来:

<div x-data="{...dropdown(), ...tabs()}">

x-init

x-init 将在组件初始化时运行给定的表达式。

例如: <div x-data="{ foo: 'bar' }" x-init="foo = 'baz'"></div>

结构: <div x-data="..." x-init="[表达式]"></div>

如果你希望代码在 Alpine 对 DOM 进行初始化更新后再调用(类似 VueJS 中的 mounted() 钩子),你可以传入一个回调函数,它将在 DOM 操作完成后被调用,例如:

x-init="() => { // we have access to the post-dom-initialization state here // }"

x-show

x-show 将根据表达式结果(true 或 false)控制元素的 display: none;(译者注:控制模块显示/隐藏)

例如: <div x-show="open"></div>

结构: <div x-show="[表达式]"></div>

x-show.transition


x-show.transition 是一个可以让你在使用 x-show 操作 CSS 过渡(Transition)时更爽的简便 API。

<div x-show.transition="open">
这段内容会在过渡中滑入/滑出。
</div>
指令 描述
x-show.transition 同时滑入/滑出并缩放(默认值:opacity, scale: 0.95, timing-function: cubic-bezier(0.4, 0.0, 0.2, 1), duration-in: 150ms, duration-out: 75ms)
x-show.transition.in 仅滑入
x-show.transition.out 仅滑出
x-show.transition.opacity 仅使用淡入淡出
x-show.transition.scale 仅使用缩放
x-show.transition.scale.75 自定义 CSS 缩放转换为 transform: scale(.75).
x-show.transition.duration.200ms 设定 "in" 的的过渡时间为 200ms。出动作("out")将是它的一半 (100ms).
x-show.transition.origin.top.right 自定义 CSS 转换起始位置为 transform-origin: top right.
x-show.transition.in.duration.200ms.out.duration.50ms 为 "in" 和 "out" 设定不同的过渡时间。
备注: 所有的过渡修饰符都可组合使用。也就是说可以这么用(虽然真这么用过于粗暴23333): x-show.transition.in.duration.100ms.origin.top.right.opacity.scale.85.out.duration.200ms.origin.bottom.left.opacity.scale.95

备注: x-show 将等待子元素完成 out。如果你希望跳过这一行为,可以添加 .immediate 修饰符:

<div x-show.immediate="open">
<div x-show.transition="open">
</div>

x-bind

x-bind 将当前属性的值设定为指令中表达式的结果。 这一表达式可以访问组件数据对象中的所有 key,并在每次数据更新时重算结果。

备注:可以用 ":" 简写语法替代,例如: :type="...".

例如: <input x-bind:type="inputType">

结构: <input x-bind:[HTML属性]="[表达式]">

备注: 属性数据绑定只会在依赖的值更新时被重算。框架足够智能,可以观测数据变化并检测绑定是否关心这些变化。

x-bind 到 class 属性


x-bind 在完成到 class 属性的绑定时,行为略有不同。

对于 class,你可以传入一个对象,key 为 class 名,值为布尔量,用来表示对应 ...

点击查看剩余70%

{{collectdata}}

网友评论0