
发表日期: 2021-04-01 11:04:51 浏览次数:203
衡东微信公众号开发【衡东网络推广】衡东建站、衡东网站维护、衡东网页制作、衡东微信小程序代运营公司
衡东县,隶属于湖南省衡阳市,位于湖南东部偏南,居湘江中游的衡阳盆地与醴攸盆地之间。东连攸县,南与安仁县、衡南县为邻,西部是50公里长、400米宽的湘江与衡山县隔水分界,北与渌口区接壤。该县森林覆盖率达到51%,是“全国造林绿化百佳县”。
有“鱼米之乡”、“皮影戏之乡”、“花鼓戏之乡”、“剪纸之乡”和“印章之乡”之称,是湖南省截止2014年唯一冠名的“土菜名县”。
2015年,根据衡东县乡镇区划调整方案,调整后下辖2乡15镇:踏庄、珍珠2个乡和城关镇成建制合并设立洣水镇。德圳、栗木、莫井3个乡和吴集镇成建制合并设立吴集镇。大桥镇、三樟乡成建制合并设立三樟镇。草市镇、高塘乡成建制合并设立草市镇。
本轮乡镇行政区划调整,衡东县共撤销7个乡级建制,现辖石滩、南湾2个乡,洣水、吴集、三樟、草市、大浦、新塘、霞流、甘溪、杨桥、荣桓、蓬源、石湾、白莲、杨林、高湖15个镇。县人民政府驻洣水镇(原县人民政府驻地)。
2016年末全县常住人口为63.82万人,全县实现地区生产总值261.70亿元,同比增长7.9%。
虚拟 DOM 中,差异对比也是很关键的一步,这里简单说一下。当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异。通常来说这样的差异需要记录:
需要替换掉原来的节点
移动、删除、新增子节点
修改了节点的属性
对于文本节点的文本内容改变

图 1-1 DOM 树对比
如图 1-1,这里我们对比两棵 DOM 树,得到的差异有:p 元素插入了一个 span 元素子节点,然后原先的文本节点挪到了 span 元素子节点下面。最后通过 JS 操作就可以实现完,具体实现的步骤则是第三步:
经过差异对比之后,我们能获得一组差异记录,接下里我们需要使用它。差异记录要应用到真正的 DOM 树上,需要进行一些操作,例如节点的替换、移动、删除,文本内容的改变等。
我们来看一下,在 Vue 中是怎么进行 DOM Diff 的,虽然代码里很多函数没贴出来,但其实看函数名也可以大概理解都是什么作用,例如updateChildren、addVnodes、removeVnodes、setTextContent等,大致是个对比差异然后更新的操作:
// 简单看这段代码感受下// 对比差异然后更新const oldCh = oldVnode.children;const ch = vnode.children;if (isDef(data) && isPatchable(vnode)) {
for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode);
if (isDef((i = data.hook)) && isDef((i = i.update))) i(oldVnode, vnode);}if (isUndef(vnode.text)) {
if (isDef(oldCh) && isDef(ch)) {
if (oldCh !== ch)
updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly);
} else if (isDef(ch)) {
if (process.env.NODE_ENV !== "production") {
checkDuplicateKeys(ch);
}
if (isDef(oldVnode.text)) nodeOps.setTextContent(elm, "");
addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
} else if (isDef(oldCh)) {
removeVnodes(elm, oldCh, 0, oldCh.length - 1);
} else if (isDef(oldVnode.text)) {
nodeOps.setTextContent(elm, "");
}} else if (oldVnode.text !== vnode.text) {
nodeOps.setTextContent(elm, vnode.text);}if (isDef(data)) {
if (isDef((i = data.hook)) && isDef((i = i.postpatch))) i(oldVnode, vnode);}复制代码前言中我们提到,页面的更新有两种方式:字符串模板和节点模板。而字符串模板innerHTML的方式会消耗比较多的计算,节点模板的方式又需要管理特别多的节点信息和引用保存,使用虚拟 DOM 则可以有效地降低浏览器计算和性能。
在 Vue 中,最基础的模板语法是数据绑定,例如:
<div>{{ message }}</div>复制代码这里使用插值表达式{{}}绑定了一个message的变量,开发者在 Vue 实例data中绑定该变量:
new Vue({
data: {
message: "测试文本"
}});复制代码最终页面展示内容为<div>测试文本</div>。这是怎么做到的呢?
这种使用双大括号来绑定变量的方式,我们称之为数据绑定。它是怎么实现的呢,前面也有大致提到,数据绑定的过程其实不复杂:
(1) 解析语法生成 AST。
(2) 根据 AST 结果生成 DOM。
(3) 将数据绑定更新至模板。
上述这个过程,是 Vue 中模板引擎在做的事情。我们来看看上面在 Vue 里的代码片段<div>{{ message }}</div>,我们可以通过 DOM 元素捕获,解析后获得这样一个 AST 对象:
thisDiv = {
dom: {
type: "dom",
ele: "div",
nodeIndex: 0,
children: [{ type: "text", value: "" }]
},
binding: [{ type: "dom", nodeIndex: 0, valueName: "message" }]};复制代码这样,我们在生成一个 DOM 的时候,同时添加对message的监听,数据更新时我们会找到对应的nodeIndex,更新值:
// 假设这是一个生成 DOM 的过程,包括 innerHTML 和事件监听function generateDOM(astObject) {
const { dom, binding = [] } = astObject;
// 生成DOM,这里假装当前节点是baseDom
baseDom.innerHTML = getDOMString(dom);
// 对于数据绑定的,来进行监听更新吧
baseDom.addEventListener("data:change", (name, value) => {
// 寻找匹配的数据绑定
const obj = binding.find(x => x.valueName == name);
// 若找到值绑定的对应节点,则更新其值。
if (obj) {
baseDom.find(`[data-node-index="${obj.nodeIndex}"]`).innerHTML = value;
}
});}// 获取DOM字符串,这里简单拼成字符串function getDOMString(domObj) {
// 无效对象返回''
if (!domObj) return "";
const { type, children = [], nodeIndex, ele, value } = domObj;
if (type == "dom") {
// 若有子对象,递归返回生成的字符串拼接
const childString = "";
children.forEach(x => {
childString += getDOMString(x);
});
// dom对象,拼接生成对象字符串
return `<${ele} data-node-index="${nodeIndex}">${childString}</${ele}>`;
} else if (type == "text") {
// 若为textNode,返回text的值
return value;
}}复制代码这样,我们就能在message变量更新的时候,通过该变量关联的引用,来自动更新对应展示的内容。而要知道message变量什么时候进行了改变,我们需要对数据进行监听。

服务热线
顶部
备案号: 苏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