Svelte生命周期(加整体概述)

news2024/12/26 21:51:48

目录

前言

一、编译阶段

1. 导入语句

2. 组件声明

3. 模板部分

4. CSS样式

二、运行时阶段

三、生命周期函数

1. onMount

2. beforeUpdate 与 afterUpdate

3. onDestroy

4. setContext 与 getContext

6. hasContext

7. getAllContexts


前言

Svelte是一种现代的JavaScript框架,用于构建高效且响应式的Web应用程序。它采用了独特的编译方式,将组件编译为高效的原生代码,从而提供更好的性能和用户体验。在Svelte的生命周期中,有许多重要的阶段,包括编译、运行时和组件的生命周期。

一、编译阶段

Svelte的编译阶段主要涉及将Svelte组件转换为可执行的JavaScript代码。在Svelte中,组件通常以.svelte文件的形式存在,并使用特殊的语法和指令。在编译过程中,Svelte编译器会解析组件文件,并将其转换为可执行的JavaScript代码。

1. 导入语句

在Svelte中,可以使用<script>标签导入所需的JavaScript模块。例如:

<script>  
  import { add } from './math.js';  
</script>

2. 组件声明

在Svelte中,可以使用<script>标签声明组件的逻辑部分。例如:

<script>  
  let count = 0;  
  
  function increment() {  
    count++;  
  }  
</script>

3. 模板部分

在Svelte中,可以使用HTML语法来定义组件的外观和结构。例如:

<h1>Hello, World!</h1>  
<button on:click={increment}>Increment</button>

4. CSS样式

在Svelte中,可以使用CSS语法来定义组件的样式。例如:

<style>  
  h1 {  
    color: red;  
  }  
</style>

在编译阶段结束时,Svelte编译器将生成可执行的JavaScript代码,用于在浏览器中运行。

强推svelte官网提供的REPL,可供学习和查看编译后的代码!

二、运行时阶段

在运行时阶段,Svelte应用程序开始执行并响应用户的交互。Svelte应用程序由多个组件组成,每个组件都包含一个独立的运行时环境。当用户与应用程序交互时,每个组件都会根据其逻辑和模板进行相应的更新和渲染。

创建组件实例:在Svelte应用程序中,每个组件都是一个独立的实例。当组件被加载时,Svelte会创建一个新的实例,并将其存储在内存中。

更新状态:当用户与应用程序交互时,组件的状态可能会发生变化。例如,当用户点击按钮时,计数器的值会增加。这些状态变化将触发组件的更新和重新渲染。

重新渲染:当组件的状态发生变化时,Svelte会重新计算组件的外观和结构,并更新DOM。在Svelte中,重新渲染是一个轻量级的操作,因为只有在状态发生变化时才会进行。这使得Svelte具有很高的性能和响应性。

销毁组件:当组件不再需要时,Svelte会将其从内存中删除,以释放资源。在销毁过程中,组件的生命周期函数将被调用,以便进行必要的清理和资源释放。

三、生命周期函数

1. onMount

在组件挂载到DOM后执行。常用于初始化异步操作或执行DOM操作。

<script>
  import { onMount } from 'svelte';

  onMount(() => {
    // 在组件被插入到 DOM 后执行初始化操作
    console.log('组件已插入到 DOM');
  });
</script>

2. beforeUpdate 与 afterUpdate

在组件更新之前和之后触发,可用于在更新前后进行一些操作。

<script>
  import { beforeUpdate, afterUpdate } from 'svelte';

  let count = 0;

  beforeUpdate(() => {
    // 在组件更新之前执行操作
    console.log('组件将要更新');
  });

  afterUpdate(() => {
    // 在组件更新之后执行操作
    console.log('组件已更新');
  });

  function increment() {
    count++;
  }
</script>

<button on:click={increment}>增加</button>
<p>计数:{count}</p>

这里需要注意,组件初始化会触发第一次,后面点击后再次触发。

3. onDestroy

组件被销毁之前触发,可用于清理资源或取消订阅。

<script>
  import { onDestroy } from "svelte";

  // 初始化操作,比如开启一个定时器
  const timer = setInterval(() => {
    console.log("timer");
  }, 1000);

  onDestroy(() => {
    // 组件销毁前执行清理操作,比如取消定时器
    clearInterval(timer);
  });
</script>

4. setContext 与 getContext

这是一对特殊的生命周期函数,将任意 context 对象与当前组件和指定的 key 关联并返回该对象检索属于具有指定 key 的最近父组件的上下文

可以用于同祖先的组件之间的数据传递,而不必像父向子传值一样一层一层传下去。必须在组件初始化期间调用它。这里很像Vue的provide和inject。

Parent.svelte:

<script>
  import { setContext } from 'svelte';
  import Child from './Child.svelte';

  let message = 'Hello';

  setContext('message', message);
