扩展JSS样式类,而不是覆盖它

时间:2018-11-14 11:15:06

标签: javascript reactjs jss

在我的React应用程序中,我使用React JSS进行样式设计。假设我有这两个文件(跳过导入和另一个不有趣的东西)。

这是App.js:

const styles = {
  root: {
    backgroundColor: '#ffffff',
  },
  header: {
    backgroundColor: '#ff0000',
  }
};

class App extends Component {
  render() {
    const { classes } = this.props;
    return (
        <div className={classes.root}>
          <Header classes={{ root: classes.header }}/>
        </div>
    );
  }
}

export default withStyles(styles)(App);

这是Header.js:

const styles = theme => ({
    root: {
        backgroundColor: '#0000ff',
        padding: '1em',
    },
});

class Header extends Component {
    render() {
        const { classes } = this.props;
        return (
            <header className={classes.root}>
                Hello header
            </header>
        );
    }
}

export default withStyles(styles)(Header);

我想拥有的是“覆盖”标题根组件的样式,而不必完全覆盖。我可以做两件事之一:

  1. 使用<Header className={classes.header}/>,这会导致header元素具有类App-root-0-1-2,这意味着背景是带有填充的蓝色;

  2. 使用<Header classes={{ root: classes.header }}/>(如上所述),这会导致header元素具有类App-header-0-1-2,这意味着无需填充即可读取背景。

似乎我只能具有由组件定义的样式,也不能只有父级定义的样式来覆盖它。但是,我想通过父级传递的内部样式来扩展内部样式-当然,在冲突中父级优先。在这种情况下,我希望背景带有红色填充。

我该如何实现?不可能吗-我需要将可编辑样式作为属性传递吗?

1 个答案:

答案 0 :(得分:1)

您可以提供一个外部类名,并使用类名(https://github.com/JedWatson/classnames)(或仅内联它们)来有条件地呈现此类名:

import classNames from "classnames";

const styles = theme => ({
    root: {
        backgroundColor: '#0000ff',
        padding: '1em',
    },
});

class Header extends Component {
    render() {
        const { classes, className } = this.props;
        return (
            <header 
              className={classNames({ 
                [classes.root]: true, 
                [className]: className 
              })}>
                Hello header
            </header>
        );
    }
}

export default withStyles(styles)(Header);

然后使用它:

<Header className={classes.myParentClass} />

这将导致一个类名,例如Header-root-0-1-2 App-myParentClass-0-4-3