【问题标题】:Using sass variables in a VueJS component在 VueJS 组件中使用 sass 变量
【发布时间】:2016-06-05 11:27:09
【问题描述】:

我遇到了一个需要使用变量的 VueJS 组件的相当简单的问题。问题在于让 sass 在组件内注册变量。

我尝试导入包含我的变量的_variables.scss 文件,但没有成功。在这一点上,非常感谢任何指导,或者如果组件有其他方式继承样式。

MyComponent.vue

<template>
    <div class="my-color"></div>
</template>
<style lang="sass">
    .my-color {
        color: $primary-color;
    }
</style>
<script>
    export default{
        data(){
            return {}
        }
    }
</script>

Gulpfile.js

var elixir = require('laravel-elixir');
require('laravel-elixir-vueify');

elixir(function(mix) {
    mix.browserify('main.js');
    mix.sass('app.scss');
});

app.scss

@import "node_modules/bootstrap-sass/assets/stylesheets/bootstrap";
@import "modules/variables";

变量.scss

$primary-color: #BA2731; //Red

【问题讨论】:

    标签: laravel sass vue.js laravel-elixir


    【解决方案1】:

    在每个组件中导入_variables.scss 似乎是我迄今为止找到的唯一解决方案 (it should work, according to this issue)。

    <template>
        <div class="my-color"></div>
    </template>
    <style lang="sass">
        @import 'path/to/your/_variable.scss'; // Using this should get you the variables
        .my-color {
            color: $primary-color;
        }
    </style>
    <script>
        export default{
            data(){
                return {}
            }
        }
    </script>
    

    由于您只包含变量,因此这应该不是问题。

    但正如问题中提到的,请注意:您应该只在每个组件中包含抽象实体(变量、扩展、混合),而不是具体的 CSS 规则。

    【讨论】:

    • 在编译后的 CSS 中多次出现@import 的问题。这会触发浏览器加载不存在的文件。我们如何阻止这种情况? @尼尔斯
    • 您是否在保持存在的@import 语句中包含.scss.css 文件?
    • 我发现了问题,只是一个&lt;style&gt; 没有设置语言:&lt;style lang="sass"&gt;。我的错,谢谢!
    • 您好,当我将 lang=sass 放入该
    • 对于使用 Bootstrap 4 的任何人,您需要先导入 _functions.scss,然后再导入 _variables.scss
    【解决方案2】:

    对于我的项目,我使用了Vue CLI webpack,这是一个适合我的解决方案。

    我在 App.vue 文件中管理我的所有 SCSS。在我的每个Component.vue 中,我停止使用&lt;style&gt;&lt;/style&gt; 并开始创建一个单独的component.scss


    所以我的src 文件夹看起来像:

     /src
         /assets
         /components
             /compA
                 CompA.vue
                 compA.scss
             /compB
                 CompB.vue
                 compB.scss
        App.vue
        main.js
    

    我的App.vue 看起来像

    <template> ... </template>
    
    <script> ... </script>
    
    <style lang="less">
        //Bootstrap
        @import "../node_modules/bootstrap-sass/assets/stylesheets/bootstrap";
    
        //Components
        @import "components/compA.scss";
        @import "components/compB.scss";
    </style>
    

    此设置的优点是可以在一个位置管理所有样式,还可以使用所有引导变量和 mixin。

    注意:

    这只是在 Vue 中使用 SASS 变量的另一种选择。

    我走这条路是因为当我在所有组件中导入 Boostrap SCSS 时,我的应用程序的大小一直在增长。如果我只导入变量,则增加可以忽略不计,但是当我导入整个 Boostrap SCSS 时,增加变得显着。我这样做是为了可以使用 mixins 并扩展一些现有的样式。

    【讨论】:

    • 有趣的想法,如果可能的话,你会如何将&lt;style scoped&gt; 放入这个设置中?
    • @Fractalf 这个设置实际上可以避免使用scoped。我个人不喜欢使用它,而是使用特异性。我的每个组件都有自己特定的类名,用于封装样式,同时仍然可以使用变量和 mixins。
    • 这部分破坏了 Vue 所基于的基于组件的系统!你为什么想做这个?按照 user2718281 的建议,使用 webpack SASS 加载器将变量导入每个文件。
    • @FabianvonEllerts 我同意,但是当您为一家大公司设置品牌并且有大量变量和 mixin 时,在每个文件中复制这些变量和 mixins 似乎不是一个好主意零件。当时,在 2017 年,我找不到更好的方法来做到这一点,我不希望变量和 mixin 的重复代码。目前,可能有更好的方法。我将它发布在这里作为其他必须处理 mixins 和大型变量文件的替代方案。
    • 这是最好的。旧时尚和直截了当,没有重复和变量问题。竖起大拇指@GeneParcellano
    【解决方案3】:

    假设你使用的是vue-cli,试试这个。

    如果你还没有安装 sass 加载器:

    npm install -D sass-loader node-sass
    

    然后在vue.config.js:

    const path = require('path');
    
    module.exports = {
      css: {
        loaderOptions: {
          sass: {
            data: `@import "@/pathto/variables.scss";`
          }
        }
      }
    };
    

    在您的组件中:

    <style lang="sass">
        .my-color {
            color: $primary-color;
        }
    </style>
    

    来源:

    编辑:

    从 sass-loader 8 开始,data 必须是 prependData(感谢 @ben-y 指出这一点):

    const path = require('path');
    
    module.exports = {
      css: {
        loaderOptions: {
          sass: {
            prependData: `@import "@/pathto/variables.scss";`
          }
        }
      }
    };
    

    【讨论】:

    • 这取决于 webpack 而不是 vue-cli。
    【解决方案4】:

    我正在使用 sass-loader 的最新版本 (v9.0.2),而 prependData 现在似乎不是一个选项。您可能想在vue-config.js 中尝试此配置。请注意 additionalData 选项正在使用,因为不再有 prependData 选项。

    module.exports = {
      css: {
        loaderOptions: {
          sass: {
            additionalData: '@import "@/pathto/variables.scss";'
          }
        }
      }
    }
    

    【讨论】:

      【解决方案5】:

      对我来说,上述解决方案都不起作用(sass-loader 9.0.3),但确实如此:

      module.exports = {
        css: {
          loaderOptions: {
            sass: {
              sassOptions: {
                prependData: `@import "@/scss/variables.scss";`
              }
            },
          },
        },
      };
      

      【讨论】:

        猜你喜欢
        • 2021-06-30
        • 2018-04-25
        • 1970-01-01
        • 2017-02-27
        • 2021-06-02
        • 2017-04-09
        • 2020-06-20
        • 1970-01-01
        • 2012-04-04
        相关资源
        最近更新 更多