</script>

<div>我是Parent,我传递了{message}</div>
<Child />

Child.svelte:

<script>
  import Grandson from "./Grandson.svelte";
</script>

<div>我是Child</div>
<Grandson />

Grandson:

<script>
    import { getContext } from "svelte";
  
    let message = getContext("message");
  </script>
  
  <div>我是Grandson:我接受了{message}</div>

页面:

注意: 非同组先的组件,传递数据会失败。

比如Parent.svelte里面新增一个和Child.svelte同级的Brother.svelte组件,并从Child.svelte传递新的值test,Brother.svelte就接收不到。因为Child.svelte和Brother.svelte同级,它传递出来的数据只能由它的后代组件接收。

Brother.svelte:

<script>
  import { getContext } from "svelte";

  let message = getContext("message");
  let test = getContext("test");
</script>

<div>我是Brother:我接受了{message}</div>
<div>我是Brother:我接受了{test}</div>

修改后的Child.svelte:

<script>
  import Grandson from "./Grandson.svelte";
  import { setContext } from "svelte";

  let test = "非同祖先组件传递的数据";

  setContext("message", test);
</script>

<div>我是Child,我传递了{test}</div>
<Grandson />

修改后的Parent.svelte:

<script>
  import { setContext } from 'svelte';
  import Child from './Child.svelte';
  import Brother from './Brother.svelte';

  let message = 'Hello';

  setContext('message', message);
</script>

<div>我是Parent,我传递了{message}</div>
<Child />
<Brother />

页面:

6. hasContext

检查是否已在父组件的上下文中设置给定的 key 。必须在组件初始化期间调用。

<script>
  import { hasContext } from 'svelte';

  if (hasContext('message')) {
    // do something
  }
</script>

7. getAllContexts

检索属于最近父组件的整个上下文映射。必须在组件初始化期间调用。

<script>
  import { getAllContexts } from 'svelte';

  const contexts = getAllContexts();
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1083197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

冠军代言|媒介易:释放品牌潜力,实力助力,助您势如破竹!

在竞争激烈的市场中&#xff0c;品牌需要不断创新&#xff0c;找到吸引目标客户的方法。而与体育冠军合作&#xff0c;通过冠军代言&#xff0c;已经成为了众多企业提高品牌知名度、树立形象、吸引消费者目光的重要策略之一。在这个领域&#xff0c;媒介易以其实力加冕&#xf…

如何正确高效使用墨西哥专线?

在当今全球化的物流行业中&#xff0c;跨境运输服务已经成为许多企业拓展国际市场的重要手段。然而&#xff0c;由于各国法律法规、文化差异以及运输环节的复杂性&#xff0c;企业在进行跨境运输时可能会遇到诸多挑战。为了解决这些问题&#xff0c;一些专业的物流公司推出了“…

浅谈电能质量监测装置在某半导体公司的应用

摘 要&#xff1a;半导体生产制造业在国民经济中起着举足轻重的作用&#xff0c;相关企业的规模也越来越大。其供配电系统稳定、可靠的运维不仅是其安全生产的基本保证&#xff0c;还关系到产品质量和生产的顺利进行。而半导体行业中大部分工艺设备对电能质量比较敏感&#xff…

KEIL5添加沁恒的ch55x芯片(其他非arm和stm32芯片也可使用类似的方法)

准备工作 参考&#xff1a;https://www.iotword.com/8615.html 已经安装好keil5的软件环境 烧录工具下载 沁恒烧录工具地址&#xff0c;下载安装后如下图 操作步骤 打开从沁恒官网下载安装好的WHCISPTOOL软件 安装下图中的操作方式完成对安装软件keil5中的配置文件的生…

京东商品列表数据接口,关键词搜索京东商品数据接口

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取京东网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;京东网站…

Camtasia Studio2024最新版本正式更新上线!

Camtasia Studio2024是一款专门录制屏幕动作的工具&#xff0c;它能在任何颜色模式下轻松地记录 屏幕动作&#xff0c;包括影像、音效、鼠标移动轨迹、解说声音等等&#xff0c;简单实用的视频录制软件,游戏的精彩画面,网络视频,屏幕录制可以让您录制屏幕所有内容视频录制支持3…

1806_emacs_org-mode归档的时候修改归档文件名称

全部学习汇总&#xff1a;GreyZhang/g_org: my learning trip for org-mode (github.com) 前面已经基本了解了org-mode的归档的规则或者方法&#xff0c;但是还有一点跟我现在的工作流有点不相符。我自己的工作流中会每月做一次工作的整理总结&#xff0c;因此归档的文件是按照…

Vue3新的状态管理库-Pinia(保姆级别教程)

