JS实现简单的Vue(2),web后台开发

文章详细描述了Vue.js中的DOM遍历过程,重点讲解了如何通过`compile`方法处理文本节点和元素节点,特别是如何利用`v-model`,`v-html`,和`@click`指令进行数据绑定和事件监听,以及使用Watcher实现批量更新视图的机制。
摘要由CSDN通过智能技术生成

遍历订阅池,批量更新视图。

compile 解析dom

lass Vue{

constructor(options = {}){

}

proxyData(key){

}

observer(data){

}

compile(el){

var nodes = el.childNodes;

for (let i = 0; i < nodes.length; i++) {

const node = nodes[i];

if(node.nodeType === 3){

var text = node.textContent.trim();

if (!text) continue;

this.compileText(node,‘textContent’)

}else if(node.nodeType === 1){

if(node.childNodes.length > 0){

this.compile(node)

}

if(node.hasAttribute(‘v-model’) && (node.tagName === ‘INPUT’ || node.tagName === ‘TEXTAREA’)){

node.addEventListener(‘input’,(()=>{

let attrVal = node.getAttribute(‘v-model’)

this.watcherTask[attrVal].push(new Watcher(node,this,attrVal,‘value’))

node.removeAttribute(‘v-model’)

return () => {

this.data[attrVal] = node.value

}

})())

}

if(node.hasAttribute(‘v-html’)){

let attrVal = node.getAttribute(‘v-html’);

this.watcherTask[attrVal].push(new Watcher(node,this,attrVal,‘innerHTML’))

node.removeAttribute(‘v-html’)

}

this.compileText(node,‘innerHTML’)

if(node.hasAttribute(‘@click’)){

let attrVal = node.getAttribute(‘@click’)

node.removeAttribute(‘@click’)

node.addEventListener(‘click’,e => {

this.methods[attrVal] && this.methods[attrVal].bind(this)()

})

}

}

}

},

compileText(node,type){

let reg = /{{(.*)}}/g, txt = node.textContent;

if(reg.test(txt)){

node.textContent = txt.replace(reg,(matched,value)=>{

let tpl = this.watcherTask[value] || []

tpl.push(new Watcher(node,this,value,type))

return value.split(‘.’).reduce((val, key) => {

return this.data[key];

}, this.$el);

})

}

}

}

这里代码比较多,我们拆分看你就会觉得很简单了

首先我们先遍历el元素下面的所有子节点,node.nodeType === 3 的意思是当前元素是文本节点,node.nodeType === 1 的意思是当前元素是元素节点。因为可能有的是纯文本的形式,如纯双花括号就是纯文本的文本节点,然后通过判断元素节点是否还存在子节点,如果有的话就递归调用compile方法。下面重头戏来了,我们拆开看:

上面这个首先判断node节点上是否有v-html这种指令,如果存在的话,我们就发布订阅,怎么发布订阅呢?只需要把当前需要订阅的数据push到watcherTask里面,然后到时候在设置值的时候就可以批量更新了,实现双向数据绑定,也就是下面的操作

然后push的值是一个Watcher的实例,首先他new的时候会先执行一次,执行的操作就是去把纯双花括号 -> 1,也就是说把我们写好的模板数据更新到模板视图上。

最后把当前元素属性剔除出去,我们用Vue的时候也是看不到这种指令的,不剔除也

不影响

至于Watcher是什么,看下面就知道了

Watcher

之前发布订阅之后走了这里面的操作,意思就是把当前元素如:node.innerHTML = ‘这是data里面的值’、node.value = ‘这个是表单的数据’

那么我们为什么不直接去更新呢,还需要update做什么,不是多此一举吗?

其实update记得吗?我们在订阅池里面需要批量更新,就是通过调用Watcher原型上的update方法。

效果

大家可以浏览器看一下效果,由于本人太懒了,gif效果图就先不放了,哈哈😄😄

完整代码

地址:github.com/wclimb/MyVu…

参考

1、剖析Vue原理&实现双向绑定MVVM

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后的最后

面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。
需要完整面试题的朋友可以点击蓝色字体免费获取

大厂面试题

面试题目录

仪的offer。
需要完整面试题的朋友可以点击蓝色字体免费获取

[外链图片转存中…(img-7Np7JJj6-1712165931377)]

[外链图片转存中…(img-7jEcX3Bo-1712165931378)]

[外链图片转存中…(img-48TjlkKm-1712165931378)]

[外链图片转存中…(img-elnkFsnO-1712165931378)]

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值