自定义 React 组件样式被 Material-UI 样式覆盖

强尼

相关问题在:样式被 Material-UI 样式覆盖

我在 Material UI 之上创建了一个组件库。使用 JSS 我希望能够将样式传递给我的自定义组件。但是,我遇到了 Material-ui 的根样式比我传入的具有更高特异性的问题。我尝试使用classes语法覆盖 material-ui 组件的默认样式,但它只是创建了另一个具有相似名称和更高级别的类特异性(makeStyles-root-51)。

Chrome 开发工具

使用自定义组件:

import React from 'react';
import {gSelect} from 'g-react-component-library/dist'
import {createUseStyles} from 'react-jss'

const useStyles = createUseStyles({
    gSelect: {margin: "15px"},
    example: {float: "left", display: "inline-block", whiteSpace: 'nowrap', verticalAlign: 'top'}
});

function App() {

    const classes = useStyles();
    return (
        <div className={classes.example}>
            <div className={classes.separator}>
                <div>Selects:</div>
                <gSelect default={1} classes={{gSelect: classes.gSelect}} callback={(e)=>{console.log(`${e} selected`)}} options={[1,2,3,4]}/>
                <gSelect default={'One'} classes={{gSelect: classes.gSelect}} callback={(e)=>{console.log(`${e} selected`)}} options={["One", "Two", "Three", "Four"]}/>
            </div>
        </div>
    );
}

export default App;

实际的自定义组件:

import React, {useState} from 'react';
import {Button, Select, FormControl, MenuItem, InputLabel} from '@material-ui/core'
import {makeStyles} from '@material-ui/styles'
import PropTypes from 'prop-types'

const gSelect = (props) => {

    const [value, setValue] = useState();

    const handleChange = event => {
        props.callback(event.target.value);
        setValue(event.target.value);
    };

    const useStyles = makeStyles({
        select: {
            border: 'solid #33333366 1px',
            color: 'rgba(51, 51, 51, 0.66)',
            fontWeight: '700',
            backgroundColor: 'white',
            outline: 'none',
            borderRadius: '5px',
            textAlign: 'left',
            width: '300px',
            position: 'relative',
        },
        root: {

        }
    });

    const classes = useStyles(props);
    return (
        <FormControl classes={{root: classes.gSelect}}>
        <InputLabel id="demo-simple-select-label">{props.default}</InputLabel>
        <Select value={value} onChange={handleChange} className={classes.select}>
            {props.options.map((option, index) => {
                return <MenuItem key={`${option}_${index}`} value={option}>{option}</MenuItem>
            })}
        </Select>
        </FormControl>
    )
};

gSelect.propTypes = {
    callback: PropTypes.func.isRequired,
    options: PropTypes.array.isRequired,
    default: PropTypes.oneOfType([
        PropTypes.string,
        PropTypes.number
    ]).isRequired,
    disabled: PropTypes.bool,
    width: PropTypes.string
};

module.exports = {
    gSelect
};
亚当

你这样做是错的。GSelect应该接收这样的类:

在应用程序中:

<GSelect default={1} classes={{gSelect:classes.gSelect}} callback={(e)=>{console.log(`${e} selected`)}} options={[1,2,3,4]}/>

然后在GSelect

const useStyles = createStyles(...your styles); // call this hook factory outside your render

const GSelect = props => {
   const classes = useStyles(props) <- props contains an object called classes with a property gselect that gets merged into yours

   <Select value={value} onChange={handleChange} classes={{root:classes.gSelect}}>
}

编辑:至于我关于在组件之外创建钩子的原始评论,我的意思是这样做:


// move this outside of your render
    const useStyles = createUseStyles({
        gSelect: {margin: "15px"},
        separator: {marginTop: "15px"},
        example: {float: "left", display: "inline-block", whiteSpace: 'nowrap', verticalAlign: 'top'}
    });

function App() {
    // use it inside of your render
    const classes = useStyles();
    ...
}

通读本节和以下两节,过一会儿,它会点击:https : //material-ui.com/styles/advanced/#overriding-styles-classes-prop

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何自定义React Material UI的Tab组件的文本样式

React自定义Material-UI图标样式

React + Material UI-使用样式覆盖组件中的MuiTheme

在React的Material UI中覆盖样式

React Material UI 按钮覆盖 hove 样式

无法覆盖嵌套 Material UI 组件的样式

使用样式化组件自定义 Material-UI 组件

material-ui组件样式自定义–将选定组件的颜色更改为白色

应用自定义主题时,是否可以覆盖 Material UI 中的嵌套对象样式?

使用 Material-UI 的 tab 组件时,如何自定义选中的 tab 的样式?

使用Material UI V1渲染具有自定义样式的组件

在Material-UI中重用自定义样式

样式被Material-UI样式覆盖

React material-UI覆盖默认表单输入样式

如何使用样式组件覆盖 material-ui css?

通过覆盖样式道具使Material-UI组件内联显示

选中后如何覆盖Material-UI开关组件的样式?

如何从祖先覆盖嵌套的Material UI组件的样式?

使用 .map 函数设计 React Material UI 组件的样式

如何使用样式组件自定义 Material-UI Text Field 的边框颜色、宽度和高度

如何覆盖深层嵌套组件的样式?(Material-UI Jss样式)

在React Native中样式化自定义组件

React内联样式不会影响我的自定义组件

样式未传递给自定义组件React Native

如何覆盖 Material-UI Popover 样式?

material-ui:需要帮助覆盖样式

在React Native中向样式化组件自定义组件添加样式

如何将样式化组件样式应用于自定义React组件?

React组件样式被全局样式覆盖