我有一个Vue应用程序(一个包含多个子组件的无所不包的元素),我想在其中添加夜间模式。我希望对这种夜间模式进行集中管理,将相关样式应用于需要切换为夜间/白天模式的元素。
如果我有一个元素(该元素在DOM中作为已呈现的组件的一部分,因此不能直接用于父组件,因此无法通过v-bind
进行绑定)
<div class="night-day">hello</div>
和两个班级
.night {
background-color: black;
color: red
}
.day {
background-color: white;
color: black
}
是否可能使night-day
指向day
或night
(取决于某些条件)?
答案 0 :(得分:1)
我认为解决多个主题问题的最佳方法是在body
标签上有一个主题类修饰符,然后在CSS中相应地修改子元素。这是一个澄清问题的示例。
<body class="dark-theme">
<div class="container">
Content...
</div>
</body>
.container {
background-color: white;
color: black
}
.dark-theme .container {
background-color: black;
color: red
}
在这种情况下,在.dark-theme
上切换body
将在默认主题和黑暗主题之间切换。
答案 1 :(得分:1)
您可以在vue中使用v-bind:class
(Class binding)。
喜欢:
<div class="static" v-bind:class="{ night: isNight, day: !isNight }"></div>
答案 2 :(得分:1)
您可以考虑使用在JS代码(setinterval)中更改的CSS变量。基本上,您将拥有以下内容:
<div class="night-day">hello</div>
.night-day {
background-color: var(--bc,black);
color: var(--c,red)
}
在您的JS中,您将看到类似以下内容的
:var bc= ["black", "white"]
var c= ["red", "black"]
....
document.querySelector('.night-day').style.setProperty("--bc", bc[i]);
document.querySelector('.night-day').style.setProperty("--c", c[i]);
...
i
是可根据您的条件更改的索引:
答案 3 :(得分:1)
您可以使用class binding将CSS类绑定到由事件处理程序控制的属性。
// MyComponent.vue
<template>
<div class="daynightdemo" :class="{ night: isNight }">
...
</div>
</template>
<script>
import { eventBus } from '@/eventBus'
export default {
data() {
return {
isNight: false
};
},
mounted() {
this.setNightDay = value => {
this.isNight = value === "night";
};
eventBus.$on("nightDay", this.setNightDay);
},
beforeDestroy() {
eventBus.$off("nightDay", this.setNightDay);
}
}
</script>
您提到事件总线定期从setInterval
调用。在此示例中,呼叫看起来像这样:
// App.vue
export default {
mounted() {
let isNight = true;
setInterval(() => {
eventBus.$emit("nightDay", isNight ? "night" : "day");
isNight = !isNight;
}, LONG_INTERVAL);
}
};
使用Vuex,样板将有所简化,从而无需进行事件回调注册和注销:
// MyComponent.vue
<template>
<div class="daynightdemo" :class="{ night: $store.state.isNight }">
<h1>isNight: {{ $store.state.isNight }}</h1>
</div>
</template>
// App.vue
export default {
mounted() {
setInterval(() => {
this.$store.state.isNight = !this.$store.state.isNight;
}, 2000);
}
}