[svelte]属性和逻辑块

属性 / Default values • Svelte 教程 | Svelte 中文网

属性
Declaring props

到目前为止,我们只处理了内部状态——也就是说,这些值只能在给定的组件中访问。 在任何实际应用程序中,都需要将数据从一个组件向下传递到其子组件。为此,我们需要声明属性,通常缩写为“props”。在 Svelte 中,我们使用关键字export来做到这一点

app.svelte

<script>import Nested from './Nested.svelte';
</script><Nested answer={42}/>

Nested.svelte

<script>export let answer;
</script><p>The answer is {answer}</p>

可以将export删除来看前后对比

一个会输出The answer is 42,一个是The answer is undefined

Default values

我们重新修改一下代码

app.svelte

<script>import Nested from './Nested.svelte';
</script><Nested answer={42}/>
<Nested/>

Nested.svelte

<script>export let answer = 'a mystery';
</script><p>The answer is {answer}</p>

那这样子最后的输出是什么

The answer is 42

The answer is a mystery

前面一个42是,因为引入了answer的定义值

后面因为没有了,就变成Nested中的默认值了

属性传递

如果组件中含有一个对象属性,可以利用...语法将它们传到一个组件上,这样子就不用一个一个的指定

相反,如果你需要引用传递到组件中的所有道具,包括未使用export声明的道具,可以利用$$props 直接获取。但通常不建议这么做,因为Svelte难以优化,但在极少数情况下很有用。

Info.svelte

<script>export let name;export let version;export let speed;export let website;
</script><p>The <code>{name}</code> package is {speed} fast.Download version {version} from <a href="https://www.npmjs.com/package/{name}">npm</a>and <a href={website}>learn more here</a>
</p>

app.svelte

<script>import Info from './Info.svelte';const pkg = {name: 'svelte',version: 3,speed: 'blazing',website: 'https://svelte.dev'};
</script>/*<Info name={pkg.name} version={pkg.version} speed={pkg.speed} website={pkg.website}/>*/
<Info {...pkg}/>
逻辑
if

HTMl没有表达逻辑的方式,但if可以被包装在一个块中

比如下面这样子

