在子组件更新时强制刷新 Alpinejs 模板

问题描述 投票:0回答:1

我在 Laravel/Livewire 应用程序上遇到问题,在子组件更新时获取 AlpineJS x-if 模板以重新渲染。为了简单起见,我将从广义上解释这种情况,因为我觉得问题在于我的方法而不是执行。这是一般设置:

左侧菜单

  • 组1
  • 项目1
  • 项目2
  • 项目3...

右侧菜单

  • [模板 x-if=[$store.displayMode]]
  • FIELD1($store.items[$store.activeIndex])
  • 字段2
  • 字段3...

用户可以在左侧菜单中选择[组]或[项目],相应的字段将显示在右侧菜单中。因为 GROUP 和 ITEM 字段的布局不同,所以我使用 Alpine 的 $store 对象中保存的 displayMode 变量来确定在右侧菜单中显示的模式。我还使用 activeIndex 变量来跟踪正在选择的 ITEM 并访问 [ITEMS] 数组中的信息,该数组也保存在 $store 中。

此设置在 displayMode 变量更改时起作用(例如,组→项目)。但是,如果我尝试从一个项目单击到另一个项目,右侧菜单不会刷新。例如,如果我先选择ITEM1,然后单击ITEM2,右侧菜单仍然会显示与ITEM1相关的信息。我怀疑问题是因为 x-if 正在评估的条件没有改变,Alpine 没有刷新模板的子组件。

到目前为止我找到的唯一解决方案是每次选择一个 ITEM 时将 displayMode 变量短暂更改为 null,设置 5 毫秒超时,然后再次将其更改回 ITEM。这种黑客方法可以完成工作,但它也会导致右侧菜单中出现微小的闪烁,并且可能会在未来产生问题。这也有可能是由 Livewire 引起的,但我目前没有使用任何 Livewire 功能,所以这似乎不太可能。

我意识到这都是相当抽象的,但我想知道是否有更好的方法来处理 Alpine 的这种特殊情况。任何建议或更正都非常感谢!

javascript alpine.js
1个回答
0
投票

编辑-解决方案

经过更多挖掘,我找到了问题的原因。事实证明,我已将模板内的 $store 引用设置为 x-data 对象的一部分。像这样的东西:

x-data="{group: $store.model.groups[$store.model.activeGroup]}"

然后我继续在模板中引用“组”,主要是出于方便。但是,一旦我删除了 x-data 'group' 并在整个模板中简单地使用 '$store.model.groups[$store.model.activeGroup]' 引用来引用这些组,它就会按预期工作。对于物品也是如此。

然而,在大多数情况下,另一个的工作方式很奇怪。对alpinejs有更深入了解的人知道为什么会这样吗?

© www.soinside.com 2019 - 2024. All rights reserved.