App.vue:

<style lang="stylus">

@css {
html {
  --primary: blue;
  --bg-image: url(https://i.loli.net/2020/10/14/gQq96O4DxRVXSKP.jpg);
}
html[data-theme='green'] {
 --primary: green;
  --bg-image: url(https://i.loli.net/2020/10/14/KdraGmYFC8Wpsz5.jpg);
}
html[data-theme='pink'] {
 --primary: pink;
 --bg-image: url(https://i.loli.net/2020/10/14/O4wUuGvM3Cdjl16.jpg);
}
}

</style>

组件中使用主题和切换主题:

<template>
  <view class="content">
    <view class="title"><text>hello world</text></view>
    <button type="default" @click="changeTheme(1)">theme blue</button>
    <button type="default" @click="changeTheme(2)">theme green</button>
    <button type="default" @click="changeTheme(3)">theme pink</button>
  </view>
</template>

<script>
export default {
  data() {
    return {};
  },
  methods: {
    changeTheme(id) {
      if (id == 1) {
        document.documentElement.removeAttribute('data-theme');
      } else if (id == 2) {
        document.documentElement.setAttribute('data-theme', 'green');
      } else if (id == 3) {
        document.documentElement.setAttribute('data-theme', 'pink');
      }
    }
  }
};
</script>

<style lang="stylus">
.content
  min-height 100vh
  background-image unquote('var(--bg-image)')
.title
  color unquote('var(--primary)')
</style>

或者这样

App.vue:

<style lang="stylus">
@css {
.theme {
  --primary: red;
}
.theme[data-theme='green'] {
 --primary: green;
}
.theme[data-theme='pink'] {
 --primary: pink;
}
}
</style>

组件中使用

<template>
  <view class="theme content" :data-theme="theme">
    <view class="title"><text>hello world</text></view>
    <button type="default" @click="changeTheme(1)">theme blue</button>
    <button type="default" @click="changeTheme(2)">theme green</button>
    <button type="default" @click="changeTheme(3)">theme pink</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      theme: ''
    };
  },
  methods: {
    changeTheme(id) {
      if (id == 1) {
        this.theme = '';
      } else if (id == 2) {
        this.theme = 'green';
      } else if (id == 3) {
        this.theme = 'pink';
      }
    }
  }
};
</script>

<style lang="stylus" scoped>
.title
  color unquote('var(--primary)')
</style>

See also: