[Alpine.js] 魔法屬性

標籤: Alpine.js javascript

除了 $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