javascript - 在选项卡之间切换时避免在 React 中重新渲染

标签 javascript reactjs material-ui

我有一个使用 Material-ui 来创建选项卡的 React 应用程序。

<div className={classes.root}>
  <AppBar position="static">
    <Tabs value={value} onChange={handleChange}>
      <Tab label="Item One" />
      <Tab label="Item Two" />
      <Tab label="Item Three" />
    </Tabs>
  </AppBar>
  {value === 0 && <TabContainer id={1}>Item One</TabContainer>}
  {value === 1 && <TabContainer id={2}>Item Two</TabContainer>}
  {value === 2 && <TabContainer id={3}>Item Three</TabContainer>}
</div>

Edit Material-UI Tabs

TabContainer 是一个功能组件,会进行一些繁重的计算。
是否可以防止 TabContainer 在选项卡之间切换时重新渲染?

更新:
查看我的answer使用 React 功能组件和 css 类的解决方案。

最佳答案

更新/部分解决方案:
通过下面的代码(基于 Rahul Jain's answer )使用 css 类来显示事件 TabContainer,记忆化的函数似乎真的被记忆化了。

    const useTabContainerStyles = makeStyles((theme: Theme) =>  createStyles({
        root: {
          padding: 8 * 3
        },
        tabcontainerInActive: {
          display: "none"
        }
      })
    );

    function TabContainer(props: TabContainerProps) {
      const styles = useTabContainerStyles({});
      console.log("In TabContainer");
      const doubleValue = useMemo(() => double(props.id), [props.id]);
      return (
        <Typography
          id={props.id.toString()}
          component="div"
          className={classnames(styles.root, {
            [styles.tabcontainerInActive]: !props.active
          })}
        >
          {props.children + " " + doubleValue}
        </Typography>
      );
    }

    export default function SimpleTabs() {
      const classes = useStyles({});
      const [selectedTab, setSelectedTab] = React.useState(0);

      function handleChange(event: React.ChangeEvent<{}>, newValue: number) {
        setSelectedTab(newValue);
      }

      return (
        <div className={classes.root}>
          <AppBar position="static">
            <Tabs value={selectedTab} onChange={handleChange}>
              <Tab label="Item One" />
              <Tab label="Item Two" />
              <Tab label="Item Three" />
            </Tabs>
          </AppBar>
          {/*  */}
          <TabContainer id={0} active={selectedTab === 0}>
            Item One
          </TabContainer>
          <TabContainer id={1} active={selectedTab === 1}>
            Item Two
          </TabContainer>
          <TabContainer id={2} active={selectedTab === 2}>
            Item Three
          </TabContainer>
        </div>
      );
    }

关于javascript - 在选项卡之间切换时避免在 React 中重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59798377/

相关文章:

reactjs - 将 "Row Number"添加到 react-admin Datagrid 中的列表组件

JavaScript循环: restore console after each iteration

JavaScript Promise 不等待异步调用

javascript - 获取内容脚本本地存储值(value)的简单方法 [Chrome 扩展]

javascript - 顶点图表文本 chop 自定义

javascript - 如何使用 Next/Head 渲染脚本

reactjs - Material UI - 在 ListItemText 中设置文本样式

javascript - 在运行时将 onfocus 分配给 DOM 元素

reactjs - 如何在 JavaScript 中使用 Phoenix Controller 变量?

reactjs - 如何使用 Enzyme Shallow 测试传递给子组件的 Prop ?