已更新至Chrome v65并开始出现此错误:预期onClick侦听器是一个函数,而不是类型字符串

时间:2018-03-08 21:30:58

标签: javascript reactjs google-chrome onclick minify

我有一个最近开始发出此错误的React应用程序。

https://reactjs.org/docs/error-decoder.html?invariant=94&args[]=onClick&args[]=string

Minified React error #94:

Expected onClick listener to be a function, instead got type string

出现此错误时,我们的按钮/下拉列表都不起作用,但网页未冻结。它只发生在应用程序的一个部分。当我们导航到另一个部分并返回时,错误不再出现。

我已经查看了应用程序中的每个onClick事件,并且没有一个函数可以作为字符串传入或者可以作为字符串返回。虽然我们有几个onClick事件可以传递NULL个对象。

但是我们已经缩小了产生这个错误的步骤:

  1. 只有在我们更新为 Chrome版本65 时才开始发生,这只是2天前发布的。以前的Chrome版本(v65之前)
  2. 不会发生此错误
  3. 它只发生在我们的React应用程序的生成版本中,而不是localhost上(可能是一个缩小错误吗?)
  4. 这个错误不会发生在我们的其他应用程序中,也是使用React构建的,并使用类似的webpack配置进行缩小。
  5. 有没有人知道为什么会发生这种错误以及我们如何解决它?

    Here's a screenshot of the error message in Chrome console

2 个答案:

答案 0 :(得分:3)

事实证明,React的缩小/生产版本与Chrome65不兼容。

我们将process.env.NODE_ENV重新发送回'开发',直到我们找到更好的解决方案,或者Chrome解决了v65的问题。

更新:如果您使用的是来自redux(https://github.com/reactjs/redux/blob/master/docs/recipes/UsingImmutableJS.md#use-a-higher-order-component-to-convert-your-smart-components-immutablejs-props-to-your-dumb-components-javascript-props)的toJS() HOC,则问题出在Object.entries()上。

要暂时解决此问题,请将Object.entries替换为自定义entries功能:

(ES6)

const entries = x => Object.keys(x).reduce((y, z) => y.push([z, x[z]]) && y, []);

您应该可以将NODE_ENV翻转回' production'。

目前正试图找出wrappedComponentProps对象导致问题的原因,但像{ myFunc: function(){} }这样的常规对象并不存在。

(任何帮助调试这将不胜感激!)

在运行delete wrapperComponentProps[ANY-VALID-KEY]之前调用Object.entries()可以解决问题,因此我怀疑它与对象安全性/缓存有关。

答案 1 :(得分:1)

I found a solution. I still think there was an error with Chrome v 65's minification process but I started deleting clickable components from my app until the error was gone to flush out the problematic component.

Turns out it was a <LinkContainer /> from react-bootstrap-router library that was causing the bug. We replaced with react-router link components and the error went away!