[vercel/next.js]类型错误:无法读取未定义的属性“join”

2024-05-15 553 views
5

仅当包含 preact 时才会发生这种情况。

重现步骤:

  • 运行preact 示例应用程序
  • 将 nextjs 的 Head 辅助元素添加到页面
  • 给页面一个标题;然后就会发生这种情况。

问题是由标头管理器的方法(updateTitle)引起的。 Preact 的 VNode 仅公开没有子项的 props 的属性,VNode 本身公开子项。

回答

5

我来看看?

3

好吧,我明白你的意思了。我们读到的component.props.children是在 中设置的React,但不是在 中设置的preact。看起来preact像是component.children必须添加到 preact-compat 中的东西。我现在就检查一下?

0

@timneutkens 我刚刚检查过,不确定是否可以重现上述问题 - 这是我设置的 JSFiddle: https://jsfiddle.net/developit/n144pt7m/

不过我可能会复制错误!

FWIW 我不确定L45 是否<HeadManager>考虑了传递单个元素的情况。在 React 中(以及在 preact-compat 中),这将导致成为props.children对虚拟 DOM 元素的引用,而不是数组。

也就是说,这一行:

typeof children==='string' ? children : children.join('')

...如果像这样渲染:

<HeadManager><AnyThing /><HeadManager>

...会抛出异常,因为children是一个对象(VNode),而不是字符串或数组。

在 React 下运行时这似乎也是一个问题,因为这里的 preact-compat 行为只是模仿 React 的行为。在连接之前添加数组检查至少可以避免任何异常。

4

这是一个公平的观点,我们必须更新它。我可以重现这一点的最小示例是:https://github.com/timneutkens/next-issue-910。在这种情况下,props.children是未定义的。这就是它记录错误的原因。

0

啊,完美的@timneutkens 给了我一个很好的重现。看起来添加的位props.children仅适用于组件 vnode,而不适用于元素 vnode。我们可以快速解决这个问题:)

4

非常感谢❤️

7

应固定在preact-compat@3.12.0

0

非常感谢@developit? ?

2

谢谢@developit

3

刚刚确认使用您的复制品(再次感谢顺便说一句!)它实际上现在正在工作:

屏幕截图 2017-01-28 6 12 20 pm
1

@developit 也证实了❤️

6

太棒了,感谢蒂姆的出现!

4

我看到这个:

  • 反应15.6.1
  • 反应 DOM 15.6.1
  • Next.js 3.2.2

我想要一个包含项目符号字符 ( &bull;) 的页面标题。如果我做:

<Head><title>foo &bull; bar</title></Head>

...然后标题显示为“foo • bar”,因为转义&bull;&amp;bull;.

当我切换到:

<title dangerouslySetInnerHTML={{ __html: "foo &bull; bar" }} />

...标题设置正确,但此错误开始出现在浏览器控制台中,表面上是因为<title></title>根本没有子项?

9

ping @timneutkens @rauchg

5

@atuttle我在更新标题标签时遇到了同样的问题。请问您找到修复或解决方法了吗?坦克先行

8

每当我在客户端导航时,我都会看到这个问题。如果我进行刷新,则不会发生这种情况,并且页面标题是正确的。

7

@donaminos 不,尚未提供解决方案或解决方法。在较新版本的 Next 中这可能不是问题,但我还没有机会升级。我只是没有在我的标题中使用任何 HTML 实体,尽管这很烦人。

2

这会产生任何影响吗?或者现在可以将其视为警告吗?我正在使用angerouslySetInnerHTML 来转义页面服务器渲染中的特殊字符,我认为如果我停止使用它,这并不是什么大问题。但我更喜欢谷歌有漂亮干净的标题。