有没有办法用它的内容替换我在 dom 中的组件?

Posted

技术标签:

【中文标题】有没有办法用它的内容替换我在 dom 中的组件?【英文标题】:Is there a way to replace my component in dom with its contents? 【发布时间】:2019-07-22 11:31:16 【问题描述】:

我目前正在使用名为 JQXDocking 的第 3 方实用程序。它是一个非常简单直接的设计。尽管我认为页面会变得庞大,但在更深入地研究它后,我将所有停靠的小部件抽象为自定义组件。

jqxDocking 概念的问题在于它正在寻找 div 等。我破坏了设计,因为它不是直接的子 div,而是我的自定义组件

// What it was
<jqxDocking>
<div><div>title</div><div>content</div></div>
</jqxDocking>

// What it is now.
<jqxDocking>
  <my-component></my-component>
</jqxDocking>

inside my-component has the proper dom structure that jqxDocking is looking for.  So i was hoping for a way to replace in markup correctly such that the component works.

由于 DOM 中有这个新层,父组件无法正确解释我的代码。

有没有办法创建自定义组件但替换为模板 html

所以,如果我用 div 包装它,它将获得部分实现

<jqxDocking>
  <div class=column">
    <div class="card">
      <my-component></my-component>
    </div>
  </div>
</jqxDocking>

但它的标题是未定义的,因为它不理解我的组件中的标题。

所以我从组件中提取它

<jqxDocking>
  <div class="column">
    <div class="card">
      <div>Title</div>
      <my-component></my-component>
    </div>
  </div>
</jqxDocking>

所以我可以这样做,但它看起来并不那么好。我可能只需要在标记中将其模板化,而不是组件化。

【问题讨论】:

如果将&lt;my-component&gt;&lt;/my-component&gt; 包裹在div 中会发生什么? 我最初尝试过。它使它像小部件一样可拖放,但它不了解在我的组件中定义的卡片标题。所以如果我继续抽象它最终会变成&lt;div&gt;&lt;div&gt;title&lt;/div&gt;&lt;my-component&gt;&lt;/my-component&gt;&lt;/div&gt;,但是正如你所看到的,因为所有东西都有一个标题,并且所有东西都用一个 div 封装,我认为所有这些都可以是抽象的。 【参考方案1】:

为避免在输出 HTML 中出现 my-component 元素,您可以将组件选择器定义为属性选择器:

selector: "[my-component]"

并在模板中的容器元素上设置该属性:

<jqxDocking my-component></jqxDocking>

请参阅this stackblitz 以获取演示。

【讨论】:

如何处理Input() 属性?它们会像平常一样应用于 jqxDocking,还是在您的示例中应用于 div? 可以在容器组件元素中绑定它们,如the updated stackblitz所示。 欧瑞卡。我将对其进行更多测试并清除它,但我认为这就是我正在寻找的答案。 这确实解决了基本问题。我能看到的唯一产生打嗝的是样式没有渗入组件。这是一件好事,但是父样式正在做诸如“jqx-window-content-dark”之类的事情,然后它下面的所有子div都被风格化了。由于从技术上讲内容仍然是它自己的组件,CSS 将无法解析。但这似乎是一个不同的问题 如果你对jqx CSS有控制权,可以在样式规则前加::ng-deep,影响子组件元素(见this answer)。

以上是关于有没有办法用它的内容替换我在 dom 中的组件?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在测试 React 组件之前模拟 DOM?

角度 1.5 中的组件样式?

使用slot分发内容

使用slot分发内容 作用域插槽

Vue3:如何避免 Vitejs 在挂载应用程序时擦除/替换所有 DOM 内容?

Java Regex替换为捕获组