所有分类
  • 所有分类
  • 后端开发
HTML搞事儿!Angular教你秒变网页特效

HTML搞事儿!Angular教你秒变网页特效

可以看到,Angular把我们写的模板编译成指令的方式,然后通过这些指令生成对应的HTML.这个过程包含两个步骤:上述代码中,text方法参数都被写固定了,实际生成的代码可能类似于text(Comp.title)这种形式。本文所述代码,只是

别小看那些网页框架了,用起来速度飞快!说起编程,你有没有试过这种方式?

{{title}}
export class AppComponent { title = 'angular'; }

这个不就是HTML原本应该干的事儿嘛?好,咱说说吧:到底是咋样通过Angular一招手,把那些看着复杂到不行的代码搞成咱们看着简单明了的网页特效的?等会儿我来揭晓答案!

 ...省略了其他代码
 i0.ɵɵelementStart(0, "div");
 i0.ɵɵtext(1, " hello angularn");
 i0.ɵɵelementEnd()
 ...省略了其他代码

看这儿Angular这个东西嘞,就是咱们只要把普通模板写为一长串指令,它就能够帮着咱们生成HTML代码。你得知道,这个过程可不只是简单地翻译这么简单,而是包含两步!

这里还有3个超级实用的函数,分别叫 elementStart、text 和 elementEnd。别看它们名字高大上,其实就代表了“开始添加标签”、“输入内容”和“完成包标签”!

HTML搞事儿!Angular教你秒变网页特效

let currentNode: Node | null = null;
let currentParent: Node | null = null;
function patch(host: Node | DocumentFragment, render: () => void): void {
  currentNode = host;
  render();
}
function elementOpen(tagName: string): void {
  currentParent = currentNode;
  const element = document.createElement(tagName);
  currentParent!.appendChild(element);
  currentNode = element;
}
function text(textContent: string): void {
  currentNode!.textContent = textContent;
}
function elementEnd(tagName: string): void {
  currentNode = currentParent;
  currentParent = currentNode!.parentNode;
}

赶紧动起来试一试!从最基本的开始做起,非常容易搞定!

然后,在HTML里面可以这样使用:

 
function render() { elementOpen('div'); text('div content'); elementOpen('p'); text('p content'); elementEnd('p'); elementEnd('div'); } patch(document.getElementById('container'), render);

这个测试用例里,text()函数的参数被塞得满满登登的,虽然在真正运行的时候可能只会输出’text(Comp.title)’. 但要是我们换上浮点数或字符串啥的,咋处理让用户能改的情况?那我们是不是得重新弄个patch()函数呐?

头疼的问题就是DOM处理速度慢,文件多了的话,框架的性能可就拖后腿了。帮你想想看,下次咱们执行patch函数时,如果DOM树已经存在就直接拿来用,不用再整个新大树或者往里叉东西了,真的不费吹灰之力就能解决的事情!大家听懂没?期待本文对你们有所帮助呦,别忘了留下宝贵意见哈

let currentNode: Node | null = null;
let currentParent: Node | null = null;
function patch(host: Node | DocumentFragment, render: () => void): void {
  currentNode = host;
  render();
}
function elementOpen(tagName: string): void {
  currentParent = currentNode;
  const firstChild = (currentParent as Element).firstElementChild;
  if (firstChild && firstChild.tagName.toLowerCase() === tagName) {
    currentParent = firstChild;
    return;
  }
  const element = document.createElement(tagName);
  currentParent!.appendChild(element);
  currentNode = element;
}
function text(textContent: string): void {
  if (currentNode!.textContent !== textContent) {
    currentNode!.textContent = textContent;
  }
}
function elementEnd(tagName: string): void {
  currentNode = currentParent;
  currentParent = currentNode!.parentNode;
}

原文链接:https://www.icz.com/technicalinformation/web/2024/03/11379.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?