【问题标题】:svelte: how can a component modify a variable/object on its parent?svelte:组件如何修改其父级上的变量/对象?
【发布时间】:2020-07-10 19:51:00
【问题描述】:

我有一个包含用户对象和登录组件的主应用程序

<script>
let user = {}
</script>

hello {user.username}
<login user={user} />

在登录组件中,我调用 ajax 并接收到一些数据,例如:

user = {id:1, username:"john"}

然后我如何“通知”主应用程序我已经更新了用户,以便它显示你好,约翰

现在,我发送一个事件

import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();

有没有更好的方法来实现这一点?

【问题讨论】:

  • 为什么不创建一个登录svelte store来观察和共享登录状态。

标签: svelte svelte-3 svelte-component


【解决方案1】:

在 Svelte 中,您可以将值绑定到组件,这样当子组件更新时,它也会更新父组件。

你只需要改变

<login user={user} />

<login bind:user={user} />

这是demo

【讨论】:

    【解决方案2】:

    Svelte 通过 bind 关键字进行 2 路绑定。您可能在绑定表单输入时看到过它,它在您自己的父子关系中的工作方式相同。

    它的外观如下:&lt;Login bind:user={user} /&gt; 或名称相同时的简写:&lt;Login bind:user /&gt;

    您所要做的就是在子(登录)组件中定义一个道具,当您更新它时,父值会发生变化。

    Here is a REPL to see it in action


    如果你有兴趣,我会指出一些额外的东西:

    1. 组件通常以大写字母开头。这允许编译器将它们与常规 HTML 组件区分开来。谁知道,哪天可能会有一个名为&lt;login&gt;的HTML组件! ?
    2. 虽然上述策略适用于用户登录,但处理此问题的典型方法是使用 stores 的概念。

    【讨论】:

      【解决方案3】:

      我认为有3种方法可以解决这个问题:

      本地商店:

      调度:

      • 正如你目前所做的那样 ;)

      双向绑定:

      【讨论】:

      • 你认为哪一个是“最干净的”?
      • 我会实施一个存储解决方案。考虑 OIDC 令牌流或会话相关信息这可能有用吗?
      • 如果没有必要,调度对我来说很好。提到双向绑定对于频繁更改的值有好处,每个会话只使用一次登录过程。
      • 否则:代码越少越好! -> 双向绑定???这取决于;) 最好的
      猜你喜欢
      • 1970-01-01
      • 2021-05-26
      • 2018-04-21
      • 1970-01-01
      • 2016-05-10
      • 2019-01-02
      • 1970-01-01
      • 2012-02-06
      • 2017-05-30
      相关资源
      最近更新 更多