【问题标题】:Pass value from Child to Parent in svelte - Intuition for the bind directive在 svelte 中将值从子级传递给父级 - 绑定指令的直觉
【发布时间】:2021-10-09 08:30:41
【问题描述】:

这是一个超级简单的问题,但让我感到困扰的是我并没有完全理解这里发生的事情,因为我真的很喜欢苗条并想理解它。

这个很棒的视频是关于将数据从孩子传递给父母的: https://www.youtube.com/watch?v=lqvY_0gJf_I&list=PLoWoeRXn334kDuFrZqIqHrFCN71fSZE4X&index=1&t=1804s

他们的第一种方式是双向数据绑定。

它本质上就像这个 REPL https://svelte.dev/repl/24adfb0a93734265952e2870155aeb49?version=3.43.1

我只是不完全理解这里的数据流(一般来说很苗条)。如果我在渲染的输入字段中更改某些内容,这本质上意味着我正在更改子项中的某些内容,对吗?在这种情况下,我假设

  1. 发生的事情是孩子中的person 变量被用户更改了
  2. 由于它有 bind 指令,它会以某种方式将此数据从子代传递给父代
  3. 在父组件中,子组件的实例通过将p(在父组件中初始化的变量)的值传递给子组件的导出变量person进行初始化
  4. 不知何故通过修改子项中的值来更改父项中的变量p,并更新子项中的反应值(变量upper)。

现在我的问题是:为什么要更新这个变量p,对这个bind:<variable> 指令有没有直观的理解。我简直无法理解它。

我认为还有其他可能将数据从子级传递给父级(例如事件分派)。但是让我们从这个开始;)

//App.svelte
<script>
    import Box from './inp.svelte'
    let p = 'MyName'
    $: nameUpper = p.toUpperCase()
</script>

<Box bind:person={p} />

<p>Reactive value in the parent component: {nameUpper}</p>

<hr />
// inp.svelte
<script>
    export let person = 'valueInChild'
</script>

<input type="text" placeholder="put the name here" bind:value={person} />

【问题讨论】:

  • 如果您转到您发布的 REPL 并单击“JS 输出”选项卡,您可以看到您的示例编译成的 JS。您会发现 svelte 维护了一个 binding_callbacks 数组,稍后您将看到为各种绑定创建的回调。尝试按照此输出代码开始。
  • 非常感谢:) 这确实有帮助。虽然我在寻找更多“简单英语”的解释,但我想这个编译的 JS 代码会让我更加困惑。抱歉,我想这可能是有人可以提供的最好帮助。只是我刚刚从 JavaScript 开始;)

标签: javascript frontend reactive-programming bind svelte


【解决方案1】:

直观地理解你只需要想象孩子和父母都指的是同一个对象。

请注意,在您的示例中,如果您将以下内容添加到 App.svelte

<input type="text" placeholder="put the name here" bind:value={p} />

您会看到更新父项中的值也会显示子项。因此,理解bind: 指令的最佳方式是它不会复制,它确实是同一个对象/值/引用...在父子节点中。

【讨论】:

  • 非常感谢!在这种情况下,这个 object/value/reference 是变量 p 对吗?抱歉,我想我脑子里有一个转折? 我可以将bind:value={p} 理解为“在全球范围内更新变量p 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多