svelte教程(6)数据绑定

简介: 双向数据绑定双向绑定意味着当我们更改name的值时会更新input输入框的值,更改input输入框值的时候name的值同样会改变。<script> let name = 'world';</script><input bind:value={name}><h1>Hello {name}!</h1>如果您有多个与同一个值相关的输入,则可以bind:group与value属性一起使用。

双向数据绑定

双向绑定意味着当我们更改name的值时会更新input输入框的值,更改input输入框值的时候name的值同样会改变。

<script>
    let name = 'world';
</script>

<input bind:value={name}>

<h1>Hello {name}!</h1>

如果您有多个与同一个值相关的输入,则可以bind:group与value属性一起使用。同一组中的单选框是互斥的;同一组中的复选框输入形成选定值的数组。

<script>
  let scoops=1
  let flavours = ['Mint choc chip'];
  let menu = [
        'Cookies and cream',
        'Mint choc chip',
        'Raspberry ripple'
    ];
</script>

<label>
    <input type=radio bind:group={scoops} value={1}>
    One scoop
</label>

<label>
    <input type=radio bind:group={scoops} value={2}>
    Two scoops
</label>

<label>
    <input type=radio bind:group={scoops} value={3}>
    Three scoops
</label>
<div>
{#each menu as flavour}
    <label>
        <input type=checkbox bind:group={flavours} value={flavour}>
        {flavour}
    </label>
{/each}
</div>

我们还可以使用bind:value与元素绑定:

<script>
  let questions = [
    { id: 1, text: `Where did you go to school?` },
    { id: 2, text: `What is your mother's name?` },
    {
      id: 3,
      text: `What is another personal fact that an attacker could easily find with Google?`
    }
  ];
  let selected;
</script>

<select bind:value={selected}>
  {#each questions as question}
    <option value={question.id} label={question.text}></option>
  {/each}
</select>

<p>The question is "{selected?questions.filter(q => q.id === selected)[0].text:null}"</p>

的value值也可以是对象

<script>
  let questions = [
    { id: 1, text: `Where did you go to school?` },
    { id: 2, text: `What is your mother's name?` },
    {
      id: 3,
      text: `What is another personal fact that an attacker could easily find with Google?`
    }
  ];

    let selected;
</script>

<select bind:value={selected}>
  {#each questions as question}
    <option value={question} label={question.text}></option>
  {/each}
</select>

<p>The question is "{selected?selected.text:''}"</p>

一个可以具有一个multiple属性,在这种情况下,它将绑定一个数组而不是一个值。

<script>
  let questions = [
    { id: 1, text: `Where did you go to school?` },
    { id: 2, text: `What is your mother's name?` },
    {
      id: 3,
      text: `What is another personal fact that an attacker could easily find with Google?`
    }
  ];

  let selectedList = [];
</script>


<select bind:value={selectedList} multiple>
  {#each questions as question}
    <option value={question} label={question.text} />
  {/each}
</select>

{#each selectedList as selected}
   <p>The question is "{selected.text}"</p>
{/each}

contenteditable

具有contenteditable="true"属性的元素支持绑定textContent和innerHTML。

<script>
  let html = "<p>Write some text!</p>";
  let text = "Write some text!";
</script>

<style>
  [contenteditable] {
    padding: 0.5em;
    border: 1px solid #eee;
    border-radius: 4px;
  }
</style>

<div contenteditable="true" bind:innerHTML={html} />

<div contenteditable="true" bind:textContent={text} />

<pre>{html}</pre>
<p>{text}</p>

循环中使用数据绑定

<script>
    let todos = [
        { done: false, text: 'finish Svelte tutorial' },
        { done: false, text: 'build an app' },
        { done: false, text: 'world domination' }
    ];

    function add() {
        todos = todos.concat({ done: false, text: '' });
    }

    function clear() {
        todos = todos.filter(t => !t.done);
    }

    $: remaining = todos.filter(t => !t.done).length;
</script>

<style>
    .done {
        opacity: 0.4;
    }
</style>

<h1>Todos</h1>

{#each todos as todo}
    <div class:done={todo.done}>
        <input
            type=checkbox
            bind:checked={todo.done}
        >

        <input
            placeholder="What needs to be done?"
            bind:value={todo.text}
        >
    </div>
{/each}

<p>{remaining} remaining</p>

<button on:click={add}>
    Add new
</button>

<button on:click={clear}>
    Clear completed
</button>

clientWidth、clientHeight、offsetWidth、offsetHeight

这些属性为只读属性改变w、h的值不会更新元素。inline元素没有宽高。

<script>
  let w;
  let h;
  let w2;
  let h2;
  let size = 42;
  let text = "edit me";
</script>

<style>
  input {
    display: block;
    margin: 20px auto;
  }
  div {
    display: block;
  }
  .inline {
    display: inline;
  }
</style>

<input type="range" bind:value={size} />
<input bind:value={text} />

<p>size: {w}px x {h}px</p>

<div bind:clientWidth={w} bind:clientHeight={h}>
  <span style="font-size: {size}px">{text}</span>
</div>

<p>line size: {w2}px x {h2}px</p>
<div bind:clientWidth={w2} bind:clientHeight={h2} class="inline">
  <span style="font-size: {size}px">{text}</span>
</div>

bind:this

bind:this可以拿到一个元素的引用。

<script>
  let w;
  let h;
  let w2;
  let h2;
  let size = 42;
  let text = "edit me";
  function getRects(){
    console.log(this.getClientRects())
    console.log(this.getBoundingClientRect())
  }
</script>

<style>
  input {
    display: block;
    margin: 20px auto;
  }
  div {
    display: block;
  }
  .inline {
    display: inline;
  }
</style>

<input type="range" bind:value={size} />
<input bind:value={text} />

<p>size: {w}px x {h}px</p>
<div
  on:click={getRects}
  bind:clientWidth={w}
  bind:clientHeight={h}>
  <span style="font-size: {size}px">{text}</span>
</div>

<p>line size: {w2}px x {h2}px</p>
<div
  on:click={getRects}
  bind:clientWidth={w2}
  bind:clientHeight={h2}
  class="inline">
  <span style="font-size: {size}px">
    {text}
  </span>
</div>

组件数据绑定

正如可以绑定到DOM元素的属性一样,也可以绑定到组件prop。

// Keypad.svelte
<script>
  import { createEventDispatcher } from "svelte";

  export let value = "";

  const dispatch = createEventDispatcher();

  const select = num => () => (value += num);
  const clear = () => (value = "");
  const submit = () => dispatch("submit");
</script>

<style>
  .keypad {
    display: grid;
    grid-template-columns: repeat(3, 5em);
    grid-template-rows: repeat(4, 3em);
    grid-gap: 0.5em;
    justify-content: center;
  }

  button {
    margin: 0;
  }
</style>

<div class="keypad">
  <button on:click={select(1)}>1</button>
  <button on:click={select(2)}>2</button>
  <button on:click={select(3)}>3</button>
  <button on:click={select(4)}>4</button>
  <button on:click={select(5)}>5</button>
  <button on:click={select(6)}>6</button>
  <button on:click={select(7)}>7</button>
  <button on:click={select(8)}>8</button>
  <button on:click={select(9)}>9</button>

  <button disabled={!value} on:click={clear}>clear</button>
  <button on:click={select(0)}>0</button>
  <button disabled={!value} on:click={submit}>submit</button>
</div>

// component_bind.svelte
<script>
    import Keypad from '../components/Keypad';

    let pin;
    $: view = pin ? pin.replace(/\d(?!$)/g, '•') : 'enter your pin';

    function handleSubmit() {
        alert(`submitted ${pin}`);
    }
</script>
<h1 style="color: {pin ? '#333' : '#ccc'}">{view}</h1>

<Keypad bind:value={pin} on:submit={handleSubmit}/>

本教程的所有代码均上传到github有需要的同学可以参考 https://github.com/sullay/svelte-learn

目录
相关文章
|
网络协议 网络架构
计算机网络实验(华为eNSP模拟器)——第八章 动态主机配置协议(DHCP)
计算机网络实验(华为eNSP模拟器)——第八章 动态主机配置协议(DHCP)
计算机网络实验(华为eNSP模拟器)——第八章 动态主机配置协议(DHCP)
|
6月前
|
机器学习/深度学习 人工智能 PyTorch
阿里云GPU云服务器简介:优势场景价详解,最新收费标准与活动价格参考
阿里云GPU云服务器怎么样?阿里云GPU结合了GPU计算力与CPU计算力,主要应用于于深度学习、科学计算、图形可视化、视频处理多种应用场景,现在购买有包月5折包年4折起等优惠,GPU 计算型 gn6i实例4核15G包月优惠价1681.00元/1个月起,包年16141.80元/1年起;GPU 计算型 gn6v实例8核32G包月优惠价3817.00元/1个月起,包年36647.40元/1起等。本文为您详细介绍阿里云GPU云服务器产品优势、应用场景以及最新活动价格。
|
4月前
|
缓存 JSON 自然语言处理
跨国采购 item_search 接口对接全攻略:从入门到精通
本文详解跨境电商多平台商品搜索接口(item_search)的标准化对接方案,覆盖Amazon、eBay、Lazada、速卖通等平台。从业务场景出发,剖析选品、比价、供应商筛选等核心需求,提出“统一接口+差异化适配”框架,实现关键词搜索、多条件筛选与数据标准化。通过抽象基类封装认证、参数映射、响应解析等共性流程,结合多语言处理、汇率转换与重试机制,构建高效稳定的全球采购搜索系统,助力企业提升决策效率与市场竞争力。(238字)
|
缓存 人工智能 算法
深度揭秘复杂异构硬件推理优化
本文介绍了大语言模型在部署推理层面的性能优化工作,涵盖高性能算子、量化压缩、高效运行时及分布式调度四个方面。面对参数和上下文规模增长带来的显存、缓存与计算开销挑战,文中详细探讨了如何通过优化算子性能、低精度量化压缩、异步运行时框架设计以及多层次分布式架构来提升大模型推理效率。此外,还展示了BladeLLM引擎框架的实际应用效果,证明了这些技术在高并发场景下的显著性能提升。
|
存储 Kubernetes 调度
深入理解Kubernetes中的Pod与Container
深入理解Kubernetes中的Pod与Container
939 0
|
人工智能 安全 物联网
未来已来:探索新兴技术的发展趋势与应用场景
在数字化浪潮中,新兴技术如区块链、物联网(IoT)、虚拟现实(VR)等正不断重塑我们的世界。本文将深入探讨这些技术的最新发展趋势和实际应用案例,揭示它们如何影响经济、社会和文化,并提出对未来的展望。通过分析具体数据和前沿研究,我们将展示这些技术如何在医疗、教育、金融等领域创造革命性变化,并讨论它们面临的挑战与机遇。
358 27
|
数据采集 数据可视化 关系型数据库
基于Python flask MySQL的穷游网酒店数据采集与可视化大屏
本文介绍了一个基于Python Flask和MySQL的穷游网酒店数据采集与可视化大屏项目,该项目实现了酒店数据的采集、存储和前端可视化展示,使用户能够直观了解酒店数据分布和价格趋势。
305 1
|
机器学习/深度学习 人工智能 数据可视化
【2020-2024持续更新】Echo State Network和储层计算论文汇总!包括经典ESN、DeepESN、组合ESN和综述!
本文汇总了2020至2024年间关于Echo State Network(ESN)和储层计算的研究成果,包括综述、不同模型分类(经典ESN、DeepESN、组合ESN)、开源论文、储层计算相关研究以及ESN在各个领域的应用情况。
386 0
|
消息中间件 中间件 测试技术
【中间件1】在Windows下搭建RocketMQ
目录 目录 一 准备工作 1 RocketMQ部署架构1 2 环境配置 二 安装RocketMQ 1 下载编译好的RocketMQ 2 解压缩并进入bin目录 3 启动name server 4 启动broker 5 MQ安装完毕 三 验证MQ是否安...
2805 94
|
SQL 关系型数据库 MySQL
大量delete mysql的数据时,为什么导致OOM
大量delete mysql的数据时,为什么导致OOM

热门文章

最新文章