【问题标题】:Svelte reactivity - Class member change doesn't reflect on UISvelte 反应性 - 类成员更改不会反映在 UI 上
【发布时间】:2020-12-16 14:48:14
【问题描述】:

我目前正在创建一个表格管理器 Web 组件,它由几个不同的组件组成,例如 data-tablesearch-bar 等。我单独管理它,因为在某些情况下不使用表格或搜索栏,但是当它们一起使用时,它们使用相同的类作为输入。搜索栏调用类的搜索方法之一,并相应地过滤数据,但是数据属性在类中发生了变化,只有当我执行一些操作来刷新时它才会反映在 UI 上(例如检查复选框)。

所以我通过组件A 中的类方法调用来更改类的一个成员,我希望它反映在组件B 中。

export let config: TableConfig = new TableConfig();
$: setConfig(config);

...

// Search function:
config.quickSearch(quickSearchValue);

我遍历config.data 以显示一些数据。搜索后,data 成员更改,如果我使用setInterval 将配置记录到table 组件中,它会显示更改后的data,但 UI 不会刷新。

也许我的方法是完全错误的,但这就是我在 Angular 中的做法,但它有很多不必要的依赖关系,所以现在我正试图摆脱它。所以我的主要目标是使用它任何地方,例如 Svelte、Angular、VanillaJS 等。

编辑:

REPL 示例:https://svelte.dev/repl/311538f2cf52484f8d0ac3aeae7540ea?version=3.31.0

【问题讨论】:

  • 如果你说的是 Svelte 组件,那么标签 web-componentcustom-elements 不适用,它们适用于 W3C Web 组件。
  • 很难从你的问题中看出发生了什么。您能否显示更多出现问题的组件代码?如果你能在Svelte REPL 上做一个例子也会很有帮助
  • @Danny'365CSI'Engelman 我正在用 svelte 创建 Web 组件,正如我所说我在 Angular、Svelte 和 VanillaJS 中使用它们,我已经制作了两个这样的包,但这将是大一点的
  • @GeoffRich 这是一个 repl 示例,我在ComponentA 中放了一个setInterval 以记录单击Filter 按钮后配置已更改:svelte.dev/repl/311538f2cf52484f8d0ac3aeae7540ea?version=3.31.0

标签: javascript web-component svelte custom-element


【解决方案1】:

UI 没有变化,因为据 Svelte 所知,数据没有变化。如果你想保持这种结构,你必须为你的班级添加一个订阅系统。

然而,Svelte 有一个更好的跨组件共享数据的方法,那就是stores。在您的情况下,您可以做的是创建一个自定义存储 enter link description here,它封装了您曾经在一个类中拥有的逻辑。这样一来,您就可以简单地在一个组件中订阅此存储,并在另一个组件中触发更新,从而受益于 Svelte 的响应性。

【讨论】:

  • 我对这个特定示例的商店的主要问题是 ComponentAComponentB 将是两个独立的 Web 组件(一个用于过滤,一个用于数据可视化),我希望它们使用相同的数据。 (而且我不想局限于苗条,我想在任何地方使用它,我不知道在这种情况下商店是否是一个好的解决方案?)
  • 如果我会做类似 fullcalendar (fullcalendar.io) 的事情,我可以使用商店,即它创建一个新的 Calendar 对象并将 div 作为参数传递,这将呈现日历:` var calendarEl = document.getElementById('calendar'); var calendar = new Calendar(calendarEl, { plugins: [ dayGridPlugin ] }); calendar.render();` 如果需要,我也可以传递组件 A 和组件 B,但我不知道如何让它像这样实现..
  • 我认为上下文 (svelte.dev/tutorial/context-api) 比此处的存储更有意义,因为其想法是在数据表/搜索栏的特定实例之间共享数据。
  • 是的,上下文很好,但数据表不包含搜索组件,关键是我可以将搜索添加到对话框、下拉菜单或上方(或下方)数据表。所以不会有任何父子关系(如果我理解正确,上下文 API 应该像那样工作?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2019-11-19
  • 2012-03-22
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多