将props传递给 MUI 样式

IT技术 reactjs material-ui
2021-04-16 02:15:45

鉴于此处Card代码如何从以下位置更新卡片样式或任何材质 UI 样式:

const styles = theme => ({
  card: {
  minWidth: 275,
},

对这样的:

const styles = theme => ({
  card: {
  minWidth: 275, backgroundColor: props.color
},

当我尝试最新的时,我得到了

Line 15:  'props' is not defined  no-undef

当我将代码更新为:

const styles = theme =>  (props) => ({
  card: {
  minWidth: 275, backgroundColor: props.color
},

 const styles  = (theme ,props) => ({
   card: {
   minWidth: 275, backgroundColor: props.color
 },

代替

const styles = theme => ({
  card: {
  minWidth: 275, backgroundColor: props.color
},

我在网页上弄乱了组件卡样式。

顺便说一下,我通过 props 如下:

<SimpleCard backgroundColor="#f5f2ff" />

请帮忙!

6个回答

删除了旧答案,因为它没有存在的理由。

这是你想要的:

import React from 'react';
import { makeStyles } from '@material-ui/core';

const useStyles = makeStyles({
    firstStyle: {
        backgroundColor: props => props.backgroundColor,
    },
    secondStyle: {
        color: props => props.color,
    },
});

const MyComponent = ({children, ...props}) =>{
    const { firstStyle, secondStyle } = useStyles(props);
    return(
        <div className={`${firstStyle} ${secondStyle}`}>
            {children}
        </div>
    )
}

export default MyComponent;

现在你可以像这样使用它:

<MyComponent color="yellow" backgroundColor="purple">
    Well done
</MyComponent>

官方文档

如果我useStyle在单独的文件中声明了怎么办?我试过const styles = (props) => makeStyles({});但没有运气
2021-05-28 02:15:45
你能用 useEffect 钩子发布一个答案吗?我现在正在使用您的解决方案,但希望尽可能提高性能,而且我对钩子仍然很陌生,不确定如何使用。
2021-06-03 02:15:45
是否可以使用功能组件和钩子实现相同的效果(不在每个渲染上创建新的样式组件)?我是 React 钩子的新手,所以只是问
2021-06-12 02:15:45
是的你可以。您可以使用 useEffect 钩子并将样式道具传递给它,以确保它只会在样式道具更改时重新渲染。
2021-06-16 02:15:45
这个答案不仅帮助我解决了将 props 传递给这些样式的问题,还帮助我更好地理解了 makeStyles 方法。谢谢!
2021-06-16 02:15:45

如何在 Material ui 中同时使用 props 和 theme 的解决方案:

const useStyles = props => makeStyles( theme => ({
    div: {
        width: theme.spacing(props.units || 0)  
    }
}));

export default function ComponentExample({ children, ...props }){
    const { div } = useStyles(props)();
    return (
        <div className={div}>{children}</div>
    );
}
这是钱给propstheme
2021-05-24 02:15:45
喜欢这个答案!
2021-06-06 02:15:45
如果useStyles在单独的文件中,这似乎不起作用。有什么解决办法吗?
2021-06-07 02:15:45
@SrinjoySantra 您确定在样式声明后添加了另一个 () 吗?const { div } = useStyles(props)();
2021-06-19 02:15:45

这里的typescript解决方案:

import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
import {Theme} from '@material-ui/core';

export interface StyleProps {
    height: number;
}

const useStyles = makeStyles<Theme, StyleProps>(theme => ({
  root: {
    background: 'green',
    height: ({height}) => height,
  },
}));

export default function Hook() {

  const props = {
    height: 48
  }

  const classes = useStyles(props);
  return <Button className={classes.root}>Styled with Hook API</Button>;
}

如果你想玩它,试试这个 CodeSandbox

基于typescript的反应实现的干净和时尚的解决方案
2021-06-06 02:15:45

这是官方的 Material-UI 演示。

这是一个非常简单的例子。它使用类似于样式化组件的语法:

import React from "react";
import { makeStyles, Button } from "@material-ui/core";

const useStyles = makeStyles({
  root: {
    background: props => props.color,
    "&:hover": {
      background: props => props.hover
    }
  },
  label: { fontFamily: props => props.font }
});

export function MyButton(props) {
  const classes = useStyles(props);
  return <Button className={classes.root} classes={{ label: classes.label }}>My Button</Button>;
}


// and the JSX...
<MyButton color="red" hover="blue" font="Comic Sans MS" />

此演示使用makeStyles,但此功能在styled和 中也可用withStyles

这于2018 年 11 月 3 日首次在@material-ui/styles 中引入并从版本 4 开始包含在 @material-ui/core 中。

@Jagi 由于makeStyles返回一个接受props返回的函数classes,你总是可以将它包装在你自己的接受props和返回的自定义函数中classes例如:const useStyles = (props) => { /* do stuff */ return makeStyles({}); }这能解决你的问题吗?需要通过什么方式makeStyles根据来自服务器的 props 来改变传入的对象
2021-05-26 02:15:45
因为我喜欢能够在属性级别访问道具,所以在我的情况下,最好在样式级别访问它const useStyles = (props) => makeStyles({})我从服务器获得动态样式定义,但我不知道那里定义了哪些 CSS 属性。@material-ui/styles 可以吗?
2021-06-07 02:15:45
谢谢,它有效!我唯一担心的是,即使道具没有改变,它也会在每次渲染时重新创建样式。或者makeStyles正在照顾它?
2021-06-07 02:15:45
这是真的,makeStyles创建一个函数,该函数将在每次渲染时创建,而不是创建一次。但是,有两个想法:1)如果您传入的对象makeStyles在每次渲染时都不同,那么就无法在每次渲染时创建新类(至少不是使用 Material-UI 的当前功能)和 2)我不会担心性能,直到您有指标表明这对用户来说是一个问题。
2021-06-13 02:15:45
@Jagi oop,我的意思是: const useStyles = (props, options) => { /* do stuff */ return makeStyles({})(props, options); }
2021-06-14 02:15:45

这个答案是在 4.0 版本之前写的,严重过时了!

说真的,如果您要设计函数组件的样式,请使用makeStyles.

詹姆斯谭答案是4.x版本的最佳答案

下面的任何东西都是古老的:

当您使用 时withStyles,您可以访问theme,但不能访问props

请注意,Github 上有一个请求此功能的未决问题,一些评论可能会为您指出您可能感兴趣的替代解决方案。

使用 props 更改卡片背景颜色的一种方法是使用内联样式设置此属性。我已经分叉了您的原始代码盒子,并进行了一些更改,您可以查看修改后的版本以查看其实际效果。

这是我所做的:

  1. 使用backgroundColorprop渲染组件
// in index.js
if (rootElement) {
  render(<Demo backgroundColor="#f00" />, rootElement);
}
  1. 使用此props将内联样式应用于卡片:
    function SimpleCard(props) {
      // in demo.js
      const { classes, backgroundColor } = props;
      const bull = <span className={classes.bullet}>•</span>;
      return (
        <div>
          <Card className={classes.card} style={{ backgroundColor }}>
            <CardContent>
              // etc

现在渲染的Card 组件具有红色 (#F00) 背景

查看文档Overrides部分以了解其他选项。

@Phil 这也是我的建议。不久前,我更新了将观众引导至 James Tan 发布的答案的答案。
2021-05-27 02:15:45
@HugoGresse 谢谢!我稍微修改了您的编辑,向人们指出更好的答案。
2021-06-12 02:15:45
请考虑更改为其他答案之一。内联样式只能作为最后的手段
2021-06-20 02:15:45