
利用js一点点学会编译文本
使用 vue,都知道{{msg}},能变成data.msg相对应的值hello。
此文循序渐进实现最终vue中编译文本的效果。
{{msg}} => 'hello'
这里先不关注 dom 之类的事情,只专注于其中的逻辑。
首先看看以下代码,想想compileText怎么实现
其实这里的逻辑并不难,无外乎先找到{{msg}},然后将整那个字符串替换成data.msg的值。
但是 data 里可能也有对象,如{msg:'hello',person:{name:'hua'}}
text 可能就变成{{person.name}} 喜欢西湖
{{person.name}} => 'hua'
其实就是在 compileText 里拿到 value 值的时候,多些操作。
思考下面的 getValue 怎么实现
这里其实就是一层层往下返回,为了写成公用的,会考虑很多层的情况。 理解难点是reduce,如果不明白,可以看入门怎么使用 reduce
然后升级下 compileText
文本节点编译 <div id='app'> {{msg}} <b>1</b> {{msg}} </div>
先试着将div里子文本节点里面的表达式正确编译。
嗯哼,结果如下
function compileTextNode(node, data) {
node.textContent = compileText(data, node.textContent);
}
元素节点编译 <div id='app'> <span>{{msg}}</span></div>
现在 span 元素里面有的话,怎么编译呢。 其实就是元素节点的话,将其文本元素再挑出来。这里如果深层嵌套,依旧涉及到递归。 可以先试试想想,甚至敲敲compileElement。
避免频繁操作 dom,试试 fragment
这里 app 里面的节点一直在频繁操作,是很不利于性能的。
先将 app 里所有的节点放进文档碎片
编译完之后,再把文档碎片塞进 app 里,完美。
代码想想也就没啥大的事了
答案这样子
合并写下,编译的整体 demo
可以直接复制,在本地试试。希望里面的方法能有一些启发。
作者:颜酱
来源:掘金
