仅当包含 preact 时才会发生这种情况。
重现步骤:
- 运行preact 示例应用程序
- 将 nextjs 的 Head 辅助元素添加到页面
- 给页面一个标题;然后就会发生这种情况。
问题是由标头管理器的方法(updateTitle)引起的。 Preact 的 VNode 仅公开没有子项的 props 的属性,VNode 本身公开子项。
仅当包含 preact 时才会发生这种情况。
重现步骤:
问题是由标头管理器的方法(updateTitle)引起的。 Preact 的 VNode 仅公开没有子项的 props 的属性,VNode 本身公开子项。
我来看看?
好吧,我明白你的意思了。我们读到的component.props.children
是在 中设置的React
,但不是在 中设置的preact
。看起来preact
像是component.children
必须添加到 preact-compat 中的东西。我现在就检查一下?
这里好像已经处理好了?https://github.com/developit/preact-compat/blob/master/src/index.js#L109
@developit 你能看一下吗? ❤️
@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 的行为。在连接之前添加数组检查至少可以避免任何异常。
这是一个公平的观点,我们必须更新它。我可以重现这一点的最小示例是:https://github.com/timneutkens/next-issue-910。在这种情况下,props.children
是未定义的。这就是它记录错误的原因。
啊,完美的@timneutkens 给了我一个很好的重现。看起来添加的位props.children
仅适用于组件 vnode,而不适用于元素 vnode。我们可以快速解决这个问题:)
非常感谢❤️
应固定在preact-compat@3.12.0
非常感谢@developit? ?
谢谢@developit
刚刚确认使用您的复制品(再次感谢顺便说一句!)它实际上现在正在工作:
@developit 也证实了❤️
太棒了,感谢蒂姆的出现!
我看到这个:
我想要一个包含项目符号字符 ( •
) 的页面标题。如果我做:
<Head><title>foo • bar</title></Head>
...然后标题显示为“foo • bar”,因为转义•
为&bull;
.
当我切换到:
<title dangerouslySetInnerHTML={{ __html: "foo • bar" }} />
...标题设置正确,但此错误开始出现在浏览器控制台中,表面上是因为<title></title>
根本没有子项?
ping @timneutkens @rauchg
@atuttle我在更新标题标签时遇到了同样的问题。请问您找到修复或解决方法了吗?坦克先行
每当我在客户端导航时,我都会看到这个问题。如果我进行刷新,则不会发生这种情况,并且页面标题是正确的。
@donaminos 不,尚未提供解决方案或解决方法。在较新版本的 Next 中这可能不是问题,但我还没有机会升级。我只是没有在我的标题中使用任何 HTML 实体,尽管这很烦人。
这会产生任何影响吗?或者现在可以将其视为警告吗?我正在使用angerouslySetInnerHTML 来转义页面服务器渲染中的特殊字符,我认为如果我停止使用它,这并不是什么大问题。但我更喜欢谷歌有漂亮干净的标题。