【发布时间】: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
我只是不完全理解这里的数据流(一般来说很苗条)。如果我在渲染的输入字段中更改某些内容,这本质上意味着我正在更改子项中的某些内容,对吗?在这种情况下,我假设
- 发生的事情是孩子中的
person变量被用户更改了 - 由于它有
bind指令,它会以某种方式将此数据从子代传递给父代 - 在父组件中,子组件的实例通过将
p(在父组件中初始化的变量)的值传递给子组件的导出变量person进行初始化 -
不知何故通过修改子项中的值来更改父项中的变量
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