【问题标题】:Material-ui: Button in a tab listMaterial-ui:选项卡列表中的按钮
【发布时间】:2020-01-25 22:47:52
【问题描述】:

我有一组标签,我希望后面跟着一个添加按钮(添加新标签)。我刚刚向 Tabs 组件的子组件添加了一个按钮,它完全按照我想要的方式呈现和工作,但是开发者控制台中有很多警告。

        <AppBar position="static">
          <Tabs
            value={this.props.selectedTab}
            onChange={this.handleTabSelect}
            textColor="secondary"
          >
            {this.props.ListOfStuff.map(el => {
              return (
                <Tab
                  className={classes.tabButton}
                  value={el.ClientId}
                  label={el.Label}
                  id={el.ClientId}
                  aria-controls={"tabPanel-" + el.ClientId}
                  key={"tab-" + el.ClientId}
                />
              );
            })}
            <Button
              className={classes.addButton}
              onClick={this.addNewTab}
            >
              <AddIcon color="secondary" className={classes.addIcon} />
              NEW TAB
            </Button>
          </Tabs>
        </AppBar>

警告如下: - 警告:收到false 的非布尔属性indicator。 - 警告:React 无法识别 DOM 元素上的 textColor 属性。 - 警告:ForwardRef(InputBase) 包含一个 time 类型的输入,带有 value 和 defaultValue 属性。

关于如何保持它以相同的方式呈现但摆脱所有这些警告的任何建议?

谢谢

【问题讨论】:

    标签: reactjs material-ui


    【解决方案1】:

    Tabs 组件clones its child elements(假定为Tab 元素)以传递其他属性(例如,与“选定”选项卡相关的属性)。

    警告是由传递给Button 组件的这些附加属性引起的。您可以通过将Button 包装在忽略Tabs 传递的其他属性的组件中来修复这些警告,例如:

    const ButtonInTabs = ({ className, onClick, children }) => {
      return <Button className={className} onClick={onClick} children={children} />;
    };
    

    完整的工作示例:

    import React from "react";
    import PropTypes from "prop-types";
    import { makeStyles } from "@material-ui/core/styles";
    import AppBar from "@material-ui/core/AppBar";
    import Tabs from "@material-ui/core/Tabs";
    import Tab from "@material-ui/core/Tab";
    import Typography from "@material-ui/core/Typography";
    import Box from "@material-ui/core/Box";
    import Button from "@material-ui/core/Button";
    import AddIcon from "@material-ui/icons/Add";
    
    function TabPanel(props) {
      const { children, value, index, ...other } = props;
    
      return (
        <Typography
          component="div"
          role="tabpanel"
          hidden={value !== index}
          id={`simple-tabpanel-${index}`}
          aria-labelledby={`simple-tab-${index}`}
          {...other}
        >
          <Box p={3}>{children}</Box>
        </Typography>
      );
    }
    
    TabPanel.propTypes = {
      children: PropTypes.node,
      index: PropTypes.any.isRequired,
      value: PropTypes.any.isRequired
    };
    
    function a11yProps(index) {
      return {
        id: `simple-tab-${index}`,
        "aria-controls": `simple-tabpanel-${index}`
      };
    }
    
    const useStyles = makeStyles(theme => ({
      root: {
        flexGrow: 1,
        backgroundColor: theme.palette.background.paper
      },
      addButton: {
        color: "white"
      }
    }));
    
    const ButtonInTabs = ({ className, onClick, children }) => {
      return <Button className={className} onClick={onClick} children={children} />;
    };
    
    export default function SimpleTabs() {
      const classes = useStyles();
      const [value, setValue] = React.useState(0);
      const [showThirdTab, setShowThirdTab] = React.useState(false);
    
      const handleChange = (event, newValue) => {
        setValue(newValue);
      };
    
      return (
        <div className={classes.root}>
          <AppBar position="static">
            <Tabs
              value={value}
              onChange={handleChange}
              aria-label="simple tabs example"
            >
              <Tab label="Item One" {...a11yProps(0)} />
              <Tab label="Item Two" {...a11yProps(1)} />
              {showThirdTab && <Tab label="Item Three" {...a11yProps(2)} />}
              <ButtonInTabs
                onClick={() => setShowThirdTab(true)}
                className={classes.addButton}
              >
                <AddIcon color="secondary" />
                New Tab
              </ButtonInTabs>
            </Tabs>
          </AppBar>
          <TabPanel value={value} index={0}>
            Item One
          </TabPanel>
          <TabPanel value={value} index={1}>
            Item Two
          </TabPanel>
          <TabPanel value={value} index={2}>
            Item Three
          </TabPanel>
        </div>
      );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 2021-04-21
      • 2020-05-21
      • 2020-11-25
      • 2021-04-04
      • 2022-12-13
      • 2021-03-23
      相关资源
      最近更新 更多