
发表日期: 2021-04-01 11:02:56 浏览次数:107
衡东网站制作【衡东网站优化】衡东建网站、衡东微信公众号运营、衡东网页设计、衡东微信小程序商城
衡东县,隶属于湖南省衡阳市,位于湖南东部偏南,居湘江中游的衡阳盆地与醴攸盆地之间。东连攸县,南与安仁县、衡南县为邻,西部是50公里长、400米宽的湘江与衡山县隔水分界,北与渌口区接壤。该县森林覆盖率达到51%,是“全国造林绿化百佳县”。
有“鱼米之乡”、“皮影戏之乡”、“花鼓戏之乡”、“剪纸之乡”和“印章之乡”之称,是湖南省截止2014年唯一冠名的“土菜名县”。
2015年,根据衡东县乡镇区划调整方案,调整后下辖2乡15镇:踏庄、珍珠2个乡和城关镇成建制合并设立洣水镇。德圳、栗木、莫井3个乡和吴集镇成建制合并设立吴集镇。大桥镇、三樟乡成建制合并设立三樟镇。草市镇、高塘乡成建制合并设立草市镇。
本轮乡镇行政区划调整,衡东县共撤销7个乡级建制,现辖石滩、南湾2个乡,洣水、吴集、三樟、草市、大浦、新塘、霞流、甘溪、杨桥、荣桓、蓬源、石湾、白莲、杨林、高湖15个镇。县人民政府驻洣水镇(原县人民政府驻地)。
2016年末全县常住人口为63.82万人,全县实现地区生产总值261.70亿元,同比增长7.9%。
最简单的,我们来捕获一个<div>元素,然后生成一个<div>元素。例如开发者写了以下这段模板,我们可以对它们进行捕获:
<div> <a>123</a> <p>456<span>789</span></p></div>复制代码
捕获后我们或许可以得到这样的一个对象:
thisDiv = {
dom: {
type: "dom",
ele: "div",
nodeIndex: 0,
children: [
{
type: "dom",
ele: "a",
nodeIndex: 1,
children: [{ type: "text", value: "123" }]
},
{
type: "dom",
ele: "p",
nodeIndex: 2,
children: [
{ type: "text", value: "456" },
{
type: "dom",
ele: "span",
nodeIndex: 3,
children: [{ type: "text", value: "789" }]
}
]
}
]
}};复制代码这个对象维护我们需要的一些信息,某个 HTML 元素里需要绑定哪些变量(变量更新的时候需要更新该节点内容),以怎样的方式来拼接(是否有逻辑指令,如v-if、v-for等),哪些节点绑定了怎样的事件监听事件(是否匹配一些常用的事件能力支持),所以这里 AST 能做的事情是很多了。
我们最终还是会根据 AST 对象生成真实的页面片段和逻辑,实现过程其实也是将很多的特殊标识(例如元素 ID、属性标记等)打到该元素上,同时配合一些 Javascript 的元素选择方式、事件监听方式等,来将这个元素动态化(支持内容更新、节点更新)而实现最终的页面效果。Vue 会根据 AST 对象生成一段可执行的代码,我们看看这部分的实现:
// 生成一个元素function genElement(el: ASTElement): string {
// 根据该元素是否有相关的指令、属性语法对象,来进行对应的代码生成
if (el.staticRoot && !el.staticProcessed) {
return genStatic(el);
} else if (el.once && !el.onceProcessed) {
return genOnce(el);
} else if (el.for && !el.forProcessed) {
return genFor(el);
} else if (el.if && !el.ifProcessed) {
return genIf(el);
} else if (el.tag === "template" && !el.slotTarget) {
return genChildren(el) || "void 0";
} else if (el.tag === "slot") {
return genSlot(el);
} else {
// component或者element的代码生成
let code;
if (el.component) {
code = genComponent(el.component, el);
} else {
const data = el.plain ? undefined : genData(el);
const children = el.inlineTemplate ? null : genChildren(el, true);
code = `_c('${el.tag}'${
data ? `,${data}` : "" // data
}${
children ? `,${children}` : "" // children
})`;
}
// 模块转换
for (let i = 0; i < transforms.length; i++) {
code = transforms[i](el, code);
}
// 返回最后拼装好的可执行的代码
return code;
}}复制代码原本就是一个<div>,经过 AST 生成一个对象,最终还是生成一个<div>,这是多余的步骤吗?不是的,在这个过程中我们可以实现一些功能:
(1) 排除无效 DOM 元素,并在构建过程可进行报错。
(2) 使用自定义组件的时候,可匹配出来。
(3) 可方便地实现数据绑定、事件绑定等功能。
(4) 为虚拟 DOM Diff 过程打下铺垫。
(5) HTML 转义(预防 XSS 漏洞)。
通过通用的模板引擎,我们能处理掉很多低效又重复的工作,例如浏览器兼容、全局事件的统一管理和维护、模板更新的虚拟 DOM 机制、树状组织管理组件,而留给开发者的事情就可以少之又少。现在我们知道了模板引擎都做了什么事情,就可以区分开 Vue 框架提供的能力和我们需要自行处理的逻辑,可以更专注于业务开发。
我们来看看虚拟 DOM 的机制。
虚拟 DOM 如今都被作为前端面试基础题库之一了,多多少少面试者都要去了解下,当初 React 就是因为虚拟 DOM 的提出,暂时赢下了浏览器性能之争(尤其在 AngularJS 的脏检查机制对比下)。当然,这都是几年前的事情了,如今几大框架的性能问题,早也不是什么大问题了。
虚拟 DOM 大概可分成三个过程:
(1) 用 JS 对象模拟 DOM 树,得到一棵虚拟 DOM 树。
(2) 当页面数据变更时,生成新的虚拟 DOM 树,比较新旧两棵虚拟 DOM 树的差异。
(3) 把差异应用到真正的 DOM 树上。
为什么要用到虚拟 DOM 呢?不知道大家仔细研究过 DOM 节点对象没,一个真正的 DOM 元素非常庞大,拥有很多的属性值。因为一个 DOM 节点它包括了太多太多的属性、元素和事件对象,实际上我们并不是全部都会用到,通常包括节点内容、元素位置、样式、节点的添加删除等方法。所以,我们通过用 JS 对象表示 DOM 元素的方式,可以大大降低了比较差异的计算量。
看一下 Vue 源码,我们会发现 VNode 只有这些属性:
tag: string | void;data: VNodeData | void;children: ?Array<VNode>;text: string | void;elm: Node | void;ns: string | void;context: Component | void; // rendered in this component's scopekey: string | number | void;componentOptions: VNodeComponentOptions | void;componentInstance: Component | void; // component instanceparent: VNode | void; // component placeholder node// strictly internalraw: boolean; // contains raw HTML? (server only)isStatic: boolean; // hoisted static nodeisRootInsert: boolean; // necessary for enter transition checkisComment: boolean; // empty comment placeholder?isCloned: boolean; // is a cloned node?isOnce: boolean; // is a v-once node?asyncFactory: Function | void; // async component factory functionasyncMeta: Object | void;isAsyncPlaceholder: boolean;ssrContext: Object | void;fnContext: Component | void; // real context vm for functional nodesfnOptions: ?ComponentOptions; // for SSR cachingdevtoolsMeta: ?Object; // used to store functional render context fordevtoolsfnScopeId: ?string; // functional scope id support

服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878