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。

 

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