Использование переменных sass в компоненте VueJS

У меня довольно простая проблема с компонентом 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";

variables.scss

$primary-color: #BA2731; //Red

person Nicklas Kevin Frank    schedule 23.02.2016    source источник


Ответы (5)


Импорт _variables.scss в каждый компонент кажется единственным решением, которое я нашел до сих пор (он должен работают, по этому вопросу).

<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.

person nils    schedule 24.02.2016
comment
Возникла проблема с @import, также присутствующим в скомпилированном CSS, несколько раз впоследствии. Это заставляет браузер загружать несуществующий файл. Как нам это остановить? @nils - person Nicklas Kevin Frank; 25.02.2016
comment
Включаете ли вы .scss или .css файл в оставшиеся @import утверждения? - person nils; 25.02.2016
comment
Я обнаружил проблему, это была всего одна <style>, для которой не задан язык: <style lang="sass">. Мое плохое, спасибо! - person Nicklas Kevin Frank; 25.02.2016
comment
Привет, когда я помещаю lang = sass в этот тег ‹style›, он терпит неудачу при компиляции с помощью gulp. Что мне нужно установить, прежде чем он заработает? Что я могу сделать, чтобы начать использовать sass внутри тегов стиля? - person Zalo; 31.08.2016
comment
Для всех, кто использует Bootstrap 4, вам нужно будет сначала импортировать _functions.scss, прежде чем импортировать _variables.scss. - person Chris; 05.04.2018
comment
@Zalo Может вы пишете SCSS (lang="scss") - person Fabian von Ellerts; 19.09.2019
comment
@nils, этот ответ все еще работает? Я пробовал, но после импорта все выдает ошибки и говорит, что это не разрешено. - person Nancy; 04.04.2020
comment
Имейте в виду, что если вы импортируете таким образом 100 компонентов, размер вашего файла увеличивается с каждым импортом. Лучше загрузить один раз глобально - person BobB; 12.05.2020
comment
@BobB, это правда, но, как упоминалось в ответе выше, он не будет работать, если вы просто импортируете его, например, в свой App.vue и используете его через дочерние элементы. Мне приходится импортировать его в каждый компонент, который я использую .... к сожалению - person JohnRambo; 13.08.2020

Предполагая, что вы используете 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";`
      }
    }
  }
};
person kevin    schedule 09.04.2019
comment
Это зависит от webpack, а не от vue-cli. - person Fabian von Ellerts; 19.09.2019

Я использую последнюю версию (v9.0.2 ) sass-loader, а prependData сейчас не вариант. Возможно, вы захотите попробовать эту конфигурацию в vue-config.js. Обратите внимание, что используется опция additionalData, поскольку опции prependData больше нет.

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

Для меня ни одно из вышеперечисленных решений не сработало (sass-loader 9.0.3), но это сработало:

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

Для своего проекта я использовал Vue CLI webpack, и вот решение, которое сработало для меня.

Я управляю всеми своими SCSS в файле App.vue. В каждом своем Component.vue я перестал использовать <style></style> и начал создавать отдельный 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>

Преимущество этой настройки заключается в том, что вы можете управлять всеми вашими стилями в одном месте, а также иметь возможность использовать все ваши загрузочные переменные и миксины.

Примечание.

Это еще один вариант использования переменных SASS во Vue.

Я пошел по этому пути, поскольку, когда я импортировал Boostrap SCSS во все свои компоненты, размер моего приложения продолжал расти. Увеличение незначительно, если я импортирую только переменные, но когда я импортирую весь Boostrap SCSS, увеличение становится значительным. Я делаю это, чтобы использовать миксины и расширить некоторые существующие стили.

person Gene Parcellano    schedule 05.07.2017
comment
Интересная идея, как бы вы добавили <style scoped> в эту установку, если бы это было возможно? - person Fractalf; 28.11.2017
comment
@Fractalf Эта установка позволит избежать использования scoped на самом деле. Я лично предпочитаю не использовать его, а вместо этого использую специфичность. У каждого из моих компонентов будет свое собственное имя класса, которое будет использоваться для инкапсуляции стилей, при этом сохраняя возможность использовать переменные и миксины. - person Gene Parcellano; 28.11.2017
comment
Это частично разрушает компонентную систему, на которой основана Vue! Зачем вам это нужно? Используйте загрузчик SASS webpack для импорта переменных в каждый файл, как предложил user2718281. - person Fabian von Ellerts; 19.09.2019
comment
@FabianvonEllerts Я согласен, но когда у вас есть настройка брендинга для крупной компании и есть масса переменных и миксинов, дублировать эти переменные и миксины в каждом компоненте не представлялось хорошей идеей. В то время, в 2017 году, я не мог найти лучшего способа сделать это, и мне не хотелось дублировать коды переменных и миксинов. В настоящее время может быть лучший способ. Я разместил его здесь как альтернативу для тех, кому придется иметь дело с миксинами и большими файлами переменных. - person Gene Parcellano; 19.09.2019
comment
@GeneParcellano Может быть, мне что-то здесь не хватает, но переменные и миксины не выводят код сами по себе, поэтому не имеет значения, как часто вы их импортируете. Но не могу поспорить с аргументом о времени :) - person Fabian von Ellerts; 19.09.2019
comment
@FabianvonEllerts Вы правы. Я думаю, единственное, что это решает, - это отсутствие необходимости импортировать переменные и миксины в каждый компонент. - person Gene Parcellano; 19.09.2019
comment
Это просто самое лучшее. Старая мода и прямолинейность, без дублирования и переменных проблем. Недурно @GeneParcellano - person Vixson; 22.04.2020