跳到主要内容

Morph 插件

Alpine 的 Morph 插件允许你将页面上的元素"变形"为提供的 HTML 模板,同时保留"变形"元素内的所有浏览器或 Alpine 状态。

安装

通过 CDN

<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/morph@3.x.x/dist/cdn.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>

通过 NPM

npm install @alpinejs/morph
import Alpine from 'alpinejs'
import morph from '@alpinejs/morph'
Alpine.plugin(morph)

Alpine.morph()

Alpine.morph(el, newHtml) 允许你基于传入的 HTML 命令式地变形 DOM 节点。

参数描述
el页面上的 DOM 元素
newHtml用作模板来变形 DOM 元素的 HTML 字符串
options主要用于注入生命周期钩子的选项对象
<div x-data="{ message: 'Change me, then press the button!' }">
<input type="text" x-model="message">
<span x-text="message"></span>
</div>

<button>Run Morph</button>

<script>
document.querySelector('button').addEventListener('click', () => {
let el = document.querySelector('div')
Alpine.morph(el, `
<div x-data="{ message: 'Change me, then press the button!' }">
<h2>See how new elements have been added</h2>
<input type="text" x-model="message">
<span x-text="message"></span>
<h2>but the state of this component hasn't changed?</h2>
</div>
`)
})
</script>

生命周期钩子

选项描述
updating(el, toEl, childrenOnly, skip)在修补 el 前调用
updated(el, toEl)在 Morph 修补 el 后调用
removing(el, skip)在移除元素前调用
removed(el)在移除元素后调用
adding(el, skip)在添加新元素前调用
added(el)在添加新元素后调用
key(el)确定 Morph 如何"标记"元素
lookahead启用"向前看"算法特性
Alpine.morph(el, newHtml, {
updating(el, toEl, childrenOnly, skip) {},
updated(el, toEl) {},
removing(el, skip) {},
removed(el) {},
adding(el, skip) {},
added(el) {},
key(el) { return el.id },
lookahead: true,
})

Keys

Morph 有一个"key"系统,允许开发者"强制"保留某些元素。最常见的用例是循环中的同级元素列表:

<!-- 使用 key 让 Morph 正确移动元素而非替换 -->
<ul>
<li key="1">Mark</li>
<li key="2">Tom</li>
<li key="3">Travis</li>
</ul>

Alpine.morphBetween()

Alpine.morphBetween(startMarker, endMarker, newHtml, options) 允许你变形两个标记元素之间的 DOM 节点范围。