JavaScript進階(三十四):如何把真實的 DOM 抽象成虛擬 DOM 樹(四)

接下來,我們再來把 listeners 給做完。

首先,這個 listeners,我們是從原始的那個 attributes 裏面去挑,還是從 directives 裏面去挑?

肯定是從 directives 上面挑,因爲它已經替我們挑過一遍了,並且這個 listeners,其實它就是指令的一種。

那我們就直接來了:

首先,這個 directives 是個數組,所以我們可以直接用一些數組 API,比如 filter 和 forEach。

然後我們先做一個判斷,因爲我只要 on,別的跟我沒關係,所以我們先做一個 filter,那標準是什麼呢?

其實我要的,是它的 name 等於 on 的 directives:

然後我們在 forEach 循環的同時,就可以給它添東西了:

我們在循環中,得到的是一個個的 directive,因爲我們知道,它裏面其實本來就是幾個東西組成的。

所以爲了後面方便,我們就直接給它拆了:

注意,現在在我們事件這邊,其實我關心 name 嗎?不太關心。

爲什麼呀?

因爲但凡能到我這的東西,它的 name 都叫 on,不叫 on 的早就被幹掉了。

所以,我們不需要 name:

然後 arg 我關心嗎?

絕對關心,我得知道它是一個什麼事件,是 click 還是 mouseover,這我得知道。

以及 value,它對應的事件發生的時候,我們真正要幹什麼,所以也需要。

 

所以接下來,我們先創建一個結果 listeners,它是一個數組:

然後再給它 push 一下:

對於事件來說,我們有幾個需要關心的。

第一,我需要關心事件的名字吧?在我們這,它就是 arg。

第二,我還需要關心這個事件,它具體要運行的那個代碼。

最後處理完了,我們還得把結果給返回出去:

所以我們的 listeners 和 directives 相比,它是有一定的簡化。

我們也把它的結構,寫成註釋,放到外面:

那麼我們來看看:

可以看到,是沒問題的。

那麼到現在,很多東西就變的非常的靠譜了。

 

以及,我們在看看 div 裏面,萬一不對呢?

比方說我們在 ul 上面加一個 input 事件:

可以看到,也沒有問題。

所以說,在現在的這個情況下,我們就已經實現了一個事。

就是說,我們已經可以把一個 DOM 元素,給解析成爲,我們自己的一個 VNode。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章