目录 1.什么是Pinia2.为什么使用Pinia3.创建项目4.检查Pinia的安装版本5.main.js引入Pinia6.定义Store-组合式API写法(推荐)7.getters的实现8.action的异步实现9.storeToRefs 1.什么是Pinia Pinia是Vue的专属的最新状态管理库, 是Vuex状态管理工具的替代品 vue.js官网 https:…

柯桥学设计,室内设计当下,简约式的奢华正流行

清闲简练 石材原木的空间设计探索中强调与艺术美学的碰撞融合&#xff0c;Mohammad Alomran采用清爽的白色和温暖的奶油色调搭配&#xff0c;以简练当代的语言&#xff0c;实现优雅、简约的创意设计&#xff0c;形成空间独特的魅力。 J. SH 奢华在于细节&#xff0c;优雅在于…

小程序中使用echarts的相关配置以及折线图案例(简单易懂)

第一步&#xff1a;引入echarts文件--此文件需要下载&#xff1a; 下载地址&#xff1a;点击此处进行下载echarts文件 点击Download ZIP下载压缩包&#xff0c;注意&#xff1a;e-canvas是我从完整的文件中剥离出来的有用的&#xff0c;不会影响项目。 第二步&#xff1a;把整…

LNMP和数据库的安装

LNMP是什么 L&#xff1a;Linux平台&#xff0c;操作系统&#xff0c;另外桑组件的运行平台 N&#xff1a;nginx 提供前端页面 M&#xff1a;MySQL&#xff0c;开源关系的数据库&#xff0c;主要是用来保存用户账号信息。 P&#xff1a;PHP&#xff0c;开发一种动态页面的编程语…

jeecg库login登录过程分析笔记

jeecg库&#xff08;版本jeecg-boot-v3.5.1last&#xff09;实现了用户登录功能&#xff0c;二开时为了借鉴jeecg用户登录的方法&#xff0c;跑了一遍登录方法&#xff1a; org.jeecg.modules.system.controller.LoginController#login 定义这个方法的类的路径是&#xff1a;…

RabbitMQ之死信队列解读

目录 基本介绍 消息进入到死信队列的情况 消息过期 队列过期 队列达到最大长度&#xff08;先入队的消息会被发送到DLX&#xff09; 消费者拒绝消息不进行重新投递 消费者拒绝消息 springboot代码实战 实战架构 工程概述 RabbitConfigDeal 配置类&#xff1a;创建队列…

极简c++(9)函数模板与类模板

模板概念 函数模板 注意&#xff1a;不允许template与函数模板定义之间有任何语句&#xff1b; 类模板 没有讲的内容 后续需要可以自己查看补充。

C++ 使用getline()从文件中读取一行字符串

我们知道,getline() 方法定义在 istream 类中,而 fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时,该方法的功能就变成了从指定文件中读取一行字符串。 该方法有以下 2 种语…

战绩查询、作图工具、干货分享,助你成为吃鸡高手!

大家好&#xff01;吃鸡玩家的福音来了&#xff01;欢迎来到闲游盒的世界&#xff0c;这里有一切你需要的&#xff1a;从战绩查询到作图工具&#xff0c;从干货分享到技巧免费领取&#xff01; 首先&#xff0c;让我们谈谈战绩查询。作为一名玩家&#xff0c;当你在吃鸡游戏中取…

C#,数值计算——数据建模Fitmrq(Levenberg-Marquardt nonlinear fitting)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Levenberg-Marquardt nonlinear fitting /// </summary> public class Fitmrq { private const int NDONE 4; private const int ITMAX 1000; …

【【萌新的SOC学习之GPIO之MIO控制LED实验程序设计】】

萌新的SOC学习之GPIO之MIO控制LED实验程序设计 如何设置完GPIO并且传递数据 我们先了解GPIO引脚的配置 每一个GPIO引脚都可以设置成输入输出 &#xff0c;只有GPIO8 7 只能作为输出 我们现在做一个例子 GPIO 的bank我们知道有4个 bank0 1 2 3 DIRM_0 就是第一个bank 需要写入…

tecplot的使曲线光滑的方法

在对流场模拟结果进行处理时&#xff0c;不可避免的存在些许的噪声导致tecplot的曲线不光滑&#xff0c;故介绍一下tecplot中曲线光滑的方法 1.选择data-alter 2.data中选择smooth,通过调节number of passes&#xff0c;调节曲线光滑程度 大功告成&#xff01; 最近发现写的文…

防反接方案,NMOS PMOS

NMOS电路的缺陷 1.1&#xff0c;由于NMOS具有内阻&#xff0c;我们可以把它设为Rdson, 那么电优先会从低电阻串口处走&#xff0c;这样会有烧毁串口地的风险。 1.2&#xff0c;短期内的方案是&#xff0c;可以在串口处串接1个100ohm电阻。 PMOS电路