所以我觉得这个标题已经足够解释了:我想动态地为我的整个应用程序设置主题.也许这意味着当我按下一个特定的按钮时,可以更改所有div的 colored颜色 ,或者当一个特定的用户登录时,可以更改整个webapp的 colored颜色 .

为了让大家了解我目前正在做的工作,我会说我已经构建了一个Vue.js应用程序使用了许多库,包括一个名为Element ui的应用程序,它已经内置了一个主题选项.问题是它是用scss编写的,我想在导航过程中更改所有可变 colored颜色 .我的项目看起来像这样:

<template>
  ... some HTML and components...
</template>

<script>
  ... some javascript ...
</script>

<style scoped>
  ... some style that is scoped to the current component only ...
</style>

我有很多这样的文件,所以为所有这些文件创建一个"全局函数"对我来说并不实用.此外,我在main.js分钟内只导入一次主scss文件.

我能做些什么来为我的网络应用创建一个dinamic主题吗?使用saas是个好主意吗?也许吧?

编辑

我觉得我解释得不够好,所以我想添加一个简单的例子.如果你访问Element页,你可以看到在右上角有一个 colored颜色 Select 器,当 colored颜色 改变时,它也会改变整个网站的重点 colored颜色 ,如按钮 colored颜色 、链接 colored颜色 等.

希望这有助于更好地理解

编辑

现在,我已经确定了一个非常糟糕的解决方案,我认为,这个解决方案优化得很糟糕.其 idea 是,当用户更改主题时,我只需创建一个新的css文件,并将其附加到当前文档中.

let sheet = document.createElement('style')
sheet.innerHTML = `*[class*="--primary"]{
                      background-color: ${colors[0]};
                    }
                    ...`;
document.body.appendChild(sheet);

我真的认为这是一个非常糟糕的解决方案,但现在我想不出任何其他可以在用户更改参数时正常工作的方法.我真的希望这个过程完美无缺:用户 Select 一种 colored颜色 ,整个应用程序只需更改为特定的 colored颜色 ,而不是预构建的theme.css.

FINAL 编辑

我终于找到了解决办法,请参考答案!

推荐答案

最后,在漫长的几天之后,我想出了一个解决方案,我认为它既易于实现,又非常轻量级.

CSS变量

在进行大量搜索之前,我甚至不知道这些变量的存在,而且它们似乎也不太常用.不管怎样,我希望这能帮助其他人找到我同样的答案:

<template
  <app-main></app-main>
  <app-sidebar></app-sidebar>
  ...
</template>

<style>
  :root{
    --primary-color: #C5C5C5!important;
    --secondary-color: #6C7478!important;
    --tertiary-color: #FFFFFF!important;
    --success-color: #80b855!important;
    --warning-color: #eaca44!important;
    --error-color: #ef4d4d!important;
  }

  /* Theming */
  header{
    background-color: var(--primary-color);
  }
  div{
    color: var(--tetriary-colory);
  }
  ...
  /*   END   */
</style>

<script>
  import axios from 'axios' /* all your imports etc. */

  export default{
    data(){
    },
    methods: {
      axios.post(`http://localhost:8080/foo`).then(function (response){
        let bodyStyles = document.body.style;
        bodyStyles.setProperty('--primary-color', response.colors[0]);
        bodyStyles.setProperty('--tertiary-color', response.colors[1]);
        ...
      }
    }
  }
</script>

如您所见,我只是初始化了一些有用的CSS variables,当我需要它们时(例如在那个api post调用中),我只是使用一个简单的bodyStyles.setProperty('propertyName')函数修改它们.

我真的很喜欢这种设置,因为我在我的登录页面中使用它,所以当用户成功登录时,我从数据库中加载他自己的 colored颜色 ,并像那样设置它们.

My website example

希望这能帮助别人!干杯

Vue.js相关问答推荐

Vuetify从同一方向旋转传送带下一个项目和上一个项目

具有VUE身份验证的Azure AD

使用V-TOOLTIP(实例化)使工具提示在V-文本字段中显示清晰的图标

Vue 3使用计算(computed)属性对象获取图像信息,在模板中呈现值时变为NaN

Vuetify 3 - NavBar 组件占据整个视口高度

在 onMounted 之前渲染的 Vue 模板

处理多张卡片中的按钮

VueJS3 - 在 for 循环中获取元素的句柄

vue router/:param 斜杠的参数

Bootstrap-vue b-table,标题中带有过滤器

Vuex - 如何跨不同选项卡持久存储更新?

VueJS 组件中的图像未加载

如何像 React 中的 {...props} 一样在 Vue 中解构 props?

等待来自 WDS 的更新信号

如何在 vue 3 中获取路由的参数?

如何在 Vue.js 中获取组件元素的 offsetHeight?

Vuetify Jest 未知自定义元素

VueJS错误避免直接改变props

如何使用 Vuetify 验证复选框组

Vue Router beforeRouteLeave 不会停止子组件