# TC/插件架构：我们是否应该对类拥有更多控制权？

**URL:** https://meta.discourse.org/t/tc-plugin-architecture-should-we-have-more-control-over-classes/311532
**Category:** Development
**Created:** [2024年六月11日 08:31 UTC](https://meta.discourse.org/t/tc-plugin-architecture-should-we-have-more-control-over-classes/311532 "2024-06-11T08:31:50Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2024年六月11日 08:31 UTC](https://meta.discourse.org/t/tc-plugin-architecture-should-we-have-more-control-over-classes/311532/1 "2024-06-11T08:31:50Z")

</div>

我最近将一个小的组件移到了 Locations Plugin 的 `.gjs` 上。它为网站和用户配置文件中的位置 outlet 添加了另一种形式的位置。同时，它隐藏了被插件代码取代的冗余位置信息。

我根据现代标准重新评估了之前编写的代码的价值。

现在，使用插件 outlet 固然很好，但我们是否也应该能够影响 outlet 上方包装 div 的父类？

因为目前，在这种情况下，我不得不操作 DOM 来隐藏其同级元素的冗余信息：

> <https://github.com/merefield/discourse-locations/blob/7ed1e813fd9bbe4ca36b42ebf02d0f450301382f/assets/javascripts/discourse/components/replace-location.gjs#L29>

我更希望通过显式修改组件而不是通过 DOM 操作来完成这个更改？

也许我在这里错过了什么。

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2024年六月11日 08:36 UTC](https://meta.discourse.org/t/tc-plugin-architecture-should-we-have-more-control-over-classes/311532/2 "2024-06-11T08:36:11Z")

</div>

您能大致勾勒一下您设想的类似 API 在核心和插件/主题方面是如何工作的吗？

我们有一个类似的东西是 `{{body-class \"blah\"}}` 助手。如果您将其放在任何出口中，它都会将“blah”类应用于 `<body>`。

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2024年六月11日 08:37 UTC](https://meta.discourse.org/t/tc-plugin-architecture-should-we-have-more-control-over-classes/311532/3 "2024-06-11T08:37:47Z")

</div>

另一种方法是使用更复杂的 CSS 选择器。例如，Discourse 支持的所有目标浏览器现在都支持 `:has()`

> **[:has() - CSS | MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/:has)**
>
> The functional :has() CSS pseudo-class represents an element if any of the relative selectors that are passed as an argument match at least one element when anchored against this element. This pseudo-class presents a way of selecting a parent element...

（但使用它时考虑性能很重要）

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2024年六月11日 08:38 UTC](https://meta.discourse.org/t/tc-plugin-architecture-should-we-have-more-control-over-classes/311532/4 "2024-06-11T08:38:44Z")

</div>

> [@david](#):
>
> `{{body-class \"blah\"}}` 辅助函数

啊，所以我漏掉了一个技巧 😅

是的，我更喜欢那个而不是 `has` 选项。

哦，这可能对我有帮助，非常有帮助，让我试试吧！

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2024年六月12日 12:28 UTC](https://meta.discourse.org/t/tc-plugin-architecture-should-we-have-more-control-over-classes/311532/5 "2024-06-12T12:28:35Z")

</div>

FYI，这似乎效果很好：

> <https://github.com/merefield/discourse-locations/pull/112>

非常感谢 David！

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [2024年七月12日 12:29 UTC](https://meta.discourse.org/t/tc-plugin-architecture-should-we-have-more-control-over-classes/311532/6 "2024-07-12T12:29:28Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