<script>let user = { loggedIn: false };function toggle() {user.loggedIn = !user.loggedIn;}
</script>{#if user.loggedIn}
<button on:click={toggle}>Log out
</button>
{/if}{#if !user.loggedIn}<button on:click={toggle}>Log in</button>
{/if}
else

因为上面代码中的两个条件是互斥的,所以其实可以用else来简化组件

<script>let user = { loggedIn: false };function toggle() {user.loggedIn = !user.loggedIn;}
</script>{#if user.loggedIn}<button on:click={toggle}>Log out</button>
{:else}<button on:click={toggle}>Log in</button>
{/if}

#开始,/结束,: 中间插入

else if

将多个条件链接在一起的时候就需要 else if 上场了

<script>let x = 7;
</script>{#if x > 10}<p>{x} is greater than 10</p>
{:else if 5 > x}<p>{x} is less than 5</p>
{:else}<p>{x} is between 5 and 10</p>
{/if}
each遍历

遇见需要进行遍历的数据列表

遇到数组或类似于数组的对象 (即具有length 属性)。都可以通过 each [...iterable]遍历迭代该对象。

<script>let cats = [{ id: 'J---aiyznGQ', name: 'Keyboard Cat' },{ id: 'z_AbfPXTKms', name: 'Maru' },{ id: 'OUtn3pvWmpg', name: 'Henri The Existential Cat' }];
</script><h1>The Famous Cats </h1><ul>{#each cats as cat}<li><a target="_blank" href="https://www.baidu.com/">{cat.name}</a></li>{/each}
</ul><ul>{#each cats as { id, name }, i}<li><a target="_blank" href="https://www.youtube.com/watch?v={id}">{i + 1}: {name}</a></li>{/each}
</ul>
each添加key值

一般来说,当你修改each 块中的值时,它将会在 尾端 进行添加或删除条目,并更新所有变化, 这可能不是你想要的效果。

Thing.svelte

<script>// `current` is updated whenever the prop value changes...export let current;// ...but `initial` is fixed upon initialisationconst initial = current;
</script><p><span style="background-color: {initial}">initial</span><span style="background-color: {current}">current</span>
</p><style>span {display: inline-block;padding: 0.2em 0.5em;margin: 0 0.2em 0.2em 0;width: 4em;text-align: center;border-radius: 0.2em;color: white;}
</style>

App.svelte

<script>import Thing from './Thing.svelte';let things = [{ id: 1, color: '#0d0887' },{ id: 2, color: '#6a00a8' },{ id: 3, color: '#b12a90' },{ id: 4, color: '#e16462' },{ id: 5, color: '#fca636' }];function handleClick() {things = things.slice(1);}
</script><button on:click={handleClick}>Remove first thing
</button>{#each things as thing}<Thing current={thing.color}/>
{/each}

可以运行上面的代码进行实例查看,尝试多次点击'Remove first thing' 按钮,这时<Thing> 组件是从尾端开始被移除,这显然不是我们想要的,我们希望是从上至下依次开始删除组件。

很明显,他直接删除的是最下面的initial,为此,我们为 each 块指定一个唯一标识符,作为 key 值:

{#each things as thing (thing.id)}<Thing current={thing.color}/>
{/each}

 

(thing.id) 告诉 Svelte 什么地方需要改变。

可以将任何对象用作 key 来使用,就像Svelte 用 Map 在内部作为key一样,换句话说,你可以用 (thing) 来代替 (thing.id)作为 key 值。但是,使用字符串或者数字作为 key 值通常更安全,因为这能确保它的唯一性,例如,使用来自API服务器的新数据进行更新时。

 Await

很多Web应用程序都可能在某个时候有需要处理异步数据的需求。使用 Svelte 在标签中使用 await 处理promises 数据亦是十分容易:

promise总是获取最新的信息,无需关心 rece 状态。

<script>let promise = getRandomNumber();async function getRandomNumber() {const res = await fetch(`tutorial/random-number`);const text = await res.text();if (res.ok) {return text;} else {throw new Error(text);}}function handleClick() {promise = getRandomNumber();}
</script><button on:click={handleClick}>generate random number
</button>{#await promise}<p>...waiting</p>
{:then number}<p>The number is {number}</p>
{:catch error}<p style="color: red">{error.message}</p>
{/await}

Promise 是 JavaScript 中用于处理异步操作的一种机制。它代表了一个异步操作的最终完成或失败,并且可以将相关的处理逻辑附加到这个操作上。

在 JavaScript 中,异步操作通常涉及到网络请求、文件读取、定时器等需要花费一定时间才能完成的任务。

传统的回调函数方式处理异步操作可能会导致回调地狱(callback hell)和难以理解的代码结构。而 Promise 则提供了一种更清晰和可靠的方式来处理异步操作。

一个 Promise 对象有三种状态:

Pending(进行中):初始状态,表示异步操作尚未完成,也未失败。

Fulfilled(已完成):表示异步操作成功完成。

Rejected(已失败):表示异步操作失败。

一个 Promise 对象可以通过调用 resolve 函数来将其状态从 pending 变为 fulfilled,也可以通过调用 reject 函数将其状态从 pending 变为 rejected。一旦状态发生改变,Promise 对象的状态就不会再改变,它的状态一旦改变,就会一直保持在当前状态,直到被处理(通过 .then() 或 .catch() 方法)。

在使用 Promise 的时候,通常会使用 .then() 方法来处理异步操作成功时的情况,使用 .catch() 方法来处理异步操作失败时的情况。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO基础合集

IO基础合集 1. File类1.1 概述1.2 构造方法1.3 常用方法获取功能的方法绝对路径和相对路径判断功能的方法创建删除功能的方法 1.4 目录的遍历 2. IO概述2.1 什么是IO2.2 IO的分类2.3 IO的流向说明图解2.4 顶级父类们 3. 字节流3.1 一切皆为字节3.2 字节输出流【OutputStream】3…

Buck变换电路

Buck变换电路 Buck变换电路是最基本的DC/DC拓扑电路&#xff0c;属于非隔离型直流变换器&#xff0c;其输出电压小于输入电压。Buck变换电路具有效率高、输出稳定、控制简单和成本低的优点&#xff0c;广泛应用于稳压电源、光伏发电、LED驱动和能量回收系统。 电路原理 Buck变…

SV-29810T-蓝牙无线IP网络多功能多媒体防水音柱

SV-29810T-蓝牙无线IP网络多功能多媒体防水音柱 ◆室外室内豪华型防水音柱式一体化网络音频解码扬声器&#xff0c;用于广播分区音频解码、声音还原作用 ◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车场及露天市场等&#xff1b;室外使用效果均佳。 产品特点&#…

每日两题2

不同路径 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m1, vector<int>(n1,0));//创建dp表dp[0][1] 1;//初始化//填表for(int i 1; i < m; i){for(int j 1; j < n; j){dp[i][j] dp[i-1][j] dp[i][j-1];}}ret…

一分钟举例了解AI智能客服机器人的具体应用

AI智能客服机器人广泛应用于多个领域&#xff0c;充斥着我们生活的方方面面。在电商领域、银行业、电信行业、政府机构、教育机构、医疗机构等也借助AI智能客服机器人提供咨询、答疑等服务。但是具体是怎么应用到这些场景的呢&#xff1f;今天就用HelpLook的AI智能机器人的具体…

算法与数据结构(基于Go语言)学习笔记01

算法初识&#xff1a;汉诺塔问题(Towers of Hanoi) 规则简介 ​ 给定三根柱子&#xff0c;记为 A A A、 B B B、 C C C&#xff0c;其中 A A A 柱子上有 n − 1 n-1 n−1 个盘子&#xff0c;从上至下盘子越来越大。问&#xff1a;将 A A A柱上的盘子经由 B B B柱&#xff…

Leetcode 15. 三数之和(暴力->双指针)

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1…

解决EasyPoi导入Excel获取不到第一列的问题

文章目录 1. 复现错误2. 分析错误2.1 导入的代码2.2 DictExcel实体类2.2 表头和标题3. 解决问题1. 复现错误 使用EasyPoi导入数据时,Excel表格如下图: 但在导入时,出现如下错误: name为英文名称,在第一列,Excel表格有值,但导入的代码中为null,就很奇怪? 2. 分析错误 …

机器学习中的激活函数

激活函数存在的意义&#xff1a; 激活函数决定了某个神经元是否被激活&#xff0c;当这个神经元接收到的信息是有用或无用的时候&#xff0c;激活函数决定了对这个神经元接收到的信息是留下还是抛弃。如果不加激活函数&#xff0c;神经元仅仅做线性变换&#xff0c;那么该神经网…

基于Ultrascale+系列GTY收发器8b/10b编码方式的数据传输(三)——利用In System IBERT优化信号质量

基于Ultrascale系列GTY收发器8b/10b编码方式的数据传输&#xff08;二&#xff09;——数据收发及上板测试 一文介绍了利用GTY高速收发器进行8B/10B编码数据收发的使用方式&#xff0c;本文继续介绍使用In System IBERT IP核构建ibert眼图测试&#xff0c;以及通过设置参数以优…

ArcGIS三维景观分层显示

今天将向大家介绍的事在ArcGIS中如何创建多层三维显示。 地表为影像的 地表为地形晕渲的 在土壤分层、油气分层等都有着十分重要的应用。下面我们具体来看看实现过程 一、 准备数据及提取栅格范围 我们这次准备的数据是之前GIS100例-30讲的案例数据。《ArcGIS三维影像图剖面图…

C语言 函数——代码风格

目录 基本的代码规范 程序版式 对齐&#xff08;Alignment&#xff09;与缩进&#xff08;indent&#xff09; 变量的对齐规则 空行——分隔程序段落的作用 代码行内的空格——增强单行清晰度 代码行 长行拆分 标识符命名规则 标识符命名的共性规则 windows应用程序…