这篇博客,我们继续。
首先,别的我们不管,在这个组件第一次刚刚创建出来的时候,我们要不要做一个初始的渲染?肯定是要的。
所以,我们需要一开始的时候,就来调用一次 render,代表初始渲染:
然后接下来,我们的问题就变成了,这个 render 具体需要怎么去做?
那么我们可以先从一个简单的开刀,比如,VText 需要怎么去做?
事实上来说,这个 VText 我们要做的是什么?
是不是需要把原始的文本 this._text 里面的 {{ }} 给编译掉?
如果 this._text = "a={{a}}",那么我们是不是要把这个 {{a}} 找出来,并且编译掉,这个我们前面的博客已经做过了。
然后反过来,我们可不可以这么做?
this._dom 对应于我们那个真正的节点。
我要让它的 data,就等于我现在的这个模板的文本,然后让它去做一个编译的过程。
这个编译的过程也很简单,就是 replace:
当然顺便一说,我们一定得用 {{ }} 吗?不一定,愿意用什么都行。
既然想要跟 vue 有所区分,以便于向大家证明,这个用什么都行,那么我希望在这个库里,我们以 [[ ]] 为标准:
那么这种情况下,VText 里面也要跟着改:
那么它里面会有东西呢?
其实什么都有可能:
但就是不太可能出现右方括号 ]。
但是事实真的如此吗?
并不是的,我们有没有可能加上 arr[0]:
所以这时候,不能说只要碰到这个 ] 就结束,那我们得怎么办呢?所以,我们就要搞的严格一点。
我们要涉及到一个问题,这个东西什么时候就算结束呢?什么时候碰到 2 个右方括号为止 ]]。
但是这样真的精确吗?
在我们平常真正写代码的过程当中,有没有可能碰到两个方括号?
比方说,我们 data 里面有 2 个这样的数据:
那么我可不可以这么写?
所以,在我们这,正常写代码的过程当中,有没有可能碰到2个括号?
是有可能的,我们不能因为碰到两个右方括号,就提前结束了,那是不行的。
所以说这种情况下,我们应该怎么办呢,这个就很麻烦。
可能有人说,那你还是换回花括号 {{ }} 吧,它就没那问题。
其实正常写代码,2 个右花括号 }} 也有可能出现,比如:
所以,这个不是我们换不换符号的问题,其实无论我们换成什么符号,它理论上都应该有这种可能出现的情况。
比如就算我们换成 %%,这个应该没人用吧?那么如果我们加个字符串,也是一样的:
理论上任何符号你都跑不掉,总要碰到问题的。
所以我们解决问题的办法,并不是逃避,我们必须得想办法必须把它给办了,那怎么办呢?
这个时候,我们用正则就已经不能发挥作用了。
当然,正则理论上写一大堆可以解决这个问题,但是我们可以用更好的方法。
首先,它一定是以 2 个左方括号 [[ 开头的,这个你不能否认,绝对是。
其次,方括号是不是必须得成对出现?
那如果是这种写法呢 arr0] ?这是错的,就不能这么写。
正确的写法当中,方括号一定是成对出现的 arr[0] 。
那么这时候问题来了,既然是成对出现,我怎么样判断它结束了?
首先,当我碰见 2 个左方括号 [[ 的时候,我标记为起点:
相当于现在我手里有一个 count,并且它的数量为 2。
这个 count,代表左方括号 [ 出现过的次数是 2 次。
接下来,我们就从这里往后走,然后到这,我们碰到一个:
怎么办?count + 1。
所以现在 count = 3。
然后我们继续往下走,又碰到一个:
再 + 1,count = 4。
再往下,碰到一个反的,右方括号 ],怎么办?
减一,count = 3。
再走,又碰到一个反的:
继续减一,count = 2。
再走,又碰到一个正的:
加一,count = 3。
再走,又碰到一个反的:
减一,count = 2。
然后最后 2 个反的:
减二,count = 0。
这时候,是不是我们要的东西就出来了。
说白了,碰到 2 个左方括号 [[ 开始,我就开始计数。
什么时候这个数消耗完了等于 0,什么时候我就认为到头了。
那有人要说了,如果我就是想加个字符串方括号连接进来呢?比如这样:
那么这时候,我们可不可以把上面的方法外延一下:
我们可以搞个 count2,它是用来计算我们碰到单引号的次数。
那如果用双引号呢?那我们就在搞个 count3,用来计算碰到双引号的次数。
那么我们就直接从单引号这里开始:
当我们碰到单引号的时候,那么 count2 就有一个了,count2 = 1。
然后继续往下走,但是注意,在这个 count2 减成 0 之前,你出现什么我都不认。
为什么?因为你是字符串啊,字符串里面放什么东西,关我啥事啊。
那么当我又碰到了一个单引号的时候:
我们的 count2 就减成 0 了。
那么这时候,我才恢复到继续识别方括号的状态下。