window.onerror = function(message, filename, lineno, colno, error) {
console.log(error.stack);
};
没有reactjs
,一切都很好。我可以得到筹码。
使用reactjs
,我得到以下内容:
Uncaught TypeError: Cannot read property 'stack' of null
window.onerror @ index.html:9
ReactErrorUtils.invokeGuardedCallback @ ReactErrorUtils.js:71
executeDispatch @ EventPluginUtils.js:79
executeDispatchesInOrder @ EventPluginUtils.js:102
executeDispatchesAndRelease @ EventPluginHub.js:43
executeDispatchesAndReleaseTopLevel @ EventPluginHub.js:54
forEachAccumulated @ forEachAccumulated.js:23
EventPluginHub.processEventQueue @ EventPluginHub.js:259
runEventQueueInBatch @ ReactEventEmitterMixin.js:18
ReactEventEmitterMixin.handleTopLevel @ ReactEventEmitterMixin.js:34
handleTopLevelWithoutPath @ ReactEventListener.js:93
handleTopLevelImpl @ ReactEventListener.js:73
Mixin.perform @ Transaction.js:136
ReactDefaultBatchingStrategy.batchedUpdates @ ReactDefaultBatchingStrategy.js:62
batchedUpdates @ ReactUpdates.js:94
ReactEventListener.dispatchEvent @ ReactEventListener.js:204
在档案ReactErrorUtils.js
中:
if (process.env.NODE_ENV !== 'production') {
/**
* To help development we can get better devtools integration by simulating a
* real browser event.
*/
if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
var fakeNode = document.createElement('react');
ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) {
var boundFunc = func.bind(null, a, b);
var evtType = 'react-' + name;
fakeNode.addEventListener(evtType, boundFunc, false);
var evt = document.createEvent('Event');
evt.initEvent(evtType, false, false);
// Line 71
fakeNode.dispatchEvent(evt);
fakeNode.removeEventListener(evtType, boundFunc, false);
};
}
}
似乎reactjs
劫持了事件,并发送了缺少错误参数的新事件。
如何从错误中获取堆栈?
答案 0 :(得分:1)
虽然这不应该发生,但可能是React的内部使用的类名与应用程序的类名冲突。我用Google搜索了问题并找到了一个论坛,其中有人通过更改他的班级名称修复了这个问题。
众所周知,React会提供误导性错误或给出令人惊讶的细节(即Invariant Error
)
答案 1 :(得分:1)
来自 React 16 的新更新。
当子组件内部出现错误时,会触发一个新的生命周期方法componentDidCatch。