如何删除未安装组件的组件样式?

How to remove component styles for unmouned components?

问题:卸载组件时组件样式保留。

在这个 example 中,我卸载(并销毁)Unused 组件,但该组件的样式仍然影响页面。

背景:我正在尝试为 SPA 调整现有的 vue 代码库(使用 vue-router)。当更改组件时会发生此问题,但先前组件的样式会影响新组件。 我想在不改变样式的情况下解决它(例如创建包装器)。

目前我只看到一种可能的方法:改变样式。 但是我想要 this 之类的东西(我还没有测试过)。 组件安装时添加样式,卸载时删除样式。

样式加载器版本 v1.0.0 的更新答案

他们添加了特殊选项 injectType:

injectType

Type: String Default: styleTag

Allows to setup how styles will be injected into the DOM.

Possible values:

styleTag singletonStyleTag lazyStyleTag lazySingletonStyleTag linkTag

v1.0.0 发布前的原始答案

最后我开始对特定文件使用 style-loader/useable 而不是 vue-style-loader。 我为 scss 加载程序添加了额外的一条规则 ('useable-styles')。这是我的 webpack 配置的一部分:

export default {
  module: {
    scss: {
      test: /\.scss$/,
      oneOf: {
        'useable-styles': {
          test: /AppHomepage\.scss$/,// pattern for useable styles
          use: {
            'style-loader': {
              loader: 'style-loader/useable',
              options: {
                sourceMap: false,
              },
            },
            'css-loader': { /*...*/ },
            'resolve-url-loader': { /*...*/},
            'sass-loader': { /*...*/},
          },
        },
        'vue-modules': { /*...*/},
        vue: { /*...*/},
        normal: { /*...*/},
      },
    },
  },
};

然后我在JS中加载样式,像这样:

import styles from './AppHomepage.scss';

// @vue/component
export default {
  name: 'app-homepage',
  beforeCreate() {
    styles.use();
  },
  destroyed() {
    styles.unuse();
  },
};

并在需要时调用 styles.use();styles.unuse();

这不是理想的解决方案,但它可以作为临时解决方案并等待重构。

已接受的答案现已过时。使用新的样式加载器 API,像这样通过 injectType:

{   
  test: /\.theme\.(sa|sc)ss$/,
  use: [
    {
      loader: 'style-loader',
      options: {attributes: {id: 'theme-sheet'}, injectType: 'lazySingletonStyleTag'}
    },
    {loader: 'css-loader'},
    {loader: 'sass-loader'}
  ]
}

文档:https://github.com/webpack-contrib/style-loader#lazysingletonstyletag

style.use(); / style.unuse() 保持不变。