Material-Table:样式覆盖了所有自定义和 Material UI 样式以及未呈现的图标

Posted

技术标签:

【中文标题】Material-Table:样式覆盖了所有自定义和 Material UI 样式以及未呈现的图标【英文标题】:Material-Table: styling is overiding all custom and Material UI styling and icons not rendering 【发布时间】:2019-11-09 16:52:37 【问题描述】:

我正在尝试使用 Material-Table 组件 - 它非常适合我正在构建的表(添加、编辑、删除和搜索行)。我已经安装并使用它作为页面的子组件 - 一切正常,但是......

样式:页面中的所有自定义和内置样式在所有 Material UI 组件中都丢失了(即,AppBar 按钮之间没有填充/间距,自定义字体样式混乱)。

图标:表格中的图标不会呈现 - 它们只是显示为大的截断文本。

没有表格的其他页面的样式和图标不受影响。

有人有办法吗?提前致谢。

对于图标,我尝试重新安装库并导入。也试过放 html方法。材料表代码片段如下。

<MaterialTable
  title="Editable Example"
  columns=state.columns
  data=state.data
  actions=[
    
      icon: 'edit',
      tooltip: 'Edit Study',
      onClick: (event, rowData) => alert("Do you want to edit " + rowData.name + "?") 
    ,
    rowData => (
      icon: 'clear',
      tooltip: 'Delete User',
      onClick: (event, rowData) => alert("You want to delete " + rowData.name), 
      disabled: rowData.birthYear < 2000
    )
  ]
  editable=
    onRowAdd: newData =>
      new Promise(resolve => 
        setTimeout(() => 
          resolve();
          const data = [...state.data];
          data.push(newData);
          setState( ...state, data );
        , 600);
      ),
    onRowDelete: oldData =>
      new Promise(resolve => 
        setTimeout(() => 
          resolve();
          const data = [...state.data];
          data.splice(data.indexOf(oldData), 1);
          setState( ...state, data );
        , 600);
      ),
  
/>

【问题讨论】:

github.com/mbrn/material-table 是您正在使用的库吗?如果是这样,则package.json 将 Material-UI 作为依赖项而不是对等依赖项。这可能会导致您同时拥有两个版本的 Material-UI,这可能是您的问题的根源。 相关 GitHub 问题:github.com/mbrn/material-table/issues/472 非常感谢@RyanCogswell。这绝对是问题所在。我的项目时间有限,所以我最终只是用常规的材料 ui 重做它——我没有足够的经验来快速解决依赖问题(不是经过培训的编码器,所以我只在我们学习时才开始编码)在时间紧迫的情况下)。我有与材料表相同的材料 ui 版本 --> 4.0.1。如果有人可以指导我找到一些资源来解决,那将不胜感激! - 否则我以后再研究。 @RyanCogswell 如何同时拥有两个版本的 Material-UI?我正在使用 @material-ui/core@4.2.1 并在 package-lock.json 文件中看到 "material-table" "version": "1.40.1" 具有 @material-ui/core": "^4.0.1 和依赖关系 @material-ui/core": "version": "4.2.1",... 我的 SO 帖子 @987654324 @ 我将 material-ui/core 和图标降级到 4.0.1,与为 material-table 列出的依赖项相同并修复了它。 【参考方案1】:

您可能使用的是 Material-UI v5,它与您使用的材料表版本不完全兼容,这就是它覆盖您的 Material-UI 样式的原因。

要使用支持 Material-UI v5 的材料表版本,请使用此命令安装材料表核心。

npm install @material-table/core@next

yarn add @material-table/core@next

查看此链接:material-table with @material-ui v5

【讨论】:

【参考方案2】:

要修复未显示的图标,您必须添加:

import  forwardRef  from 'react';

