如何在React Component类中集成常量和函数?

时间:2019-07-19 07:41:09

标签: reactjs react-redux material-ui react-component

让我们从Material-UI中获取AppBar代码: https://material-ui.com/components/app-bar/#app-bar-with-a-primary-search-field

有一个“ renderMobileMenu”。我想整合它。问题在于示例代码使用“函数”,而我的是React Component类。我需要有关如何在React Component类中集成该renderMobileMenu(和相关)代码的指南。 我也在使用React Redux。

export default connect(
    mapStateToProps,
    {wbToggle: wbToggle, vidToggle: vidToggle, fileToggle: fileToggle}
)(Utilitybar);

我已经尝试过,但总是会出错,因为我违反了钩子定律。

2 个答案:

答案 0 :(得分:3)

我假设您的班级名称是“ Utilitybar”。由于您需要使用示例中的代码和功能,可以通过两种方式实现它,

  1. 只需复制所需的函数,然后将其粘贴到具有必需的依赖函数和程序包的类之外,然后调用它-(不推荐使用的方法和肮脏的方式)

  2. 使用您需要在现有类中添加的无状态组件创建一个无状态组件(根据您的需要状态全/无状态),在新创建的无状态组件中导入所需的功能和包。完成后,您的无状态组件就可以使用了,然后继续导入您的工具栏并使用它。

请参考下面的示例

您需要创建一个单独的无状态组件

<path>/MobileMenu.js

/*import the dependency packages, files you are referring in your sample function*/
import React from 'react';
import { fade, makeStyles } from '@material-ui/core/styles';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar'; 
...
...
....

export const RenderMobileMenu = ({
}) => {
  /*copied the dependent functions to render - renderMobileMenu*/
  const [mobileMoreAnchorEl, setMobileMoreAnchorEl] = React.useState(null);
  const [anchorEl, setAnchorEl] = React.useState(null);
  const isMenuOpen = Boolean(anchorEl);
  const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);
  const mobileMenuId = 'primary-search-account-menu-mobile';

  function handleMobileMenuClose() {
    setMobileMoreAnchorEl(null);
  }

  function handleMenuClose() {
    setAnchorEl(null);
    handleMobileMenuClose();
  }

  /*copied the code under renderMobileMenu*/
  return (
    <Menu
      anchorEl={mobileMoreAnchorEl}
      anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
      id={mobileMenuId}
      keepMounted
      transformOrigin={{ vertical: 'top', horizontal: 'right' }}
      open={isMobileMenuOpen}
      onClose={handleMobileMenuClose}
    >
      <MenuItem>
        <IconButton aria-label="Show 4 new mails" color="inherit">
          <Badge badgeContent={4} color="secondary">
            <MailIcon />
          </Badge>
        </IconButton>
        <p>Messages</p>
      </MenuItem>
      <MenuItem>
        <IconButton aria-label="Show 11 new notifications" color="inherit">
          <Badge badgeContent={11} color="secondary">
            <NotificationsIcon />
          </Badge>
        </IconButton>
        <p>Notifications</p>
      </MenuItem>
      <MenuItem onClick={handleProfileMenuOpen}>
        <IconButton
          aria-label="Account of current user"
          aria-controls="primary-search-account-menu"
          aria-haspopup="true"
          color="inherit"
        >
          <AccountCircle />
        </IconButton>
        <p>Profile</p>
      </MenuItem>
    </Menu>
    )
}

现在,RenderMobileMenu已准备好为Utilitybar.js服务。

只需继续,将此RenderMobileMenu.js文件导入到Utilitybar.js中,并在render(return())方法下使用它。

编码愉快!

答案 1 :(得分:0)

您可以查看v3文档,以了解其如何以旧方式使用。

https://v3.material-ui.com/demos/app-bar/#app-bar