首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSS嵌套样式容器

JSS嵌套样式容器
EN

Stack Overflow用户
提问于 2018-04-03 13:54:01
回答 1查看 2.2K关注 0票数 1

我正在使用React -> TextField组件,并且我想对它做一些包装,以便覆盖样式。根据文档,我们有两个支持来实现这一点: 1) InputProps -在这里,我们应该将类传递到作为TextField核心的内部输入组件中。2)直接类属性,应直接应用于TextField。类应该包含FormControl的规则。

(听起来很难,实际上,当您使用实质性UI =时,情况就是这样)

不管怎样,我想做这样的事

代码语言:javascript
复制
import { withStyles } from 'material-ui/styles';

export const TextInputCSSCreator = theme => ({
    "FormControlClasses" : {
        "root" : { "color" : "red }
       }
    "InputClasses" : {
       "underline" : {
           "&:after" : {
               backgroundColor : "red",
           },
       }
    }

});

<TextField
                classses={this.props.classes.FormControlClasses}
                id={this.props.id}
                InputProps={{
                    classes : this.props.classes.InputClasses
                }}
                label={this.props.label}
                value={this.state.value}
                onChange={this._onValueChange}
                margin={this.props.margin}
            />

export default withStyles(TextInputCSSCreator)(TextInput);

在这里,我想有一个可能性,将整个对象传递到我的两个目标。输入和FormControl。但这是主要的问题,我不知道如何解决。看起来JSS (来自MaterialUi的相同的JSS)不适用于包含规则嵌套容器的对象。

我用这种丑陋的方式完成了这个任务。看起来像地狱,但我没有找到任何办法来避免它。有人能帮帮我吗?真的只有一种方法才能达到这个要求吗?

因为我想实现的方式为我们提供了灵活性,我们可以在任何时候添加任何我们想要的类,而在第二种方式(下面),我们必须在开始时硬编码所有可能的类。

顺便说一句。我想提供一种机制来改变外部应用程序中组件的样式,这就是为什么我不能在输出时使用CSS的原因--它应该是有效的commonJS模块。

代码语言:javascript
复制
export const TextInputCSSCreator = theme => ({
    "FormControlRoot" : {},
    "FormControlMarginNormal" : {},
    "FormControlMarginDense" : {},
    "FormControlFullWidth" : {},

    "InputRoot" : {},
    "InputFormControl" : {},
    "InputFocused" : {},
    "InputDisabled" : {},
    "InputUnderline" : {
        "&:after" : {
            backgroundColor : "red",
        },
    },
    "InputError" : {},
    "InputMultiline" : {},
    "InputFullWIdth" : {},
    "InputInput" : {},
    "InputInputMarginDense" : {},
    "InputInputDisabled" : {},
    "InputInputMultiline" : {},
    "InputInputType" : {},
    "InputInputTypeSearch" : {}
});

render() {
        const { classes } = this.props;
        return (

            <TextField
                classes={{
                    root : classes.FormControlRoot,
          marginNormal : classes.FormControlMarginNormal,
                    marginDense : classes.FormControlMarginDense,
                    fullWidth : classes.FormControlFullWidth,
                }}
                id={this.props.id}
                InputProps={{
                    classes : {
                        root : classes.InputRoot,
                        formControl : classes.InputFormControl,
                        focused : classes.InputFocused,
                        disabled : classes.InputDisabled,
                        underline : classes.InputUnderline,
                        error : classes.InputError,
                        multiline : classes.InputMultiline,
                        fullWidth : classes.InputFullWIdth,
                        input : classes.InputInput,
                        inputMarginDense : classes.InputInputMarginDense,
                        inputDisabled : classes.InputInputDisabled,
                        inputMultiline : classes.InputInputMultiline,
                        inputType : classes.InputInputType,
                        inputTypeSearch : classes.InputInputTypeSearch
                    }
                }}
                label={this.props.label}
                value={this.state.value}
                onChange={this._onValueChange}
                margin={this.props.margin}
            />


        );
    }

export default withStyles(TextInputCSSCreator)(TextInput);
EN

回答 1

Stack Overflow用户

发布于 2018-04-04 06:55:06

在这种情况下,我要做的是用createMuiTheme({})在单独的文件中为该组件创建主题,并将其应用到带有MuiTheme提供程序组件的组件中。实例:

代码语言:javascript
复制
import { createMuiTheme } from 'material-ui/styles';
const customTheme = createMuiTheme({
    overrides: {
        MuiInput: {
            root:{
                color: 'red',
            },
            underline: {
                    '&:after': {
                      backgroundColor: '#000000',
                    }
              },
        },
    }

});
export default customTheme;

然后用在我的组件上,像这样:

代码语言:javascript
复制
<MuiThemeProvider theme = {customTheme}>
[Your component]
</MuiThemeProvider>

希望这能有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49631901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档