nodeType属性在vue源码中的使用
每个节点都有一个 nodeType 属性,用于表明节点的类型,节点类型由 Node 类型中定义12个常量表示:

nodeType在vue中的应用
在vue编译的过程中需要查找html结构中的双大括号,或者@事件等代表vue中的数据及方法的属性值,通过编译将查找到的部分使用vue实例中的属性或方法替换
class Compile {
// el是宿主元素选择器
// vm是KVue实例
constructor(el, vm) {
this.$vm = vm;
this.$el = document.querySelector(el);
// 先把模板移动到fragment标签中,更新完成后在追加回来
this.$fragment = this.node2Fragment(this.$el);
// 执行编译
this.compile(this.$fragment);
// 追加
this.$el.appendChild(this.$fragment);
}
node2Fragment(el) {
// 移动操作
const fragment = document.createDocumentFragment();
let child;
while(child = el.firstChild) {
// 移动操作
fragment.appendChild(child);
}
return fragment
}
// 递归el,分别处理文本节点和元素节点
compile(el) {
const childNodes = el.childNodes;
Array.from(childNodes).forEach(node => {
if (node.nodeType == 1) {
// 元素节点 <p k-text="abc" @click="onClick"></p>
// console.log('元素节点:'+node.nodeName);
this.compileElement(node);
} else if (this.isInter(node)) {
// 文本节点,且内容是{{xxx}}实行
// console.log('插值文本:'+node.textContent);
this.compileText(node);
}
// 递归子节点
if (node.childNodes && node.childNodes.length > 0) {
this.compile(node);
}
})
}
// 文本节点,且内容是{{xxx}}实行
isInter(node) {
return node.nodeType == 3 && /\{\{(.*)\}\}/.test(node.textContent)
}
// 编译元素节点
compileElement(node) {
// 遍历所有属性
const nodeAttrs = node.attributes;
Array.from(nodeAttrs).forEach(attr => {
// 规定:指令以k-xxx="yyy"命名
const attrName = attr.name; // 属性名称 k-xxx
const exp = attr.value;// 属性值 yyy
if (attrName.indexOf('k-') == 0) {
const dir = attrName.substring(2);
// 执行指令解析
this[dir] && this[dir](node, exp)
}
})
}
compileText(node) {
const exp = RegExp.$1;
this.update(node, exp, 'text');
}
// 通用update方法
update(node, exp, dir) {
// 获取更新函数
let updator = this[dir + 'Updator'];
// 初始化,首次页面赋值
updator && updator(node, this.$vm[exp]);
// 创建Watcher
new Watcher(this.$vm, exp, function(value) {
updator && updator(node, value);
})
}
textUpdator(node, value) {
node.textContent = value;
}
text(node, exp) {
this.update(node, exp, 'text')
}
html(node, exp) {
this.update(node, exp, 'html')
}
htmlUpdator(node, value) {
node.innerHTML = value;
}
}
以上是简单的进行属性查找的示例,通过nodeType为1来判断是元素节点,还是文本节点并进行相应的操作。
nodeType属性在vue源码中的使用的更多相关文章
- 【Vue】VUE源码中的一些工具函数
Vue源码-工具方法 /* */ //Object.freeze()阻止修改现有属性的特性和值,并阻止添加新属性. var emptyObject = Object.freeze({}); // th ...
- vue源码中computed和watch的解读
computed 会基于其内部的 响应式依赖 进行缓存. 只在相关 响应式依赖发生改变 时 它们才会重新求值. 可以在将模板中使用的常量放在计算属性中. watch 监听数据变化,并在监听回调函数中返 ...
- 了解一下vue源码中vue 的由来
我们之前提到过 Vue.js 构建过程,在 web 应用下,我们来分析 Runtime + Compiler 构建出来的 Vue.js,它的入口是 src/platforms/web/entry-r ...
- Vue源码中compiler部分逻辑梳理(内有彩蛋)
目录 一. 简述 二. 编译流程 三. 彩蛋环节 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 ...
- 从Vue源码中我学到了几点精妙方法
话不多说,赶快试试这几个精妙方法吧!在工作中肯定会用得到. 立即执行函数 页面加载完成后只执行一次的设置函数. (function (a, b) { console.log(a, b); // 1,2 ...
- Vue源码解析---数据的双向绑定
本文主要抽离Vue源码中数据双向绑定的核心代码,解析Vue是如何实现数据的双向绑定 核心思想是ES5的Object.defineProperty()和发布-订阅模式 整体结构 改造Vue实例中的dat ...
- Vue源码学习(一):调试环境搭建
最近开始学习Vue源码,第一步就是要把调试环境搭好,这个过程遇到小坑着实费了点功夫,在这里记下来 一.调试环境搭建过程 1.安装node.js,具体不展开 2.下载vue项目源码,git或svn等均可 ...
- 【Vuejs】350- 学习 Vue 源码的必要知识储备
前言 我最近在写 Vue 进阶的内容.在这个过程中,有些人问我看 Vue 源码需要有哪些准备吗?所以也就有了这篇计划之外的文章. 当你想学习 Vue 源码的时候,需要有扎实的 JavaScript 基 ...
- vue源码解析之observe
一. vue文档中有"由于 JavaScript 的限制,Vue 不能检测以下数组的变动",是否真是由于JavaScript的限制,还是出于其他原因考虑 当你利用索引直接设置一个数 ...
随机推荐
- MongoDB在windows及linux环境下安装
linux下安装配置 整理中... windows下安装配置 1.下载: https://www.mongodb.com/download-center?jmp=nav 2.解压到D盘 3.D:\下创 ...
- RMP和YUM软件安装
1.卸载RPM包 rpm -e rpm包的名称 2.安装rpm包 rmp -ivh xxx.rpm 3.查询yum服务器是否有需要安装的软件 yum list|grep xxx软件列表 4.yum安装 ...
- 每天一道Rust-LeetCode(2019-06-03)
每天一道Rust-LeetCode(2019-06-02) 有序链表转换二叉搜索树 坚持每天一道题,刷题学习Rust. 原题 题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜 ...
- 题解 P4305 【[JLOI2011]不重复数字】
来一波用vector的最短代码题解 P4305 [JLOI2011]不重复数字 关于hash表的部分大家可以看一看其他的题解,我就不说了 不定长数组vector的几个基本用法: 定义: vector& ...
- LOJ2687 BOI2013Vim 题解
题目链接 这里只写个摘要,具体的可以看 神仙Itst的博客 大概是每相邻两个位置之间的线段要么被覆盖一次,要么被覆盖三次,然后DP,如下图: 代码: #include<bits/stdc++.h ...
- 前端,DJ
Vue模块 1.Vue都有哪些指令,简单说说? """ Vue里面常见指令有文本指令:v-text.v-html,属性指令:v-bind,方法指令:v-on,条件指令:v ...
- Chartjs 简单使用 ------ 制作sin cos 折线图
Chart.js 一款简单干净的图表工具,基于html5 的Javascript. 可以用来制做条形,扇形,折线,混合等等的强大工具 图表要放在html 的 cancas 标签中 <canv ...
- Istio 1.4 更新了 | 感觉学不完
Istio 1.4 更新了 官网 https://istio.io/news/2019/announcing-1.4/ Istio 评选 为GitHub上增长最快的五个 开源项目之一 变更说明获取更改 ...
- U9数据权限分配枚举值方法
1.配置动态视图,定位应用对应控制实体,并设置动态视图类型:读取 或 增.删.改: 2.设置动态视图条件:MOPickList.MO.DocState.Value in (FunEnum('生产订单单 ...
- B树和B+树的增/删结点(转)
add by zhj: 算法其实不复杂,尤其是增加结点的算法,逻辑很简单,但有时自己想不到. 增加结点算法:首先,对于B树,没有重复结点,所以新插入的数据一定会落在叶结点上,或者说落在叶结点的所有父结 ...