svelte响应式核心——赋值

1、触发反应性的核心——赋值

Svelte 的核心是功能强大的响应式系统,用于使 DOM 与你的应用程序状态保持同步,例如响应事件。

<script>
  let count = 0;

  function handleClick() {
    // 事件处理代码写在这儿
  }
</script>

<button>
  Clicked {count} {count === 1 ? 'time' : 'times'}
</button>

为了演示它,我们首先需要连接一个事件处理程序。用以下内容替换 button 的开始标记:

<button on:click={handleClick}>

handleClick函数里,我们要编写代码更改count的值:

function handleClick() {
  count += 1;
}

Svelte 会针对这个赋值生成一些代码,该代码告诉 DOM 什么地方需要更新。

2、声明

当组件的状态更改时,Svelte 会自动更新 DOM。

通常,组件状态的某些部分需要从 其他 部分中计算得出(例如,fullname 系由 firstname 和 lastname 组合而成),并在每次更改时重新计算。

对于这些,我们有 响应式声明。他们看起来像这样:

  let count = 0;
  $: doubled = count * 2;

完整代码:

<script>
  let count = 0;
  $: doubled = count * 2;

  function handleClick() {
    count += 1;
  }
</script>

<button on:click={handleClick}>
  Clicked {count} {count === 1 ? 'time' : 'times'}
</button>
如果这看起来有点陌生,请不要担心。它是 有效的(只不过没那么常见的)JavaScript,Svelte 能理解代码的意思:“只要任何引用的值发生更改,都要重新运行此代码”。一旦习惯了,你就再也回不了头了。

现在让我们在标记中再加一个doubled

<script>
  let count = 0;
  $: doubled = count * 2;

  function handleClick() {
    count += 1;
  }
</script>

<button on:click={handleClick}>
  Clicked {count} {count === 1 ? 'time' : 'times'}
</button>

<p>{count} doubled is {doubled}</p>

当然,您可以只在标记中编写{count * 2},而不必使用响应式值。当您需要多次引用它们,或者您的值依赖于其他响应式的值时,响应式的值变得特别有用。

3、语句

我们不仅限于声明响应式的,我们还可以响应式地运行任意语句。 例如,只要更改count的值,我们就可以在控制台输出它的值:

<script>
  let count = 0;
  $: doubled = count * 2;
	
  // 只要更改count 的值,我们就可以在控制台输出它的值
  $: console.log(`the count is ${count}`);

  function handleClick() {
    count += 1;
  }
</script>

<button on:click={handleClick}>
  Clicked {count} {count === 1 ? 'time' : 'times'}
</button>

<p>{count} doubled is {doubled}</p>

你可以轻松将一组语句放在一个块里:

$: {
	console.log(`the count is ${count}`);
	alert(`I SAID THE COUNT IS ${count}`);
}

你甚至可以将$:放在一个if语句之前:

$: if (count >= 10) {
	alert(`count is dangerously high!`);
	count = 9;
}

4、更新数组和对象

Svelte 的响应性是由赋值触发的,因此使用诸如 pushsplice 等数组方法不会引起自动更新。

正如下方示例,点击按钮后界面不会有任何变化:

<script>
  let numbers = [1, 2, 3, 4];

  function addNumber() {
    numbers.push(numbers.length + 1);
  }

  $: sum = numbers.reduce((t, n) => t + n, 0);
</script>

<p>{numbers.join(' + ')} = {sum}</p>

<button on:click={addNumber}>Add a number</button>

解决这个问题的其中一个办法是写一行多余的赋值给自身的表达式:

function addNumber() {
  numbers.push(numbers.length + 1);
  numbers = numbers;
}

但还有一个更常用的方案:

function addNumber() {
  numbers = [...numbers, numbers.length + 1];
}

你可以使用类似的办法来替代 popshiftunshift 和 splice

此外,赋值给数组和对象的 属性,例如 obj.foo += 1 或 array[i] = x,其实与直接赋值给自身的方式是一样的。

function addNumber() {
	numbers[numbers.length] = numbers.length + 1;
}

这里有一个简单的规则:更新变量的名称,必须出现在赋值的左侧。例如这个...

const foo = obj.foo; foo.bar = 'baz';

...不会更新对 obj.foo.bar 的引用,除非后面加上 obj = obj

例如下方的代码可以触发更新:

<script>
  let obj = { a: { b: { c: 10 } } }
</script>

<button on:click={ () => obj.a.b.c = 20 }>update</button>
<p>c = {obj.a.b.c}</p>

但是下方代码不会更新:

<script>
  let obj = { a: { b: { c: 10 } } }

  function handleClick() {
    let b = obj.a.b
    b.c = 20   // 不会触发更新

    // 除非有一个赋值操作,尝试取消下面这行注释:
    // obj = obj;
  }
</script>

<button on:click={ handleClick }>update</button>
<p>c = {obj.a.b.c}</p>

总结

赋值——是触发 Svelte 反应性的核心,Svelte 编译器根据赋值来确定是否需要更新相应的值。

除了常规的赋值语句外,$ 符号是另一种十分强大的反应性声明,它类似 Vue 的 computed 属性,不仅支持普通表达式,还可以是大括号括起的语句,甚至是 if 语句。

需要特别注意的是,数组的 push、pop、shift、unshift、splice 方式,不会触发反应性,可以通过两种方式来让 Svelte“认为”此处需要进行更新,第一种是使用数组的方法,然后使用看起来十分“呆板”的 numbers = numbers;第二种实际上也是赋值,不过它通过 ... 解构后重组了整个数组,然后赋值回了给 numbers 引用。

同样地,对象的子属性单独拿出来使用,也不会触发反应性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值