每个节点都有一个 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源码中的使用的更多相关文章

  1. 【Vue】VUE源码中的一些工具函数

    Vue源码-工具方法 /* */ //Object.freeze()阻止修改现有属性的特性和值,并阻止添加新属性. var emptyObject = Object.freeze({}); // th ...

  2. vue源码中computed和watch的解读

    computed 会基于其内部的 响应式依赖 进行缓存. 只在相关 响应式依赖发生改变 时 它们才会重新求值. 可以在将模板中使用的常量放在计算属性中. watch 监听数据变化,并在监听回调函数中返 ...

  3. 了解一下vue源码中vue 的由来

     我们之前提到过 Vue.js 构建过程,在 web 应用下,我们来分析 Runtime + Compiler 构建出来的 Vue.js,它的入口是 src/platforms/web/entry-r ...

  4. Vue源码中compiler部分逻辑梳理(内有彩蛋)

    目录 一. 简述 二. 编译流程 三. 彩蛋环节 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 ...

  5. 从Vue源码中我学到了几点精妙方法

    话不多说,赶快试试这几个精妙方法吧!在工作中肯定会用得到. 立即执行函数 页面加载完成后只执行一次的设置函数. (function (a, b) { console.log(a, b); // 1,2 ...

  6. Vue源码解析---数据的双向绑定

    本文主要抽离Vue源码中数据双向绑定的核心代码,解析Vue是如何实现数据的双向绑定 核心思想是ES5的Object.defineProperty()和发布-订阅模式 整体结构 改造Vue实例中的dat ...

  7. Vue源码学习(一):调试环境搭建

    最近开始学习Vue源码,第一步就是要把调试环境搭好,这个过程遇到小坑着实费了点功夫,在这里记下来 一.调试环境搭建过程 1.安装node.js,具体不展开 2.下载vue项目源码,git或svn等均可 ...

  8. 【Vuejs】350- 学习 Vue 源码的必要知识储备

    前言 我最近在写 Vue 进阶的内容.在这个过程中,有些人问我看 Vue 源码需要有哪些准备吗?所以也就有了这篇计划之外的文章. 当你想学习 Vue 源码的时候,需要有扎实的 JavaScript 基 ...

  9. vue源码解析之observe

    一. vue文档中有"由于 JavaScript 的限制,Vue 不能检测以下数组的变动",是否真是由于JavaScript的限制,还是出于其他原因考虑 当你利用索引直接设置一个数 ...

随机推荐

  1. 02-C#笔记-类的定义

    /* * Notes: * 1. 标识符必须以字母.下划线或 @ 开头,后面可以跟一系列的字母.数字( 0 - 9 ).下划线( _ ).@ * */ using System; namespace ...

  2. ajax中responseText与responseXML区别

    1."responseText”属性以字符串形式返回HTTP响应:“responseXML”属性以XML形式返回HTTP响应.function getTel() {  var telText ...

  3. html2canvas@^1.0.0-rc.1

    这个版本的html2canvas是我在npm找到的,有严重问题,如截图后字体变小,解决方法就是官网找个min.js的版本,放到项目中引用就好 https://html2canvas.hertzen.c ...

  4. Box HDU - 2475 (Splay 维护森林)

    Box \[ Time Limit: 5000 ms \quad Memory Limit: 32768 kB \] 题意 给出 \(n\) 个箱子的包含关系,每次两种操作. 操作 \(1\):把 \ ...

  5. postgresql plv8 安装

    网上可以看到pg 9.6 版本的plv8容器镜像,没有pg 高版本的支持镜像,但是在基于原有dockerfile 进行构建的时候,居然失败了,有墙的问题,有版本的问题 所以通过虚拟机尝试下构建方式安装 ...

  6. Android apps for “armeabi-v7a” and “x86” architecture: SoC vs. Processor vs. ABI

    INSTRUCTION SET: Processors are made of semiconductor dies, usually electronic-grade mono-crystallin ...

  7. Educational Round 64 题解

    前言: 这场太难了……我一个紫名只打出两题……(虽说感觉的确发挥不够好) 一群蓝绿名的dalao好像只打了两题都能升分的样子…… 庆幸的是最后A出锅然后unr了>///< 写一波题解纪念这 ...

  8. Java一个对象占用多少字节

    虚拟机:Java HotSpot(TM) 64-Bit Server VM (25.221-b11, mixed mode) 对象的内存以字节为单位,且必须是8的倍数,它的构成由3部分组成:对象头+实 ...

  9. 【layui】日期选择一闪而过问题

    添加 trigger: 'click',

  10. Jenkins-slave 镜像集成 docker 和 kubectl

    1.说明 对官方的 jenkins/jnlp-slave 镜像集成 docker 和 kubectl 命令. 2.Dockerfile 文件 该镜像底层采用的是 Debian 系统,先更改下载源,然后 ...