接下来,我们再来把 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。