# 不稳定阶段

805a11895134fd25409edee3b6b4649abad2172a 在上一个 commit 已经完成了动态模板绑定的核心功能,现在需要在此基础上增加其他功能。

# 功能尝试

# 事件绑定

在事件绑定分析之前,先解决一个遗留问题

function handleDirective(el) {
        // 在使用 forEach 时要注意,在遍历时的操作会影响遍历的结果。
        cloneAttributes(el.attributes).forEach(function(attr) {
            var directive = parseDirective(attr);
            if(directive) {
                excute(el, directive);
            }
        });
    }

在 handleDirective 函数中,将 [].forEach.call 修改为 clone 函数,原因在上一篇提到了。
在 parseDirective 函数中, 将 dev 修改为

update: typeof def === 'function' ? def : def.update

因为在事件监听中,需要有不同的操作,绑定,解绑等等。

# 拦截器

通过选择器为指令事件增加拦截器,可以指定具体选择器下的节点响应事件。

# 销毁节点

销毁整个节点,并解绑事件监听,以提升性能。

# 重构

cf1732bea21dcc1637d587d295d534535a92d2b7 在非常早期的时候,vue 迎来了第一次重构。这次重构主要以原型继承的思路,重新设计了指令构造函数, 同时把主逻辑之外的操作抽离出来,作为指令对象的原型方法。这样做的优势:

  • 逻辑更清晰
  • 去除非必要形参
  • 耦合性耕地

# 探索

在 cf1732bea21dcc1637d587d295d534535a92d2b7 重构之后,作者在三四天中不断的尝试,项目的结构也反复变化,这个过程持续 几个 commit:

  • augmentArray seems to work
  • WIP
  • refactor
  • kinda working now.
  • sd-each-* works
  • big refactor.. again
  • kinda work now except for scope nesting
  • almost there! scope nesting
  • finally workssssss

首先逆向思维,我决定先看看成果。

# 最终实现

  • 指令绑定 (数据、事件、类、show、todolist)
  • 拦截器
  • 销毁 现在,就让我们一起来看看经历了怎样的变化,才生成当前的代码吧~