React:Material-UI GridListTile 从组件内部调用时会丢失样式属性

如何解决React:Material-UI GridListTile 从组件内部调用时会丢失样式属性

我有一个 UI,我在其中使用我定义为自定义组件的图块渲染 <GridList>

当我第一次写这篇文章的时候,我对 React hooks 的本质、props 是如何传递等感到有点困惑。所以,我把它作为一个普通的 JS 函数调用

const VideoTile = ({...props}) => {
    const { url,classes } = props;
    
    return (
        <GridListTile key={url} cols={1} className={classes.videoTile} >
            <video src={url} className={classes.videoPreview} />
            <GridListTileBar title={url} />
        </GridListTile>
    )
}
const Videobrowser = ({...props}) => {
    const {vidUrls,classes} = props; //for the sake of brevity
    return (
        <GridList cellHeight='auto' cols={4} className={classes.videoGridList}>
          {videoUrls.map((url) => VideoTile({url,classes}))}
        </GridList>
    )
}

请注意,我在函数内的 tile 中添加key 属性以安抚 React。

通过对 React 的更好理解来查看代码,我对其进行了更改,以便可以使用 JSX 语法调用它,在组件中使用钩子等,并希望遵循更好的实践。然而,我发现 Material-UI 在 React 的虚拟 DOM 上运行的方式意味着它在这里渲染两个孩子的方式非常不同:

(我暂时移除了钩子,专注于渲染单个组件,以便我可以在 devtools 中进行比较)。

<GridList cellHeight='auto' cols={4} className={classes.videoGridList}>
  {VideoTile({url,classes})}
  <VideoTile url={url} classes={classes} />
</GridList>

一个版本在外部 { width: 25%; height: auto; padding: 2px; }添加了一些元素样式属性 <li>。后一个版本没有,大概是因为添加它们的代码不理解 <VideoTile> 的顶级元素实际上是一个 <GridListTile>,因此很有趣。我想我会重新排列代码,以便 <GridListTile> 出现在函数之外,但我想更好地理解这个问题,我如何以不同的方式解决它,或者是否有一个一般原则我应该明白,避免以后出现类似问题。

解决方法

当我完成这个问题时,我已经意识到现在如何修复我的特定错误,允许在我的组件中更多地使用钩子等:

const VideoTileInner = ({...props}) => {
    const { url } = props;
    const classes = useStyles();
    
    return (
        <>
            <video src={url} className={classes.videoPreview} />
            <GridListTileBar title={url} />
        </>
    )
}

const VideoBrowser = ({...props}) => {
    const {vidUrls} = props;
    const classes = useStyles();
    return (
        <GridList cellHeight='auto' cols={4} className={classes.videoGridList}>
        {videoUrls.map((url) => {
          return (
            <GridListTile key={url} cols={1} className={classes.videoTile}>
              <VideoTileInner url={url} />
            </GridListTile>
          )
        })}
        </GridList>
    )
}

不过,正如问题中提到的,我想更好地理解这个问题,我可以如何以不同的方式解决它,或者是否有一个我应该理解的一般原则以避免将来出现类似问题。

或者,实际上,这是否可以被视为 Material-UI 中的错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?