实现 MVVM 类 Vue 迷你框架(五)
如何实现 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 迷你框架(五)相关推荐
- php主控,IcePHP框架中的快速后台中的通用CRUD功能框架(五) SCrud 主控类
/** * CRUD主控类 * @author bluehire */ class SCrud { const PATH_VIEW='crud'; //视图路径名 /** * 当前列表操作配置 * @ ...
- 认识Vue源码 (2)-- 手写类Vue框架:Zue
一.手写类Vue框架:zue class Zue{constructor(options){//构造函数:this永远指向实例} } 1.在zue实例下创建$el,并指向挂载点 this.$el = ...
- 2021 年 Angular vs. React vs. Vue 前端框架对比
2021 年 Angular vs. React vs. Vue 前端框架对比 一个是 UI 库(React),另一个是成熟的前端框架(Angular),而其中最年轻的(Vue)则可以称之为渐进式框架 ...
- Vue - 前段框架
文章目录 前言 Vue概念 同类产品 官网 特点 渐进式框架 入门案例.html 改造入门案例.html MVVM框架 基础语法 运算符 operator 方法 methods Vue解析数据 三种d ...
- 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 ...
- js 获得明天0点时间戳_Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战...
点击上方"测试开发技术",选择设为"设为星标" 优质文章,第一时间送达! 学习全文大概需要 12分钟,内容实战性较强. 1. 前言 本篇将基于Python 3. ...
- Vue 学习第五天 学习笔记
Vue 学习第五天 1. keyup事件 <div id="app"> <input type="text" v-model=" ...
- 好程序员教程分析Vue学习笔记五
好程序员教程分析Vue学习笔记五,上次我们学习了Vue的组件,这次我们来学习一下路由的使用.在Vue中,所谓的路由其实跟其他的框架中的路由的概念差不多,即指跳转的路径. 注意:在Vue中,要使用路由, ...
- Vue.js框架简介(1)
1.Vue.js框架简介 Vue(读音 /vju:/,发音类似于 view)是一套用于构建用户界面的渐进式的JavaScript框架. 1.1.为什么要学习Vue.js 什么是Vue.js Vue.j ...
最新文章
- Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
- 特变电工新能源打造绿色数据中心:综合能效提升18%以上
- java oscache 使用_OScache的使用(Java对象)
- 表的插入、更新、删除、合并操作_20_通过表关联删除多张表
- 少儿编程150讲轻松学Scratch(八)-如何设计经典游戏打砖块
- 基于智慧教室|无纸化会议的新选择:RTMP解决方案
- 5月16日 AJAX
- Java编程思想笔记目录
- umi+Ant Design Mobile+rem搭建移动端H5框架
- vue 时间格式总结及转换
- android自动亮度流程,Android 亮度自动调节是如何实现的?
- 基于EasyNVR实现RTSP/Onvif监控摄像头Web无插件化直播监控
- vue如何跳转支付宝付款页面
- android11 动态设置屏幕旋转方向
- 自己动手搭建网站:域名和云服务器选购
- Page not found (404) Request Method: GET Request URL: http://127.0.0.1:8000/ Using the URLconf defin
- ThreadLocal实战之数据库执行器线程同步
- 如何制定软件项目测试计划
- 纸上得来终觉浅(c语言小知识总结)
- MAC设置环境变量PATH和alias创建快捷键