th-vue-material
Version:
Material Design for Vue.js
42 lines (35 loc) • 895 B
JavaScript
// Theme mixin
// Grab the closest ancestor component's `md-theme` attribute OR grab the
// `md-name` attribute from an `<md-theme>` component.
function getAncestorThemeName(component) {
if (!component) {
return null;
}
let name = component.mdTheme;
if (!name && component.$options._componentTag === 'md-theme') {
name = component.mdName;
}
return name || getAncestorThemeName(component.$parent);
}
export default {
props: {
mdTheme: String
},
computed: {
mdEffectiveTheme() {
return getAncestorThemeName(this) || this.$material.currentTheme;
},
themeClass() {
return this.$material.prefix + this.mdEffectiveTheme;
}
},
watch: {
mdTheme(value) {
this.$material.useTheme(value);
}
},
beforeMount() {
const localTheme = this.mdTheme;
this.$material.useTheme(localTheme ? localTheme : 'default');
}
};