import AddBox from '@material-ui/icons/AddBox';
import ArrowDownward from '@material-ui/icons/ArrowDownward';
import Check from '@material-ui/icons/Check';
import ChevronLeft from '@material-ui/icons/ChevronLeft';
import ChevronRight from '@material-ui/icons/ChevronRight';
import Clear from '@material-ui/icons/Clear';
import DeleteOutline from '@material-ui/icons/DeleteOutline';
import Edit from '@material-ui/icons/Edit';
import FilterList from '@material-ui/icons/FilterList';
import FirstPage from '@material-ui/icons/FirstPage';
import LastPage from '@material-ui/icons/LastPage';
import Remove from '@material-ui/icons/Remove';
import SaveAlt from '@material-ui/icons/SaveAlt';
import Search from '@material-ui/icons/Search';
import ViewColumn from '@material-ui/icons/ViewColumn';

const tableIcons = 
    Add: forwardRef((props, ref) => <AddBox ...props ref=ref />),
    Check: forwardRef((props, ref) => <Check ...props ref=ref />),
    Clear: forwardRef((props, ref) => <Clear ...props ref=ref />),
    Delete: forwardRef((props, ref) => <DeleteOutline ...props ref=ref />),
    DetailPanel: forwardRef((props, ref) => <ChevronRight ...props ref=ref />),
    Edit: forwardRef((props, ref) => <Edit ...props ref=ref />),
    Export: forwardRef((props, ref) => <SaveAlt ...props ref=ref />),
    Filter: forwardRef((props, ref) => <FilterList ...props ref=ref />),
    FirstPage: forwardRef((props, ref) => <FirstPage ...props ref=ref />),
    LastPage: forwardRef((props, ref) => <LastPage ...props ref=ref />),
    NextPage: forwardRef((props, ref) => <ChevronRight ...props ref=ref />),
    PreviousPage: forwardRef((props, ref) => <ChevronLeft ...props ref=ref />),
    ResetSearch: forwardRef((props, ref) => <Clear ...props ref=ref />),
    Search: forwardRef((props, ref) => <Search ...props ref=ref />),
    SortArrow: forwardRef((props, ref) => <ArrowDownward ...props ref=ref />),
    ThirdStateCheck: forwardRef((props, ref) => <Remove ...props ref=ref />),
    ViewColumn: forwardRef((props, ref) => <ViewColumn ...props ref=ref />)
  ;

<MaterialTable
  icons=tableIcons
  ...
/>

官方文档:https://github.com/mbrn/material-table

【讨论】:

【参考方案3】:

在我的情况下,我使用的是@material-ui/core@4.0.0-beta,而material-table 使用的是4.2.1。

安装material-table后即可获取日志

info Direct dependencies
├─ @material-ui/core@4.2.1
└─ material-table@1.40.1
info All dependencies
├─ @babel/runtime-corejs2@7.5.5
├─ @date-io/date-fns@1.3.8
├─ @material-ui/core@4.2.1
├─ @material-ui/styles@4.2.1
├─ @material-ui/system@4.3.1
├─ convert-css-length@2.0.1
├─ css-box-model@1.1.3
├─ date-fns@2.0.0-beta.2
├─ debounce@1.2.0
├─ filefy@0.1.9
├─ material-table@1.40.1
├─ normalize-scroll-left@0.2.0
├─ raf-schd@4.0.2
├─ react-beautiful-dnd@11.0.3
├─ react-double-scrollbar@0.0.15
└─ use-memo-one@1.1.1

所以我将材料 ui 升级到 @material-ui/core@4.2.1 by yarn add @material-ui/core@4.2.1。然后就可以了。

【讨论】:

以上是关于Material-Table:样式覆盖了所有自定义和 Material UI 样式以及未呈现的图标的主要内容,如果未能解决你的问题,请参考以下文章

如何从材料表中删除覆盖加载器?

微信小程序覆盖自定义组件样式

Bootstrap cdn 覆盖了我在 react js 中的自定义 css 样式

如何在不覆盖现有样式的情况下向 WPF 自定义控件添加触发器?

如何防止外部 CSS 覆盖 Web 组件样式

vuejs的组件化开发中怎么自定义class覆盖原有样式?