material-ui 当Box作为子元素包含RSC(React Server Component)时,Box会抛出错误,

htrmnn0y  于 5个月前  发布在  React
关注(0)|答案(8)|浏览(75)

重现步骤 🕹

链接到实时示例: https://codesandbox.io/p/devbox/fragrant-forest-gn5rr6?file=%2Fsrc%2Fapp%2Fpage.tsx%3A1%2C1

import { Box } from '@mui/material'

async function FooBar() {
  return <Box>foobar</Box>
}

export default function Page() {
  return (
    <Box>
      <FooBar />
    </Box>
  )
}

当前行为 😯

抛出以下错误:
app-index.js:32 警告:属性类型失败:向 children 提供无效的 prop ForwardRef(Box),期望的是 ReactNode。

预期行为 🤔

不报错 =D

上下文 🔦

非常喜欢 MUI,但这阻止我们在服务器组件中使用它

你的环境 🌎

系统:
操作系统:macOS 13.6
二进制文件:
Node: 18.17.0 - ~/.nodenv/versions/18.17.0/bin/node
Yarn: 1.22.19 - /usr/local/bin/yarn
npm: 9.6.7 - ~/.nodenv/versions/18.17.0/bin/npm
浏览器:
Chrome: 119.0.6045.159
Edge: 未找到
Safari: 16.6

ztmd8pv5

ztmd8pv51#

获取Box组件的prop类型警告。https://codesandbox.io/p/sandbox/fragrant-forest-gn5rr6?file=%2Fsrc%2Fapp%2Fpage.tsx%3A1%2C1

Warning: Failed prop type: Invalid prop `children` supplied to `ForwardRef(Box)`, expected a ReactNode.
6ss1mwsb

6ss1mwsb2#

这是导致错误的PropType:https://github.com/mui/material-ui/blob/master/packages/mui-material/src/Box/Box.js#L26
我猜我们可以把它改成oneOfType,但我不确定应该是什么🤔
我相信这在"纯"的React中不起作用,只在Next.js中起作用:

async function FooBar() {
  return <Box>foobar</Box>
}

export default function Page() {
  return (
    <Box>
      <FooBar />
    </Box>
  )
}
ivqmmu1c

ivqmmu1c3#

我想知道prop-types包是否支持将RSC作为子元素的模式。

c6ubokkw

c6ubokkw4#

可以确认这种情况确实发生过,不仅在 Box 组件中出现,其他组件也出现了。然而,除了控制台本身的错误之外,似乎没有任何问题,一切都按预期进行。
如果你将服务器组件 Package 在一个普通的 div 中,例如:

<Box>
    <div>
        <MyServerComponent />
    </div>
</Box>

那么错误就会消失。虽然这并不理想,因为会产生一个无用的额外div,但到目前为止效果还不错。

um6iljoc

um6iljoc5#

我找到了另一个基于@FernandVEYRIER的解决方案,不需要额外的div元素。

  1. 创建一个 Package 器组件
'use client';

import React from 'react';

export const ClientToServer: React.FC<{
  children: React.ReactNode;
}> = ({ children }) => {
  return <>{children}</>;
};
  1. 只需用 Package 器 Package 你的服务器组件
<Box>
    <ClientToServer>
        <MyServerComponent />
    </ClientToServer>
</Box>
j2cgzkjk

j2cgzkjk6#

这是导致错误的PropType:https://github.com/mui/material-ui/blob/master/packages/mui-material/src/Box/Box.js#L26
我想我们可以将其更改为oneOfType,但我不确定应该是什么🤔
我相信这在普通的React中不起作用,只在Next.js中起作用:

async function FooBar() {
  return <Box>foobar</Box>
}

export default function Page() {
  return (
    <Box>
      <FooBar />
    </Box>
  )
}

那么我们是否可以将其更改为any?

ma8fv8wu

ma8fv8wu8#

我们可以:

  • 将bug报告给Next.js。这似乎是根本问题。他们没有正确更新react-is
  • 跳过子属性的proptypes生成,直到Next.js修复它。

相关问题