除了 $el
是例外,所有的魔法屬性 在 x-data
中都無法使用,因為元素還未初始化。
$el
<div x-data>
<button @click="$el.innerHTML = 'foo'">這裡的內容會取代為「foo」</button>
</div>
$el
是可用來取得元件根 DOM 節點的魔法屬性。
$refs
範例:
<span x-ref="foo"></span>
<button x-on:click="$refs.foo.innerText = 'bar'"></button>
$refs
是可用來取得元件內以 x-ref
標記的 DOM 元素之魔法屬性。如果有需要取得 DOM 元素資訊或操作的話可以使用。
$event
範例
<input x-on:input="alert($event.target.value)">
$event
是可在事件監聽器內取得瀏覽器原生「Event」物件的魔法屬性。
備註:$event 屬性只可在 DOM 運算式中使用。
若有需要在 JavaScript 函式中存取 $event,則可以直接將 $event 傳入:
<button x-on:click="myFunction($event)"></button>
$dispatch
範例
<div @custom-event="console.log($event.detail.foo)">
<button @click="$dispatch('custom-event', { foo: 'bar' })">
<!-- 點擊後會 console.log "bar" -->
</div>
有關事件傳播 (Event Propagation)
請注意,由於 Event Bubbling (英語),當有需要截取從相同層級節點觸發的事件時,則需要加上 .window 修飾詞:
範例:
<div x-data>
<span @custom-event="console.log($event.detail.foo)"></span>
<button @click="$dispatch('custom-event', { foo: 'bar' })">
<div>
上述範例無效,因為 custom-event
觸發的時候,會傳播到共同母級節點,即 div
。
分派至元件
也可以通過剛才那個技巧來在元件間互相溝通:
範例:
<div x-data @custom-event.window="console.log($event.detail)"></div>
<button x-data @click="$dispatch('custom-event', 'Hello World!')">
<!-- 點擊後會 console.log "Hello World!". -->
$dispatch
是建立 CustomEvent
並在內部使用 .dispatchEvent()
分派的捷徑方法。還有其他許多通過自定事件來在元件間傳遞資料的例子。請 參考此處 (英文) 以瞭解更多有關不同瀏覽器中的 CustomEvent
資訊。
可以注意到放在第二個參數的資料 $dispatch('some-event', { some: 'data' })
,在新事件上可通過「detail」屬性來取得:$event.detail.some
。將自定事件資料附加到 .detail
屬性是在瀏覽器中 CustomEvent
的標準實踐。更多資訊請 參考此處 (英文)。
也可以使用 $dispatch()
來觸發 x-model
繫結的資料更新。如:
<div x-data="{ foo: 'bar' }">
<span x-model="foo">
<button @click="$dispatch('input', 'baz')">
<!-- 點擊按鈕後,`x-model` 會抓到 Bubbing 的「input」事件,並將 foo 更新為「baz」 -->
</span>
</div>
備註:$dispatch 屬性只可在 DOM 運算式中使用。
若有需要在 JavaScript 函式中存取 $dispatch,則可以直接將 $dispatch 傳入:
<button x-on:click="myFunction($dispatch)"></button>
$nextTick
範例:
<div x-data="{ fruit: 'apple' }">
<button
x-on:click="
fruit = 'pear';
$nextTick(() => { console.log($event.target.innerText) });
"
x-text="fruit"
></button>
</div>
通過 $nextTick
魔法屬性則可以在 Alpine 做出 DOM 更新 之後 才執行指定的運算式。適用於需要在資料反應到 DOM 上後才要與 DOM 互動的情況。
$watch
範例
<div x-data="{ open: false }" x-init="$watch('open', value => console.log(value))">
<button @click="open = ! open">開啟/關閉</button>
</div>
可通過 $watch
魔法方法來「監聽 (Watch)」元件屬性。在上述例子中,當按鈕點擊後 open
會該表,接著會指定給定的回呼並以新的值來執行 console.log
。