[Day07] - 新拟物风按钮(五) - 参数改变 & 监听变化

Day05 时 , 我们制作了一个可传入参数的 neuomorphic-button

<neuomorphic-button icon="fas fa-wifi"></neuomorphic-button>

不知道有没有 邦友 改变过那个 icon 的参数值 ?

  • font-awesome 图示对照表
icon 名称 对应图示
fas fa-wifi
fas fa-phone

Gif 中我将 icon="fas fa-wifi" 改成 icon="fas fa-phone" , 不过按钮里面的图示并没有跟着改变 /images/emoticon/emoticon20.gif

这是怎麽一回事呢 ? 让我们一同来深入探究吧 !


Web Component 的生命周期

Web Component 跟 React . Vue 相同有生命周期的存在 , 不过只有 5 个

生命周期的顺序如下图所示

生命周期 描述
constructor 建立元件时触发
connectedCallback 元件 append 到画面中触发
disconnectedCallback 移除元件时触发
adoptedCallback 移动元件时触发 , 有 iframe 时才会用到
attributeChangedCallback 元件上属性改变时触发

根据上表 , 我们了解到在 icon 发生变化时 , 需要利用 attributeChangedCallback 来更改实际显示的 icon

实作开始

one 注册 attributeChangedCallback 事件

class NeuomorphicButton extends HTMLElement {

  constructor() {

    ...如昨天所示之内容
  }

  attributeChangedCallback(name, oldValue, newValue) {
  
      console.table({name, oldValue, newValue})
  }
}

window.customElements.define('neuomorphic-button', NeuomorphicButton);

two 设定要监听的属性在 observedAttributes

class NeuomorphicButton extends HTMLElement {

  constructor() {

    ...如昨天所示之内容
  }

+  static get observedAttributes() {
+    return ['icon']
+  }

  attributeChangedCallback(name, oldValue, newValue) {
  
      console.table({name, oldValue, newValue})
  }
}

window.customElements.define('neuomorphic-button', NeuomorphicButton);

three 监听到 icon 属性改变时 , 将内部的 <i> 上的 class 也一同改变

attributeChangedCallback(name, oldValue, newValue) {

  const shadowRoot = this.shadowRoot;

  if (name === 'icon'){

    const i = shadowRoot.querySelector('i');
    i.className = newValue;
  }
  
}

之後图示就会跟着我们的 icon 属性一起变化 /images/emoticon/emoticon34.gif

如果想直接体验成果 , 请到 web-component-attributeChangedCallback.html 查看

参考资料 :


<<:  铁人赛 Day11 -- 一定要知道的 CSS (八) -- 想要设定个文字而已有那麽难吗?

>>:  B+树索引实战篇-Part2(联合索引的扫描区间与边界条件)

BigQuery 与Machine Learning | ML#Day27

在引用资料来源的时候,除了上传csv的选项,另外一个就是BigQuery。 早在开始摸索ML之前,G...

[C#] Base64 Convert.ToBase64String 基本转码及适用网址参数转码延伸应用

这次示范一个 C# 内将字串转为 Base64 字串的语法,并利用此转换方法延伸到适用网址上传递参数...

快速查询的秘密武器B+树索引-Part1(无索引如何搜寻、基本索引概念)

进入到这篇之前要先确保大家有一些概念。 大家要知道Innodb各个资料页物理上并没有连在一起,而是透...

Day2:AWS Shared Responsibility Model

只要谈到AWS资安议题绝对不能不提到 AWS Shared Responsibility Model...

IOS Swift 请问你哪位 ? Protocol<协定>自我介绍。

前言 昨天问了面试网页前端的问题,收到板上前辈的许多回应真的是受宠若惊,让我感受到IT人的刚性温暖非...