接下來,我們再來把 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。