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

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

重现步骤 🕹

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

  1. import { Box } from '@mui/material'
  2. async function FooBar() {
  3. return <Box>foobar</Box>
  4. }
  5. export default function Page() {
  6. return (
  7. <Box>
  8. <FooBar />
  9. </Box>
  10. )
  11. }

当前行为 😯

抛出以下错误:
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

  1. 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中起作用:

  1. async function FooBar() {
  2. return <Box>foobar</Box>
  3. }
  4. export default function Page() {
  5. return (
  6. <Box>
  7. <FooBar />
  8. </Box>
  9. )
  10. }
ivqmmu1c

ivqmmu1c3#

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

c6ubokkw

c6ubokkw4#

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

  1. <Box>
  2. <div>
  3. <MyServerComponent />
  4. </div>
  5. </Box>

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

um6iljoc

um6iljoc5#

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

  1. 创建一个 Package 器组件
  1. 'use client';
  2. import React from 'react';
  3. export const ClientToServer: React.FC<{
  4. children: React.ReactNode;
  5. }> = ({ children }) => {
  6. return <>{children}</>;
  7. };
  1. 只需用 Package 器 Package 你的服务器组件
  1. <Box>
  2. <ClientToServer>
  3. <MyServerComponent />
  4. </ClientToServer>
  5. </Box>
展开查看全部
j2cgzkjk

j2cgzkjk6#

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

  1. async function FooBar() {
  2. return <Box>foobar</Box>
  3. }
  4. export default function Page() {
  5. return (
  6. <Box>
  7. <FooBar />
  8. </Box>
  9. )
  10. }

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

展开查看全部
ma8fv8wu

ma8fv8wu8#

我们可以:

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

相关问题