从 React Hooks 理解 Web components 的生命周期

简介: 从 React Hooks 理解 Web components 的生命周期

先让我们来看看自定义 Web components 的生命周期。简单示例如下:

class MyElement extends HTMLElement {
    constructor() {
        // always call super() first
        super(); 
        console.log('constructed!');
    }
    connectedCallback() {
        console.log('connected!');
    }
    disconnectedCallback() {
        console.log('disconnected!');
    }
    attributeChangedCallback(name, oldVal, newVal) {
        console.log(`Attribute: ${name} changed!`);
    }
    adoptedCallback() {
        console.log('adopted!');
    }
}
window.customElements.define('my-element', MyElement);


constructor()

构造函数,每当元素创建时 constructor 都会运行,且是在将元素附加到文档之前运行。我们将使用 constructor 来设置一些初始状态、事件侦听器和创建 shadow DOM。

与 React 中的 constructor 一样,都是类的构造函数。相当于在 React Hooks 中的组件初始化属性

const App = ()=>{
    const [state, setstate] = useState(initialState)
}


connectedCallback()

当元素插入 DOM 时,将调用 connectedCallback 。这是运行安装程序代码的好地方,例如获取数据或设置默认属性。


有点类似 React 的 componentDidMount ,组件第一次渲染完成,此时dom节点已经生成,可以在这里调用ajax请求,返回数据setState后组件会重新渲染。

相当于在 React Hooks 中的组件初始化请求,也可以在这里面编写一些订阅。

const App = ()=>{
    useEffect(() => {
      // 每次创建时执行
    }, [])
}


disconnectedCallback()

每当从 DOM 中删除元素时,都会调用 disconnectedCallback,清理时间!我们可以使用  disconnectedCallback 删除任何事件侦听器,或取消间隔。


有点类似 React 的 componentWillUnmount ,在此处完成组件的卸载和数据的销毁。

相当于在 React Hooks 中的 useEffect 的返回函数

const App = ()=>{
    useEffect(() => {
      return ()=>{
          // disconnectedCallback
      }
    }, [])
}


attributeChangedCallback(name, oldValue, newValue)

只要元素的的属性发生更改,就会调用 attributeChangedCallback。我们可以通过实现静态的 observedAttributes 观察者来观察元素的属性,如下所示:

static get observedAttributes() {
    return ['my-attr'];
}

在这种情况下,只要更改了 'my-attr' 属性,就会运行 attributeChangedCallback

只有 observedAttributes 观察者中列出的值,才会在 attributeChangedCallback 有响应.

这个在 React 中,可以通过在 componentWillReceiveProps 判断属性变化,来手动模拟。在React Hooks中却可以很容易的实现。

const App = ()=>{
    useEffect(() => {
      // 'my-attr' 变化时调用
    }, ['my-attr']) // 伪代码,为了对应上面的写法
}


adoptedCallback()

每次将自定义元素移动到新文档时,都会调用的回调。仅当页面中包含 <iframe> 元素时,才会遇到此用例。

(不知道是啥,没找到对应的概念。有懂得朋友,请帮忙指出。)


registering our element

这个虽然不是生命周期的一部分,但是是每次编写都需要执行的过程,将我们的自定义元素注册到 CustomElementRegistry 中,如下所示:

window.customElements.define('my-element', MyElement);

CustomElementRegistry 是一个接口,提供注册自定义元素和查询注册元素的方法。注册表的 define 方法的第一个参数将是元素的名称,因此在这种情况下,它将注册 <my-element> ,第二个参数将传递我们自定义的类。

请务必注意如何命名 Web 组件。自定义元素名称必须始终包含连字符。例如:<my-element> 是正确的,而 <myelement> 则不正确。这是有意为避免元素名称冲突而做的,并作为自定义元素和常规元素之间的区别。


自定义元素也不能是自闭合,因为 HTML 只允许几个元素自闭。这些称为空元素,如<br/><img/>,或不允许子节点的元素

允许自闭元素需要更改 HTML 解析器,因为 HTML 解析对安全性很敏感。HTML 生产者需要能够依赖于给定的 HTML 分析方式,以便能够实现 XSS 安全的 HTML 生成。


在 React 中,我们都是使用引入组件的方式使用,硬要找一个类似的概念,那可能是

react-domrender 方法,第一个参数为我们自定义的类,第二个参数为渲染的 dom 节点。

import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(<App />,
  document.getElementById('root')
);

参考链接 web-components-lifecycle:(https://github.com/thepassle/webcomponents-from-zero-to-hero/blob/master/part-one/README.md#%EF%B8%8F-a-components-lifecycle)



目录
相关文章
|
4月前
|
前端开发 JavaScript
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
120 4
|
4月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
4月前
|
存储 JavaScript 前端开发
掌握现代Web开发的基石:深入理解React与Redux
【10月更文挑战第14天】掌握现代Web开发的基石:深入理解React与Redux
70 0
|
3月前
|
前端开发 JavaScript API
探究 React Hooks:如何利用全新 API 优化组件逻辑复用与状态管理
本文深入探讨React Hooks的使用方法,通过全新API优化组件逻辑复用和状态管理,提升开发效率和代码可维护性。
|
3月前
|
前端开发
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
42 3
|
3月前
|
前端开发 JavaScript
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
|
3月前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
55 2
|
4月前
|
前端开发 开发者
React 提供的其他重要 Hooks
【10月更文挑战第20天】React 提供了一系列强大的 Hooks,除了 `useRef` 之外,还有许多其他重要的 Hooks,它们共同构成了函数式组件开发的基础。
52 6
|
3月前
|
前端开发 JavaScript
React Hooks 深入解析
React Hooks 深入解析
45 0
|
3月前
|
前端开发
React Hooks:从基础到进阶的深入理解
React Hooks:从基础到进阶的深入理解
55 0

热门文章

最新文章