【问题标题】:Styling material UI components样式化材质 UI 组件
【发布时间】:2018-10-08 23:48:21
【问题描述】:

不是真的问题,但我不满意。我正在使用react + typescript + css modules + https://material-ui-next.com/。问题是,当我需要设置材质 ui 组件的样式时,我必须经常使用 !important。问题是是否有办法在没有important 的情况下创建样式。我创建了一个示例项目来重现问题https://github.com/halkar/test-css-modules

【问题讨论】:

标签: css reactjs typescript material-ui css-modules


【解决方案1】:

material-ui 公开了许多用于样式的组件。有两种方法可以做到这一点。

全局应用样式

您可以全局设置组件的样式并将其应用于主题。这方面的一个例子是这样的(复制自文档http://www.material-ui.com/#/customization/themes):

import React from 'react';
import {cyan500} from 'material-ui/styles/colors';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import getMuiTheme from 'material-ui/styles/getMuiTheme';
import AppBar from 'material-ui/AppBar';

// This replaces the textColor value on the palette
// and then update the keys for each component that depends on it.
// More on Colors: http://www.material-ui.com/#/customization/colors
const muiTheme = getMuiTheme({
  palette: {
    textColor: cyan500,
  },
  appBar: {
    height: 50,
  },
});

class Main extends React.Component {
  render() {
    // MuiThemeProvider takes the theme as a property and passed it down the hierarchy
    // using React's context feature.
    return (
      <MuiThemeProvider muiTheme={muiTheme}>
        <AppBar title="My AppBar" />
      </MuiThemeProvider>
    );
  }
}

export default Main;

正如您在此处看到的,appBar 组件的高度为 50 像素,这意味着每次您在应用 muiTheme 的树的下方将 appbar 组件添加到应用程序时,它的高度都会为 50 像素。这是您可以为每个组件应用的所有样式的列表https://github.com/callemall/material-ui/blob/master/src/styles/getMuiTheme.js

使用样式属性应用样式

要将样式应用于单个组件,通常可以使用 style 属性并将所需样式传递给它。

这是文档中的另一个示例,其中 12px 的边距应用于 RaisedButton。

import React from 'react';
import RaisedButton from 'material-ui/RaisedButton';

const style = {
  margin: 12,
};

const RaisedButtonExampleSimple = () => (
  <div>
    <RaisedButton label="Default" style={style} />
    <RaisedButton label="Primary" primary={true} style={style} />
    <RaisedButton label="Secondary" secondary={true} style={style} />
    <RaisedButton label="Disabled" disabled={true} style={style} />
    <br />
    <br />
    <RaisedButton label="Full width" fullWidth={true} />
  </div>
);

export default RaisedButtonExampleSimple;

现在,样式在同一个文件中定义,但您可以在单独的文件中定义它们并将它们导入到您使用组件的文件中。

如果您想应用多种样式,则可以使用展开运算符,如下所示:style={{...style1,...style2}}

通常,您使用 style 属性为组件(根元素)中的特定事物设置样式,但某些组件具有多个属性来设置组件的不同元素的样式。在本页http://www.material-ui.com/#/components/raised-button的属性下,可以看到有style属性,labelStyle和rippleStyle来设置RaisedButton不同部分的样式。

检查您正在使用的组件下的属性,看看您可以使用哪个样式属性,否则请检查您可以覆盖的可用全局样式属性。希望这会有所帮助!

【讨论】:

  • 谢谢,但我的问题是“如何使用 css-modules 设置 material-ui 组件的样式?”我强烈反对 CSS-in-JS。
【解决方案2】:

我应该使用 JssProvider 并告诉它在页面 head 部分中将材料 UI 样式放在我之前。

import JssProvider from 'react-jss/lib/JssProvider';
import { create } from 'jss';
import { createGenerateClassName, jssPreset } from 'material-ui/styles';

const generateClassName = createGenerateClassName();
const jss = create(jssPreset());
// We define a custom insertion point that JSS will look for injecting the styles in the DOM.
jss.options.insertionPoint = document.getElementById('jss-insertion-point');

function App() {
  return (
    <JssProvider jss={jss} generateClassName={generateClassName}>
      ...
    </JssProvider>
  );
}

export default App;

【讨论】:

【解决方案3】:

您必须使用组件 API。如果组件具有获取样式的 API,则不能仅使用 css 为从库中导入的组件设置样式。

*更新

import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from 'material-ui/styles';
import Button from 'material-ui/Button';

const styles = {
  root: {
    background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
    borderRadius: 3,
    border: 0,
    color: 'white',
    height: 48,
    padding: '0 30px',
    boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .30)',
  },
  label: {
    textTransform: 'capitalize',
  },
};

function Classes(props) {
  return (
    <Button
      classes={{
        root: props.classes.root, // class name, e.g. `classes-root-x`
        label: props.classes.label, // class name, e.g. `classes-label-x`
      }}
    >
      {props.children ? props.children : 'classes'}
    </Button>
  );
}

Classes.propTypes = {
  children: PropTypes.node,
  classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(Classes);

【讨论】:

  • 问题是我看不到如何在没有!importantmaterial-ui-next.com/customization/overrides/…的情况下将他们的API与css模块一起使用
  • 查看文档并阅读示例代码以了解如何使用他们的 API。
  • 即使你想在这种情况下为组件添加类,你也可以使用classes API。
  • 答案已更新,它包含一个按类覆盖样式的示例
  • 您尝试过样品吗?尽管如此,它仍然需要!important。您只是从他们的网站上复制粘贴了一个示例。
猜你喜欢
  • 2020-07-24
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 2020-09-13
  • 2020-08-02
  • 2019-10-19
  • 2019-10-09
相关资源
最近更新 更多