如何实现 MVVM 类 Vue 迷你框架(五)

上面几节课我们已经把数据代理,响应式处理搞完了,接下来需要做什么呢?当然是最难的一部分了,就是我们的编译模板。

使用到的dom编程方法

  • element.childNodes - 返回元素子节点的 NodeList(可直接使用forEach遍历),换行和空格会被识别成文本节点。

  • element.nodeType - 返回元素的节点类型,元素节点为 1,文本节点为 3

  • element.nodeName - 返回元素的名称,例如**“DIV”**

  • element.textContent - 设置或返回节点及其后代的文本内容

  • element.attributes - 指定节点的属性Attr(含有name和value属性)合 NamedNodeMap(不可直接遍历)

我们需要做什么呢?

  • 拿到我们需要的 DOM 元素

  • 然后需要解析 {{}} 模板插值

  • 解析 m-text 指令

  • 解析 m-html 指令

所以我们需要一个编译模板 Compile 类:

class Compile {constructor(el, vm) {this.$el = document.querySelector(el);this.$vm = vm;// 判断是否存在 elif(this.$el) {this.compile(this.$el);}}
}

判断节点是不是具有 {{}} 文本节点

class Compile {constructor{// ...}isInter(node) {return node.nodeType === 3 && /{{.*}}/.test(node.textContent);}
}

接下来我们封装一个用于更新指令的公用方法:

update(node, key, dir) {const fn = this[dir+'Updater']; // 查找指令方法fn && fn(node, this.$vm[key];// 更新new Watcher(this.$vm, key, val => {fn && fn(node, key)})
}

如果是文本内容我们就只更新文本:

textUpdater(node, val) {node.textContent = val
}text(node, key) {this.update(node, key, 'text')
}

如果是 html 内容就只更新 htm 内容:

htmlUpdater(node, val) {node.innerHTML = val
}html(node, key) {this.update(node, key, 'html');
}

模板插值解析:

compileText(node) {this.update(node, RegExp.$1, 'text')
}

最后就是实现 compile(node) 方法:

// 递归传入节点,根据节点类型做不同操作compile(el) {// 拿到子节点const childNodes = el.childNodes;childNodes.forEach(node => {if (node.nodeType === 1) {console.log('元素节点', node.nodeName);} else if (this.isInter(node)) {this.compileText(node);console.log('文本节点', node.textContent);}if (node.childNodes) {this.compile(node);}});}

实现 MVVM 类 Vue 迷你框架(五)相关推荐

  1. php主控,IcePHP框架中的快速后台中的通用CRUD功能框架(五) SCrud 主控类

    /** * CRUD主控类 * @author bluehire */ class SCrud { const PATH_VIEW='crud'; //视图路径名 /** * 当前列表操作配置 * @ ...

  2. 认识Vue源码 (2)-- 手写类Vue框架:Zue

    一.手写类Vue框架:zue class Zue{constructor(options){//构造函数:this永远指向实例} } 1.在zue实例下创建$el,并指向挂载点 this.$el = ...

  3. 2021 年 Angular vs. React vs. Vue 前端框架对比

    2021 年 Angular vs. React vs. Vue 前端框架对比 一个是 UI 库(React),另一个是成熟的前端框架(Angular),而其中最年轻的(Vue)则可以称之为渐进式框架 ...

  4. Vue - 前段框架

    文章目录 前言 Vue概念 同类产品 官网 特点 渐进式框架 入门案例.html 改造入门案例.html MVVM框架 基础语法 运算符 operator 方法 methods Vue解析数据 三种d ...

  5. Vue.js 框架基础笔记

    Vue.js 框架基础笔记 1. Vue.js 基本概念 1.1 遇见 Vue.js 1.1.1 为什么要学习 Vue.js 1.1.2 前端开发的复杂化 1.1.3 Vue.js 特点 1.1.4 ...

  6. js 获得明天0点时间戳_Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战...

    点击上方"测试开发技术",选择设为"设为星标" 优质文章,第一时间送达! 学习全文大概需要 12分钟,内容实战性较强. 1. 前言 本篇将基于Python 3. ...

  7. Vue 学习第五天 学习笔记

    Vue   学习第五天 1. keyup事件 <div id="app"> <input type="text" v-model=" ...

  8. 好程序员教程分析Vue学习笔记五

    好程序员教程分析Vue学习笔记五,上次我们学习了Vue的组件,这次我们来学习一下路由的使用.在Vue中,所谓的路由其实跟其他的框架中的路由的概念差不多,即指跳转的路径. 注意:在Vue中,要使用路由, ...

  9. Vue.js框架简介(1)

    1.Vue.js框架简介 Vue(读音 /vju:/,发音类似于 view)是一套用于构建用户界面的渐进式的JavaScript框架. 1.1.为什么要学习Vue.js 什么是Vue.js Vue.j ...

最新文章

  1. Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
  2. 特变电工新能源打造绿色数据中心:综合能效提升18%以上
  3. java oscache 使用_OScache的使用(Java对象)
  4. 表的插入、更新、删除、合并操作_20_通过表关联删除多张表
  5. 少儿编程150讲轻松学Scratch(八)-如何设计经典游戏打砖块
  6. 基于智慧教室|无纸化会议的新选择:RTMP解决方案
  7. 5月16日 AJAX
  8. Java编程思想笔记目录
  9. umi+Ant Design Mobile+rem搭建移动端H5框架
  10. vue 时间格式总结及转换
  11. android自动亮度流程,Android 亮度自动调节是如何实现的?
  12. 基于EasyNVR实现RTSP/Onvif监控摄像头Web无插件化直播监控
  13. vue如何跳转支付宝付款页面
  14. android11 动态设置屏幕旋转方向
  15. 自己动手搭建网站:域名和云服务器选购
  16. Page not found (404) Request Method: GET Request URL: http://127.0.0.1:8000/ Using the URLconf defin
  17. ThreadLocal实战之数据库执行器线程同步
  18. 如何制定软件项目测试计划
  19. 纸上得来终觉浅(c语言小知识总结)
  20. MAC设置环境变量PATH和alias创建快捷键

热门文章

  1. 韩语入门之韩语字母(1)
  2. CameraLink 高清医学影像分析模块
  3. Kali之——kali linux切换语言
  4. c语言mn回文素数编程,C语言求回文素数代码及解析
  5. 虚拟机的安装,更新软件源,对Vi及Vim的简单了解,使用
  6. Vue学习第一天(部分标签应用)
  7. 关于在CSDN Blog公告栏加入Google搜索功能的问题
  8. 有点意思....有空常看看
  9. 什么玩意?快读快写浮点型数据?
  10. python和c语言相通吗_C语言和Python有什么区别呢?