Mithril.js多个css类

时间:2016-04-09 17:26:03

标签: mithril.js

我是mithril.js的新人。我有一个div,如果ctrl.invalid()== true,我想添加类“invalid”,如果ctrl.hidden()== true,我想添加“hidden”。

如果我使用m('div', {class: ctrl.invalid() ? 'invalid' : '', class: ctrl.hidden()? 'hidden' : ''}),他们会互相覆盖。

我可以使用m('div', {class: [ctrl.invalid()?'invalid':'', ctrl.focused()?'focused':''].join(' ')}),它会起作用,但看起来很麻烦。

这有一个优雅的解决方案吗?感谢。

2 个答案:

答案 0 :(得分:4)

我建议您使用classnames - 一个简单的实用工具。您可以以一种很好的方式定义您的类,它将为您合并所有内容。在你的情况下,它将是:

const myMergedClasses = classNames({
    invalid: ctrl.invalid(), 
    focused: ctrl.focused()
});
m('div', { class: myMergedClasses })

美丽?!

答案 1 :(得分:0)

您可以向Mithril组件添加辅助方法:

const myComponent = {
    css() {
        // Add some logic

        return 'class1 class2';
    },
    view() {
        return m('div', { class: this.css() });
    },
};

或者到控制器:

const ctrl = {
    css() {
        // Add some logic

        return 'class3';
    },
};

const myComponent = {
    view() {
        return m('div', { class: ctrl.css() });
    },
};

选择更适合您案例的人。

你也可以使用classnames实用程序,正如Ross Khanas在他的回答中所建议的那样:

const myComponent = {
    css() {
        return classNames({
            invalid: ctrl.invalid(), 
            focused: ctrl.focused(),
        });
    },
    view() {
        return m('div', { class: this.css() });
    },
};

或者:

const ctrl = {
    css() {
        return classNames({
            invalid: this.invalid(), 
            focused: this.focused(),
        });
    },
    invalid() { /* ... */ },
    focused() { /* ... */ },
};

const myComponent = {
    view() {
        return m('div', { class: ctrl.css() });
    },
};