组件应答器的 CSS 未加载到特定组件内

Posted

技术标签:

【中文标题】组件应答器的 CSS 未加载到特定组件内【英文标题】:CSS of component balise doesn't load inside spefic component 【发布时间】:2021-12-26 03:07:50 【问题描述】:

我在加载我的 bloc 组件的 css 时遇到问题。

网页组件允许创建 iframe 并在其中轻松设置一些内容。

它正确加载了模板和脚本标签,但不是 css(它不加载)。

有时有效,但大多数时候无效。

我以为是组件加载有问题,但不是。

如果我在渲染“网页”组件之前或之后加载组件:它不会加载。

我尝试过将自动导入为 true 和 after 为 false,但它没有解决任何问题。

我有 2 个组件:网页和块。

bloc.vue

<template>
  <div class="bloc">
    <p>Le texte</p>
  </div>
</template>

<style>
.bloc 
  background-color: blue;
  padding: 20px;

</style>

webpage.vue

<script>
import Vue from "vue";
export default 
  props: 
    css: 
      type: String,
      required: false,
    ,
  ,
  data() 
    return 
      load: false,
    ;
  ,
  render(h) 
    return h("iframe", 
      on:  load: this.renderChildren ,
    );
  ,
  beforeUpdate() 
    //freezing to prevent unnessessary Reactifiation of vNodes
    this.iApp.children = Object.freeze(this.$slots.default);
  ,
  mounted() 
    if (!this.load) this.renderChildren();
  ,
  methods: 
    // https://forum.vuejs.org/t/render-inside-iframe/6419/12
    renderChildren() 
      this.load = true;
      const children = this.$slots.default;
      const head = this.$el.contentDocument.head;
      const body = this.$el.contentDocument.body;

      let style = this.$el.contentDocument.createElement("style");
      style.textContent += this.$props.css;
      head.appendChild(style);

      const iApp = new Vue(
        name: "iApp",
        // freezing to prevent unnessessary Reactifiation of vNodes
        data:  children: Object.freeze(children) ,
        render(h) 
          return h("body", this.children);
        ,
      );

      this.iApp = iApp; // cache instance for later updates
      this.iApp.$mount(body); // mount into iframe
    ,
  ,
;
</script>

app.vue

<template>
  <Webpage>
    <component :is="name"></component>
  </Webpage>
</template>

<script>
import bloc from "@/components/Bloc";
import Webpage from "@/components/Webpage";
export default 
  components: 
    bloc,
    Webpage,
  ,
  computed: 
    name() 
      return "bloc";
    ,
  ,
;
</script>

你知道这可能来自哪里吗?

密码框:https://codesandbox.io/s/error-style-component-import-1t1hs?file=/pages/index.vue

谢谢。

【问题讨论】:

【参考方案1】:

可能Webpage 组件会覆盖它。 尝试将您的样式移动到索引和&lt;Webpage class="bloc"&gt;

【讨论】:

我不会在网页组件上设置bloc组件的样式。我希望他的风格适用于正确的组件:bloc。

以上是关于组件应答器的 CSS 未加载到特定组件内的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义 TS 装饰器的组件方法中未定义角服务

使用 webpack 从 MDL 加载特定组件

没有 Vue 加载器的 Vue 2 组件样式

无法从组件中的资产加载 css

为啥 Angular 组件未在浏览器后退/前进导航上加载?

组件范围内的 CSS 选择器最佳实践 [关闭]