代码之家  ›  专栏  ›  技术社区  ›  KshitijV97

如何在情感风格的组件中使用来自MUI主题对象的自定义属性和自定义道具?

  •  2
  • KshitijV97  · 技术社区  · 2 年前

    我添加了一个名为 fTokens 通过TypeScript中的模块扩充到MUI主题

    这就是我 theme.d.ts 看起来像

    declare module "@mui/material/styles" {
      interface FPalette { ...
      }
    
      interface FTokens { ...
      }
    
      interface FSpacing { ...
      }
    
      interface Theme {
        fPalette: FPalette;
        fTokens: FTokens;
        fSpacing: FSpacing;
      }
    
      interface ThemeOptions {
        fPalette: Partial<FPalette>;
        fTokens: Partial<Tokens>;
        fSpacing: Partial<FSpacing>;
      }
    }
    

    我正试图传递一个自定义道具 rowId TableRow MUI

    import MUITableRow, { TableRowProps as MUITableRowProps } from "@mui/material/TableRow";
    import { styled } from "@mui/system";
    
    interface TableRowProps {
      rowId: number;
    }
    
    const TableRow = styled(MUITableRow)<TableRowProps>(({ theme }) => ({
      backgroundColor: theme.fTokens.surfaceHigh,
    }));
    
    export default TableRow;
    

    我收到TypeScript错误为 Property 'fTokens' does not exist on type 'Theme'.ts(2339)

    UPDATE-我尝试使用类型断言 as 这个关键字对我有效,但我不知道这是否是解决这个问题的最优雅的方法?

    const TableRow = styled(MUITableRow)<TableRowProps>(({ theme, rowId }) => ({
      backgroundColor:
        rowId % 2 === 0
          ? (theme as Theme).fTokens.surfaceHigh
          : (theme as Theme).fTokens.surfaceHighest,
    }));
    
    2 回复  |  直到 2 年前
        1
  •  1
  •   Wowguagua    2 年前

    尝试从“@mui/material/styles”而不是“@mui/system”导入样式

    import { styled } from '@mui/material/styles';

    文件: https://mui.com/system/styled/#import-path

        2
  •  1
  •   Taiwei Tuan    2 年前

    这个 theme 具有类型 Theme ,这与您可能应该在 ThemeProvider 。您可以在此处阅读官方回购中的类型声明 https://github.com/mui/material-ui/blob/master/packages/mui-material/src/styles/createTheme.d.ts#L28-L36

    正如你所知,没有 fTokens 根据类型声明文件,因此抛出错误。

    你想做的是从 主题提供者 为适当的属性提供颜色,例如-- palette ,然后您可以为 TableRow 使用您刚刚添加到 主题提供者

    下面是示例代码--

    const TableRow = styled(MUITableRow)(({ theme }) => {
      return {
        backgroundColor: theme.fTokens.surfaceHigh
      };
    });
    
    export default function App() {
      const outerTheme = createTheme({
        fTokens: { surfaceHigh: orange[500] }
        // palette: { primary: { main: orange[500] } }
      });
      return (
        <div className="App">
          <ThemeProvider theme={outerTheme}>
            <TableRow />
          </ThemeProvider>
        </div>
      );
    }
    

    有关的文档 styled 此处的实用程序: https://mui.com/system/styled/

    Codesandbox中不抛出错误的随机测试(除了 <tr> 不应该是的孩子 <div> ) https://codesandbox.io/s/determined-kowalevski-ppm6zh?file=/src/App.tsx